You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/06/29 16:53:25 UTC

[camel-spring-boot] branch main updated: [CAMEL-9627]to make spring-boot runtime happy (#586)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git


The following commit(s) were added to refs/heads/main by this push:
     new cef3a4b42f9 [CAMEL-9627]to make spring-boot runtime happy (#586)
cef3a4b42f9 is described below

commit cef3a4b42f947369c9659752aa5566a3af0e1de8
Author: Freeman(Yue) Fang <fr...@gmail.com>
AuthorDate: Wed Jun 29 12:53:20 2022 -0400

    [CAMEL-9627]to make spring-boot runtime happy (#586)
---
 .../camel/springboot/catalog/components/cxf.json   |  10 +-
 .../camel/springboot/catalog/components/cxfrs.json |   2 +-
 .../pom.xml                                        |  21 ++-
 .../src/main/docs/cxf-rest.json                    |  63 ++++++++
 .../src/main/docs/cxf.json                         |   0
 .../CxfRsComponentAutoConfiguration.java           |   0
 .../springboot/CxfRsComponentConfiguration.java    |   0
 .../jaxrs/springboot/CxfRsComponentConverter.java  |   0
 .../src/main/resources/META-INF/LICENSE.txt        |   0
 .../src/main/resources/META-INF/NOTICE.txt         |   0
 .../src/main/resources/META-INF/spring.factories   |   2 -
 .../src/main/resources/META-INF/spring.provides    |   2 +-
 .../cxf/jaxrs/testbean/CustomException.java        |  27 ++++
 .../component/cxf/jaxrs/testbean/Customer.java     |  75 ++++++++++
 .../cxf/jaxrs/testbean/CustomerService.java        | 153 ++++++++++++++++++++
 .../testbean/CustomerServiceNoAnnotations.java     |  25 ++++
 .../jaxrs/testbean/CustomerServiceResource.java    |  51 +++++++
 .../component/cxf/jaxrs/testbean/EchoService.java  |  41 ++++++
 .../camel/component/cxf/jaxrs/testbean/Order.java  |  67 +++++++++
 .../component/cxf/jaxrs/testbean/Product.java      |  41 ++++++
 .../component/cxf/jaxrs/testbean/ServiceUtil.java  |  24 ++++
 .../rest/springboot/CxfRsConsumerWithBeanTest.java | 109 ++++++++++++++
 .../rest/springboot/CxfRsProducerSessionTest.java  | 126 ++++++++++++++++
 .../cxf/rest/springboot/CxfRsStreamCacheTest.java  | 160 +++++++++++++++++++++
 .../routes/CxfRsSpringProducerSession.xml          |  53 +++++++
 .../routes/CxfRsSpringProducerSessionRoute.xml     |  59 ++++++++
 .../pom.xml                                        |  46 +++++-
 .../src/main/docs/cxf-soap.json                    |  69 +++++++++
 .../src/main/docs/cxf.json                         |  58 +-------
 .../springboot/CxfComponentAutoConfiguration.java  |   4 +-
 .../springboot/CxfComponentConfiguration.java      |   2 +-
 .../jaxws}/springboot/CxfComponentConverter.java   |   2 +-
 .../src/main/resources/META-INF/LICENSE.txt        |   0
 .../src/main/resources/META-INF/NOTICE.txt         |   0
 .../src/main/resources/META-INF/spring.factories}  |   7 +-
 .../src/main/resources/META-INF/spring.provides    |   2 +-
 .../camel/component/cxf/jaxws/HelloService.java    |  34 +++++
 .../cxf/soap/springboot/CXFMultiPartTest.java      | 106 ++++++++++++++
 .../soap/springboot/CxfConsumerMessageTest.java    | 137 ++++++++++++++++++
 .../CxfConsumerPayLoadConverterTest.java           |  98 +++++++++++++
 .../soap/springboot/CxfConsumerPayloadTest.java    | 135 +++++++++++++++++
 .../soap/springboot/CxfConsumerProviderTest.java   | 129 +++++++++++++++++
 .../cxf/soap/springboot/MultiPartInvokeImpl.java   |  52 +++++++
 .../cxf/soap/springboot/ServiceProvider.java       |  34 +++++
 .../springboot/WriteXmlDeclarationInterceptor.java |  38 +++++
 .../src/test/resources/MultiPartTest.wsdl          |  56 ++++++++
 .../src/test/resources/routes/MultiPartTest.xml    |  53 +++++++
 .../src/test/resources/routes/multipartRoute.xml   |  27 ++++
 .../camel-cxf-transport-starter/pom.xml            |   2 +-
 components-starter/camel-soap-starter/pom.xml      |   8 +-
 components-starter/pom.xml                         |   3 +-
 tooling/camel-spring-boot-bom/pom.xml              |   7 +-
 tooling/camel-spring-boot-dependencies/pom.xml     |   7 +-
 53 files changed, 2146 insertions(+), 81 deletions(-)

diff --git a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxf.json b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxf.json
index 43a23b95b0c..9a641827625 100644
--- a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxf.json
+++ b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxf.json
@@ -7,10 +7,10 @@
     "deprecated": false,
     "firstVersion": "1.0.0",
     "label": "soap,webservice",
-    "javaType": "org.apache.camel.component.cxf.CxfComponent",
+    "javaType": "org.apache.camel.component.cxf.jaxws.CxfComponent",
     "supportLevel": "Stable",
     "groupId": "org.apache.camel.springboot",
-    "artifactId": "camel-cxf-starter",
+    "artifactId": "camel-cxf-soap-starter",
     "version": "3.18.0-SNAPSHOT",
     "scheme": "cxf",
     "extendsScheme": "",
@@ -40,7 +40,7 @@
   "properties": {
     "beanId": { "kind": "path", "displayName": "Bean Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To lookup an existing configured CxfEndpoint. Must used bean: as prefix." },
     "address": { "kind": "path", "displayName": "Address", "group": "service", "label": "service", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The service publish address." },
-    "dataFormat": { "kind": "parameter", "displayName": "Data Format", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.DataFormat", "enum": [ "PAYLOAD", "RAW", "MESSAGE", "CXF_MESSAGE", "POJO" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "POJO", "description": "The data type messages supported by the CXF endpoint." },
+    "dataFormat": { "kind": "parameter", "displayName": "Data Format", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.common.DataFormat", "enum": [ "PAYLOAD", "RAW", "MESSAGE", "CXF_MESSAGE", "POJO" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "POJO", "description": "The data type messages supported by the CXF endpoint." },
     "wrappedStyle": { "kind": "parameter", "displayName": "Wrapped Style", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "The WSDL style that describes how parameters are represented in the SOAP body. If the value is false, CXF will chose the document-literal unwrapped style, If the value is true, CXF will chose the document-literal wrapped style" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now [...]
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
@@ -56,8 +56,8 @@
     "allowStreaming": { "kind": "parameter", "displayName": "Allow Streaming", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "description": "This option controls whether the CXF component, when running in PAYLOAD mode, will DOM parse the incoming messages into DOM Elements or keep the payload as a javax.xml.transform.Source object that would allow streaming in some [...]
     "bus": { "kind": "parameter", "displayName": "Bus", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.cxf.Bus", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom configured CXF Bus." },
     "continuationTimeout": { "kind": "parameter", "displayName": "Continuation Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "30000", "description": "This option is used to set the CXF continuation timeout which could be used in CxfConsumer by default when the CXF server is using Jetty or Servlet transport." },
-    "cxfBinding": { "kind": "parameter", "displayName": "Cxf Binding", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.CxfBinding", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom CxfBinding to control the binding between Camel Message and CXF Message." },
-    "cxfConfigurer": { "kind": "parameter", "displayName": "Cxf Configurer", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.CxfConfigurer", "deprecated": false, "autowired": false, "secret": false, "description": "This option could apply the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer which supports to configure the CXF endpoint in programmatic way. User can configure the CXF server and [...]
+    "cxfBinding": { "kind": "parameter", "displayName": "Cxf Binding", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.common.CxfBinding", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom CxfBinding to control the binding between Camel Message and CXF Message." },
+    "cxfConfigurer": { "kind": "parameter", "displayName": "Cxf Configurer", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.cxf.jaxws.CxfConfigurer", "deprecated": false, "autowired": false, "secret": false, "description": "This option could apply the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer which supports to configure the CXF endpoint in programmatic way. User can configure the CXF serv [...]
     "defaultBus": { "kind": "parameter", "displayName": "Default Bus", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will set the default bus when CXF endpoint create a bus by itself" },
     "headerFilterStrategy": { "kind": "parameter", "displayName": "Header Filter Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom HeaderFilterStrategy to filter header to and from Camel message." },
     "mergeProtocolHeaders": { "kind": "parameter", "displayName": "Merge Protocol Headers", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to merge protocol headers. If enabled then propagating headers between Camel and CXF becomes more consistent and similar. For more details see CAMEL-6393." },
diff --git a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxfrs.json b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxfrs.json
index 4f6b36c1444..79373a290b6 100644
--- a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxfrs.json
+++ b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/cxfrs.json
@@ -10,7 +10,7 @@
     "javaType": "org.apache.camel.component.cxf.jaxrs.CxfRsComponent",
     "supportLevel": "Stable",
     "groupId": "org.apache.camel.springboot",
-    "artifactId": "camel-cxf-starter",
+    "artifactId": "camel-cxf-rest-starter",
     "version": "3.18.0-SNAPSHOT",
     "scheme": "cxfrs",
     "extendsScheme": "",
diff --git a/components-starter/camel-cxf-starter/pom.xml b/components-starter/camel-cxf-rest-starter/pom.xml
similarity index 75%
copy from components-starter/camel-cxf-starter/pom.xml
copy to components-starter/camel-cxf-rest-starter/pom.xml
index 17ded9eb7c2..c17cfcdeb4f 100644
--- a/components-starter/camel-cxf-starter/pom.xml
+++ b/components-starter/camel-cxf-rest-starter/pom.xml
@@ -24,7 +24,7 @@
     <artifactId>components-starter</artifactId>
     <version>3.18.0-SNAPSHOT</version>
   </parent>
-  <artifactId>camel-cxf-starter</artifactId>
+  <artifactId>camel-cxf-rest-starter</artifactId>
   <packaging>jar</packaging>
   <name>Camel SB Starters :: CXF</name>
   <description>Spring-Boot Starter for Camel CXF support</description>
@@ -36,9 +36,26 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
-      <artifactId>camel-cxf</artifactId>
+      <artifactId>camel-cxf-spring-rest</artifactId>
       <version>${camel-version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-http-undertow</artifactId>
+      <version>${cxf-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-http</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>cglib</groupId>
+      <artifactId>cglib-nodep</artifactId>
+      <version>${cglib-version}</version>
+      <scope>test</scope>
+    </dependency>
     <!--START OF GENERATED CODE-->
     <dependency>
       <groupId>org.apache.camel.springboot</groupId>
diff --git a/components-starter/camel-cxf-rest-starter/src/main/docs/cxf-rest.json b/components-starter/camel-cxf-rest-starter/src/main/docs/cxf-rest.json
new file mode 100644
index 00000000000..6a1481c233b
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/main/docs/cxf-rest.json
@@ -0,0 +1,63 @@
+{
+  "groups": [
+    {
+      "name": "camel.component.cxfrs",
+      "type": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxfrs.customizer",
+      "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "sourceMethod": "getCustomizer()"
+    }
+  ],
+  "properties": [
+    {
+      "name": "camel.component.cxfrs.autowired-enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "defaultValue": true
+    },
+    {
+      "name": "camel.component.cxfrs.bridge-error-handler",
+      "type": "java.lang.Boolean",
+      "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored.",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "defaultValue": false
+    },
+    {
+      "name": "camel.component.cxfrs.customizer.enabled",
+      "type": "java.lang.Boolean",
+      "sourceType": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties"
+    },
+    {
+      "name": "camel.component.cxfrs.enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether to enable auto configuration of the cxfrs component. This is enabled by default.",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxfrs.header-filter-strategy",
+      "type": "org.apache.camel.spi.HeaderFilterStrategy",
+      "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. The option is a org.apache.camel.spi.HeaderFilterStrategy type.",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxfrs.lazy-start-producer",
+      "type": "java.lang.Boolean",
+      "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the [...]
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "defaultValue": false
+    },
+    {
+      "name": "camel.component.cxfrs.use-global-ssl-context-parameters",
+      "type": "java.lang.Boolean",
+      "description": "Enable usage of global SSL context parameters.",
+      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
+      "defaultValue": false
+    }
+  ],
+  "hints": []
+}
\ No newline at end of file
diff --git a/components-starter/camel-cxf-starter/src/main/docs/cxf.json b/components-starter/camel-cxf-rest-starter/src/main/docs/cxf.json
similarity index 100%
copy from components-starter/camel-cxf-starter/src/main/docs/cxf.json
copy to components-starter/camel-cxf-rest-starter/src/main/docs/cxf.json
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentAutoConfiguration.java b/components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentAutoConfiguration.java
similarity index 100%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentAutoConfiguration.java
rename to components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentAutoConfiguration.java
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConfiguration.java b/components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConfiguration.java
similarity index 100%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConfiguration.java
rename to components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConfiguration.java
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConverter.java b/components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConverter.java
similarity index 100%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConverter.java
rename to components-starter/camel-cxf-rest-starter/src/main/java/org/apache/camel/component/cxf/jaxrs/springboot/CxfRsComponentConverter.java
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/LICENSE.txt b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/LICENSE.txt
similarity index 100%
copy from components-starter/camel-cxf-starter/src/main/resources/META-INF/LICENSE.txt
copy to components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/LICENSE.txt
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/NOTICE.txt b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/NOTICE.txt
similarity index 100%
copy from components-starter/camel-cxf-starter/src/main/resources/META-INF/NOTICE.txt
copy to components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/NOTICE.txt
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.factories b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.factories
similarity index 89%
rename from components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.factories
rename to components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.factories
index 809d734871c..dc778af6688 100644
--- a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.factories
+++ b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.factories
@@ -15,10 +15,8 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.apache.camel.component.cxf.springboot.CxfComponentAutoConfiguration,\
 org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentAutoConfiguration,\
 org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConverter,\
-org.apache.camel.component.cxf.springboot.CxfComponentConverter
 
 
 
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.provides
similarity index 97%
copy from components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
copy to components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.provides
index fbd6fbf20a1..67fb997b5e8 100644
--- a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
+++ b/components-starter/camel-cxf-rest-starter/src/main/resources/META-INF/spring.provides
@@ -14,4 +14,4 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-provides: camel-cxf
+provides: camel-cxf-rest
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomException.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomException.java
new file mode 100644
index 00000000000..1b34d8d6bf5
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomException.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+public class CustomException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public CustomException(String message) {
+        super(message);
+    }
+
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Customer.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Customer.java
new file mode 100644
index 00000000000..e0b740c8761
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Customer.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.util.ObjectHelper;
+
+@XmlRootElement(name = "Customer")
+public class Customer {
+    private long id;
+    private String name;
+
+    public Customer() {
+    }
+
+    public Customer(long id, String name) {
+        setId(id);
+        setName(name);
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (int) (id ^ (id >>> 32));
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Customer)) {
+            return false;
+        }
+
+        if (this == obj) {
+            return true;
+        }
+
+        Customer other = (Customer) obj;
+        return id == other.id && ObjectHelper.equal(name, other.name);
+    }
+
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java
new file mode 100644
index 00000000000..c30fd82dd79
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+
+import org.apache.cxf.common.util.StringUtils;
+
+@Path("/customerservice/")
+public class CustomerService {
+    private final AtomicLong currentId = new AtomicLong(123L);
+    private final Map<Long, Customer> customers = new ConcurrentHashMap<>();
+    private final Map<Long, Order> orders = new ConcurrentHashMap<>();
+
+    public CustomerService() {
+        init();
+    }
+
+    @GET
+    @Path("/customers/{id}/")
+    public Customer getCustomer(@PathParam("id") String id) {
+        long idNumber = Long.parseLong(id);
+        Customer c = customers.get(idNumber);
+        return c;
+    }
+
+    @GET
+    @Path("/customers")
+    public Customer getCustomerByQueryParam(@QueryParam("id") String id) {
+        long idNumber = Long.parseLong(id);
+        Customer c = customers.get(idNumber);
+        return c;
+    }
+
+    @GET
+    @Path("/customers/")
+    @Produces("application/xml")
+    public List<Customer> getCustomers() {
+        List<Customer> list = new ArrayList<>(customers.values());
+        return list;
+    }
+
+    @PUT
+    @Path("/customers/")
+    public Response updateCustomer(Customer customer) {
+        Customer c = customers.get(customer.getId());
+        Response r;
+        if (c != null) {
+            customers.put(customer.getId(), customer);
+            r = Response.ok().build();
+        } else {
+            r = Response.status(406).entity("Cannot find the customer!").build();
+        }
+
+        return r;
+    }
+
+    @POST
+    @Path("/customers/")
+    public Response addCustomer(Customer customer) {
+        if (StringUtils.isEmpty(customer.getName())) {
+            return Response.status(422).build();
+        }
+
+        customer.setId(currentId.incrementAndGet());
+
+        customers.put(customer.getId(), customer);
+
+        return Response.ok(customer).build();
+    }
+
+    @POST
+    @Path("/customersUniqueResponseCode/")
+    public Response addCustomerUniqueResponseCode(Customer customer) {
+        customer.setId(currentId.incrementAndGet());
+
+        customers.put(customer.getId(), customer);
+
+        return Response.status(201).entity(customer).build();
+    }
+
+    @DELETE
+    @Path("/customers/{id}/")
+    public Response deleteCustomer(@PathParam("id") String id) {
+        long idNumber = Long.parseLong(id);
+        Customer c = customers.get(idNumber);
+
+        Response r;
+        if (c != null) {
+            r = Response.ok().build();
+            customers.remove(idNumber);
+        } else {
+            r = Response.notModified().build();
+        }
+        if (idNumber == currentId.get()) {
+            currentId.decrementAndGet();
+        }
+        return r;
+    }
+
+    @Path("/orders/{orderId}/")
+    public Order getOrder(@PathParam("orderId") String orderId) {
+        long idNumber = Long.parseLong(orderId);
+        Order c = orders.get(idNumber);
+        return c;
+    }
+
+    final void init() {
+        Customer c = new Customer();
+        c.setName("John");
+        c.setId(123);
+        customers.put(c.getId(), c);
+
+        c = new Customer();
+        c.setName("Dan");
+        c.setId(113);
+        customers.put(c.getId(), c);
+
+        Order o = new Order();
+        o.setDescription("order 223");
+        o.setId(223);
+        orders.put(o.getId(), o);
+    }
+
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceNoAnnotations.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceNoAnnotations.java
new file mode 100644
index 00000000000..fa9a395cb96
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceNoAnnotations.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+// START SNIPPET: example
+public interface CustomerServiceNoAnnotations {
+
+    Customer getCustomer(String id);
+
+}
+// END SNIPPET: example
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java
new file mode 100644
index 00000000000..e36313746a1
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+// START SNIPPET: example
+@Path("/customerservice/")
+public interface CustomerServiceResource {
+
+    @GET
+    @Path("/customers/{id}/")
+    Customer getCustomer(@PathParam("id") String id);
+
+    @PUT
+    @Path("/customers/")
+    Response updateCustomer(Customer customer);
+
+    @Path("/{id}")
+    @PUT()
+    @Consumes({
+            "application/xml", "text/plain",
+            "application/json" })
+    @Produces({
+            "application/xml", "text/plain",
+            "application/json" })
+    Object invoke(
+            @PathParam("id") String id,
+            String payload);
+}
+// END SNIPPET: example
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/EchoService.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/EchoService.java
new file mode 100644
index 00000000000..abba335cd10
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/EchoService.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.NewCookie;
+import javax.ws.rs.core.Response;
+
+@Path("/echoservice/")
+public class EchoService {
+    @Context
+    private HttpHeaders headers;
+
+    @POST
+    @Path("/echo/")
+    public Response echo(String string) {
+        Cookie fooCookie = headers.getCookies().get("foo");
+        if (fooCookie != null && "bar".equals(fooCookie.getValue())) {
+            return Response.ok("Old " + string).build();
+        }
+        return Response.ok("New " + string).cookie(new NewCookie("foo", "bar", "/", null, 1, null, -1, false)).build();
+    }
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Order.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Order.java
new file mode 100644
index 00000000000..0ac90a8e5bc
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Order.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Order")
+public class Order {
+    private long id;
+    private String description;
+    private Map<Long, Product> products = new HashMap<>();
+
+    public Order() {
+        init();
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String d) {
+        this.description = d;
+    }
+
+    @GET
+    @Path("products/{productId}/")
+    public Product getProduct(@PathParam("productId") int productId) {
+        Product p = products.get(Long.valueOf(productId));
+        return p;
+    }
+
+    final void init() {
+        Product p = new Product();
+        p.setId(323);
+        p.setDescription("product 323");
+        products.put(p.getId(), p);
+    }
+
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Product.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Product.java
new file mode 100644
index 00000000000..d363af1055e
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/Product.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Product")
+public class Product {
+    private long id;
+    private String description;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String d) {
+        this.description = d;
+    }
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/ServiceUtil.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/ServiceUtil.java
new file mode 100644
index 00000000000..0e2a1b85f45
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/ServiceUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxrs.testbean;
+
+public class ServiceUtil {
+    public String invoke(String id, String payload) {
+        return id + payload;
+    }
+
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsConsumerWithBeanTest.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsConsumerWithBeanTest.java
new file mode 100644
index 00000000000..58b63dc49f8
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsConsumerWithBeanTest.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.rest.springboot;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxrs.testbean.ServiceUtil;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfRsConsumerWithBeanTest.class,
+        CxfRsConsumerWithBeanTest.TestConfiguration.class
+    }
+)
+public class CxfRsConsumerWithBeanTest {
+
+    private static final String CXT = CXFTestSupport.getPort1() + "/CxfRsConsumerWithBeanTest";
+    private static final String CXF_RS_ENDPOINT_URI
+            = "cxfrs://http://localhost:" + CXT
+              + "/rest?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource";
+    private static final String CXF_RS_ENDPOINT_URI_2
+            = "cxfrs://http://localhost:" + CXT
+              + "/rest2?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource";
+
+    @Bean("service")
+    protected ServiceUtil bindToRegistry() {
+        return new ServiceUtil();
+    }
+    
+    @Test
+    public void testPutConsumer() throws Exception {
+        sendPutRequest("http://localhost:" + CXT + "/rest/customerservice/c20");
+        sendPutRequest("http://localhost:" + CXT + "/rest2/customerservice/c20");
+    }
+
+    private void sendPutRequest(String uri) throws Exception {
+        HttpPut put = new HttpPut(uri);
+        StringEntity entity = new StringEntity("string");
+        entity.setContentType("text/plain");
+        put.setEntity(entity);
+        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
+
+        try {
+            HttpResponse response = httpclient.execute(put);
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("c20string", EntityUtils.toString(response.getEntity()));
+        } finally {
+            httpclient.close();
+        }
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+
+                    from(CXF_RS_ENDPOINT_URI).to("bean://service?method=invoke(${body[0]}, ${body[1]})");
+                    from(CXF_RS_ENDPOINT_URI_2).bean(ServiceUtil.class, "invoke(${body[0]}, ${body[1]})");
+                }
+            };
+        }
+    }
+    
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsProducerSessionTest.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsProducerSessionTest.java
new file mode 100644
index 00000000000..d44fcb7b514
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsProducerSessionTest.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.rest.springboot;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfRsProducerSessionTest.class
+    },
+    properties = {
+              "camel.springboot.routes-include-pattern=file:src/test/resources/routes/CxfRsSpringProducerSessionRoute.xml"}
+)
+    
+@ImportResource({
+                 "classpath:routes/CxfRsSpringProducerSession.xml"
+})
+public class CxfRsProducerSessionTest {
+
+    private static int port1 = 12261;
+    private static int port2 = 12262;
+
+    public int getPort1() {
+        return port1;
+    }
+
+    public int getPort2() {
+        return port2;
+    }
+
+    @Test
+    public void testNoSessionProxy() {
+        String response = sendMessage("direct://proxy", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("New New World", response);
+        response = sendMessage("direct://proxy", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("New New World", response);
+    }
+
+    @Test
+    public void testExchangeSessionProxy() {
+        String response = sendMessage("direct://proxyexchange", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("Old New World", response);
+        response = sendMessage("direct://proxyexchange", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("Old New World", response);
+    }
+
+    @Test
+    public void testInstanceSession() {
+        String response = sendMessage("direct://proxyinstance", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("Old New World", response);
+        response = sendMessage("direct://proxyinstance", "World", Boolean.FALSE).getMessage().getBody(String.class);
+        assertEquals("Old Old World", response);
+        // we do the instance tests for proxy and http in one test because order
+        // matters here
+        response = sendMessage("direct://httpinstance", "World", Boolean.TRUE).getMessage().getBody(String.class);
+        assertEquals("Old Old World", response);
+    }
+
+    @Test
+    public void testNoSessionHttp() {
+        String response = sendMessage("direct://http", "World", Boolean.TRUE).getMessage().getBody(String.class);
+        assertEquals("New New World", response);
+        response = sendMessage("direct://http", "World", Boolean.TRUE).getMessage().getBody(String.class);
+        assertEquals("New New World", response);
+    }
+
+    @Test
+    public void testExchangeSessionHttp() {
+        String response = sendMessage("direct://httpexchange", "World", Boolean.TRUE).getMessage().getBody(String.class);
+        assertEquals("Old New World", response);
+        response = sendMessage("direct://httpexchange", "World", Boolean.TRUE).getMessage().getBody(String.class);
+        assertEquals("Old New World", response);
+    }
+
+    @Autowired
+    ProducerTemplate template;
+    
+    private Exchange sendMessage(String endpoint, String body, Boolean httpApi) {
+        Exchange exchange = template.send(endpoint, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                Message inMessage = exchange.getIn();
+                inMessage.setHeader(CxfConstants.OPERATION_NAME, "echo");
+                inMessage.setHeader(Exchange.HTTP_METHOD, "POST");
+                inMessage.setHeader(Exchange.HTTP_PATH, "/echoservice/echo");
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, httpApi);
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, String.class);
+                inMessage.setBody(body);
+            }
+        });
+        return exchange;
+    }
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsStreamCacheTest.java b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsStreamCacheTest.java
new file mode 100644
index 00000000000..e6e6cbef15a
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsStreamCacheTest.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.rest.springboot;
+
+
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedExchange;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxrs.testbean.Customer;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.converter.stream.CachedOutputStream;
+import org.apache.camel.spi.Synchronization;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfRsStreamCacheTest.class,
+        CxfRsStreamCacheTest.TestConfiguration.class
+    }
+)
+public class CxfRsStreamCacheTest {
+
+    private static final String PUT_REQUEST = "<Customer><name>Mary</name><id>123</id></Customer>";
+    private static final String CONTEXT = "/CxfRsStreamCacheTest";
+    private static final String CXT = CXFTestSupport.getPort1() + CONTEXT;
+    private static final String RESPONSE = "<pong xmlns=\"test/service\"/>";
+
+    private String cxfRsEndpointUri = "cxfrs://http://localhost:" + CXT + "/rest?synchronous=" + isSynchronous()
+                                      + "&dataFormat=PAYLOAD&resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerService";
+
+    @Autowired
+    ProducerTemplate template;
+    
+    @EndpointInject("mock:result")
+    MockEndpoint mock;
+    
+    @EndpointInject("mock:onComplete")
+    MockEndpoint onComplete;
+    
+    @Test
+    public void testPutConsumer() throws Exception {
+        
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(Customer.class);
+
+        
+        onComplete.expectedMessageCount(1);
+
+        HttpPut put = new HttpPut("http://localhost:" + CXT + "/rest/customerservice/customers");
+        StringEntity entity = new StringEntity(PUT_REQUEST, "ISO-8859-1");
+        entity.setContentType("text/xml; charset=ISO-8859-1");
+        put.addHeader("test", "header1;header2");
+        put.setEntity(entity);
+        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
+
+        try {
+            HttpResponse response = httpclient.execute(put);
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals(RESPONSE, EntityUtils.toString(response.getEntity()));
+        } finally {
+            httpclient.close();
+        }
+
+        mock.assertIsSatisfied();
+        onComplete.assertIsSatisfied();
+
+    }
+
+    protected boolean isSynchronous() {
+        return false;
+    }
+
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+
+                    getContext().setStreamCaching(true);
+                    getContext().getStreamCachingStrategy().setSpoolThreshold(1L);
+                    errorHandler(noErrorHandler());
+
+                    from(cxfRsEndpointUri)
+                            // should be able to convert to Customer
+                            .convertBodyTo(Customer.class)
+                            .to("mock:result")
+                            .process(exchange -> {
+                                // respond with OK
+                                CachedOutputStream cos = new CachedOutputStream(exchange);
+                                cos.write(RESPONSE.getBytes("UTF-8"));
+                                cos.close();
+                                exchange.getMessage().setBody(cos.newStreamCache());
+
+                                exchange.adapt(ExtendedExchange.class).addOnCompletion(new Synchronization() {
+                                    @Override
+                                    public void onComplete(Exchange exchange) {
+                                        template.sendBody("mock:onComplete", "");
+                                    }
+
+                                    @Override
+                                    public void onFailure(Exchange exchange) {
+
+                                    }
+                                });
+                            });
+
+                }
+            };
+        }
+    }
+    
+}
diff --git a/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSession.xml b/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSession.xml
new file mode 100644
index 00000000000..92c38fe974c
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSession.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf/jaxrs"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
+       http://camel.apache.org/schema/cxf/jaxrs http://camel.apache.org/schema/cxf/jaxrs/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+
+  <jaxrs:server id="restService"
+		        address="http://127.0.0.1:12261/CxfRsProducerSessionTest/" 
+		        staticSubresourceResolution="true">
+    <jaxrs:serviceBeans>
+      <ref bean="echoService"/>
+    </jaxrs:serviceBeans>       
+  </jaxrs:server>
+  
+  <bean id="echoService" class="org.apache.camel.component.cxf.jaxrs.testbean.EchoService" />
+
+  <cxf:rsClient id="rsClientProxy" address="http://127.0.0.1:12261/CxfRsProducerSessionTest/"
+    serviceClass="org.apache.camel.component.cxf.jaxrs.testbean.EchoService"
+    loggingFeatureEnabled="true" />
+   
+  <cxf:rsClient id="rsClientHttp" address="http://127.0.0.1:12261/CxfRsProducerSessionTest/"/>
+
+
+  <bean id="instanceCookieHandler" class="org.apache.camel.http.base.cookie.InstanceCookieHandler"/>
+  <bean id="exchangeCookieHandler" class="org.apache.camel.http.base.cookie.ExchangeCookieHandler"/>
+</beans>
diff --git a/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSessionRoute.xml b/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSessionRoute.xml
new file mode 100644
index 00000000000..76a87228f48
--- /dev/null
+++ b/components-starter/camel-cxf-rest-starter/src/test/resources/routes/CxfRsSpringProducerSessionRoute.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+
+    <!-- START SNIPPET: e1 -->
+  <routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+       <from uri="direct://proxy"/>
+       <to uri="cxfrs://bean://rsClientProxy?synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientProxy?synchronous=true"/>
+    </route>
+    <route>
+       <from uri="direct://proxyinstance"/>
+       <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#instanceCookieHandler&amp;synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#instanceCookieHandler&amp;synchronous=true"/>
+    </route>
+    <route>
+       <from uri="direct://proxyexchange"/>
+       <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#exchangeCookieHandler&amp;synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#exchangeCookieHandler&amp;synchronous=true"/>
+    </route>
+    <route>
+       <from uri="direct://http"/>
+       <to uri="cxfrs://bean://rsClientHttp?synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientHttp?synchronous=true"/>
+    </route>
+    <route>
+       <from uri="direct://httpinstance"/>
+       <to uri="cxfrs://bean://rsClientHttp?cookieHandler=#instanceCookieHandler&amp;synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientHttp?cookieHandler=#instanceCookieHandler&amp;synchronous=true"/>
+    </route>
+    <route>
+       <from uri="direct://httpexchange"/>
+       <to uri="cxfrs://bean://rsClientHttp?cookieHandler=#exchangeCookieHandler&amp;synchronous=true"/>
+       <convertBodyTo type="java.lang.String"/>
+       <to uri="cxfrs://bean://rsClientHttp?cookieHandler=#exchangeCookieHandler&amp;synchronous=true"/>
+    </route>
+  </routes>
diff --git a/components-starter/camel-cxf-starter/pom.xml b/components-starter/camel-cxf-soap-starter/pom.xml
similarity index 56%
rename from components-starter/camel-cxf-starter/pom.xml
rename to components-starter/camel-cxf-soap-starter/pom.xml
index 17ded9eb7c2..b15c4ded1cb 100644
--- a/components-starter/camel-cxf-starter/pom.xml
+++ b/components-starter/camel-cxf-soap-starter/pom.xml
@@ -24,7 +24,7 @@
     <artifactId>components-starter</artifactId>
     <version>3.18.0-SNAPSHOT</version>
   </parent>
-  <artifactId>camel-cxf-starter</artifactId>
+  <artifactId>camel-cxf-soap-starter</artifactId>
   <packaging>jar</packaging>
   <name>Camel SB Starters :: CXF</name>
   <description>Spring-Boot Starter for Camel CXF support</description>
@@ -36,9 +36,20 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
-      <artifactId>camel-cxf</artifactId>
+      <artifactId>camel-cxf-spring-soap</artifactId>
       <version>${camel-version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-http-undertow</artifactId>
+      <version>${cxf-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-http</artifactId>
+      <scope>test</scope>
+    </dependency>
     <!--START OF GENERATED CODE-->
     <dependency>
       <groupId>org.apache.camel.springboot</groupId>
@@ -46,4 +57,35 @@
     </dependency>
     <!--END OF GENERATED CODE-->
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.cxf</groupId>
+        <artifactId>cxf-codegen-plugin</artifactId>
+        <version>${cxf-version}</version>
+        <executions>
+          <execution>
+            <id>generate-sources</id>
+            <phase>generate-sources</phase>
+            <configuration>
+              <fork>${cxf.codegenplugin.forkmode}</fork>
+              <additionalJvmArgs>${cxf.codegen.jvmArgs}</additionalJvmArgs>
+              <testSourceRoot>${basedir}/target/generated/src/test/java</testSourceRoot>
+              <defaultOptions>
+                <frontEnd>jaxws21</frontEnd>
+              </defaultOptions>
+              <wsdlOptions>
+                <wsdlOption>
+                  <wsdl>${basedir}/src/test/resources/MultiPartTest.wsdl</wsdl>
+                </wsdlOption>
+              </wsdlOptions>
+            </configuration>
+            <goals>
+              <goal>wsdl2java</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/components-starter/camel-cxf-soap-starter/src/main/docs/cxf-soap.json b/components-starter/camel-cxf-soap-starter/src/main/docs/cxf-soap.json
new file mode 100644
index 00000000000..af3ebb0a3d1
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/main/docs/cxf-soap.json
@@ -0,0 +1,69 @@
+{
+  "groups": [
+    {
+      "name": "camel.component.cxf",
+      "type": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxf.customizer",
+      "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "sourceMethod": "getCustomizer()"
+    }
+  ],
+  "properties": [
+    {
+      "name": "camel.component.cxf.allow-streaming",
+      "type": "java.lang.Boolean",
+      "description": "This option controls whether the CXF component, when running in PAYLOAD mode, will DOM parse the incoming messages into DOM Elements or keep the payload as a javax.xml.transform.Source object that would allow streaming in some cases.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxf.autowired-enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "defaultValue": true
+    },
+    {
+      "name": "camel.component.cxf.bridge-error-handler",
+      "type": "java.lang.Boolean",
+      "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "defaultValue": false
+    },
+    {
+      "name": "camel.component.cxf.customizer.enabled",
+      "type": "java.lang.Boolean",
+      "sourceType": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties"
+    },
+    {
+      "name": "camel.component.cxf.enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether to enable auto configuration of the cxf component. This is enabled by default.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxf.header-filter-strategy",
+      "type": "org.apache.camel.spi.HeaderFilterStrategy",
+      "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. The option is a org.apache.camel.spi.HeaderFilterStrategy type.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration"
+    },
+    {
+      "name": "camel.component.cxf.lazy-start-producer",
+      "type": "java.lang.Boolean",
+      "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the [...]
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "defaultValue": false
+    },
+    {
+      "name": "camel.component.cxf.use-global-ssl-context-parameters",
+      "type": "java.lang.Boolean",
+      "description": "Enable usage of global SSL context parameters.",
+      "sourceType": "org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConfiguration",
+      "defaultValue": false
+    }
+  ],
+  "hints": []
+}
\ No newline at end of file
diff --git a/components-starter/camel-cxf-starter/src/main/docs/cxf.json b/components-starter/camel-cxf-soap-starter/src/main/docs/cxf.json
similarity index 52%
rename from components-starter/camel-cxf-starter/src/main/docs/cxf.json
rename to components-starter/camel-cxf-soap-starter/src/main/docs/cxf.json
index fc6a3a0330d..30dd2efb94b 100644
--- a/components-starter/camel-cxf-starter/src/main/docs/cxf.json
+++ b/components-starter/camel-cxf-soap-starter/src/main/docs/cxf.json
@@ -10,17 +10,6 @@
       "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
       "sourceType": "org.apache.camel.component.cxf.springboot.CxfComponentConfiguration",
       "sourceMethod": "getCustomizer()"
-    },
-    {
-      "name": "camel.component.cxfrs",
-      "type": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
-    },
-    {
-      "name": "camel.component.cxfrs.customizer",
-      "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "sourceMethod": "getCustomizer()"
     }
   ],
   "properties": [
@@ -74,52 +63,7 @@
       "description": "Enable usage of global SSL context parameters.",
       "sourceType": "org.apache.camel.component.cxf.springboot.CxfComponentConfiguration",
       "defaultValue": false
-    },
-    {
-      "name": "camel.component.cxfrs.autowired-enabled",
-      "type": "java.lang.Boolean",
-      "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "defaultValue": true
-    },
-    {
-      "name": "camel.component.cxfrs.bridge-error-handler",
-      "type": "java.lang.Boolean",
-      "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored.",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "defaultValue": false
-    },
-    {
-      "name": "camel.component.cxfrs.customizer.enabled",
-      "type": "java.lang.Boolean",
-      "sourceType": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties"
-    },
-    {
-      "name": "camel.component.cxfrs.enabled",
-      "type": "java.lang.Boolean",
-      "description": "Whether to enable auto configuration of the cxfrs component. This is enabled by default.",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
-    },
-    {
-      "name": "camel.component.cxfrs.header-filter-strategy",
-      "type": "org.apache.camel.spi.HeaderFilterStrategy",
-      "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. The option is a org.apache.camel.spi.HeaderFilterStrategy type.",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration"
-    },
-    {
-      "name": "camel.component.cxfrs.lazy-start-producer",
-      "type": "java.lang.Boolean",
-      "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the [...]
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "defaultValue": false
-    },
-    {
-      "name": "camel.component.cxfrs.use-global-ssl-context-parameters",
-      "type": "java.lang.Boolean",
-      "description": "Enable usage of global SSL context parameters.",
-      "sourceType": "org.apache.camel.component.cxf.jaxrs.springboot.CxfRsComponentConfiguration",
-      "defaultValue": false
     }
   ],
   "hints": []
-}
\ No newline at end of file
+}
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentAutoConfiguration.java b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentAutoConfiguration.java
similarity index 96%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentAutoConfiguration.java
rename to components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentAutoConfiguration.java
index 50da779966b..5018d3bc2e4 100644
--- a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentAutoConfiguration.java
+++ b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentAutoConfiguration.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.springboot;
+package org.apache.camel.component.cxf.jaxws.springboot;
 
 import javax.annotation.Generated;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
-import org.apache.camel.component.cxf.CxfComponent;
+import org.apache.camel.component.cxf.jaxws.CxfComponent;
 import org.apache.camel.spi.ComponentCustomizer;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 import org.apache.camel.spring.boot.ComponentConfigurationProperties;
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConfiguration.java b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConfiguration.java
similarity index 98%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConfiguration.java
rename to components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConfiguration.java
index a933b0b15de..6f3ea59204f 100644
--- a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConfiguration.java
+++ b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConfiguration.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.springboot;
+package org.apache.camel.component.cxf.jaxws.springboot;
 
 import javax.annotation.Generated;
 import org.apache.camel.spi.HeaderFilterStrategy;
diff --git a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConverter.java b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConverter.java
similarity index 97%
rename from components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConverter.java
rename to components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConverter.java
index be143876911..63046f43640 100644
--- a/components-starter/camel-cxf-starter/src/main/java/org/apache/camel/component/cxf/springboot/CxfComponentConverter.java
+++ b/components-starter/camel-cxf-soap-starter/src/main/java/org/apache/camel/component/cxf/jaxws/springboot/CxfComponentConverter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.springboot;
+package org.apache.camel.component.cxf.jaxws.springboot;
 
 import java.util.LinkedHashSet;
 import java.util.Set;
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/LICENSE.txt b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/LICENSE.txt
similarity index 100%
rename from components-starter/camel-cxf-starter/src/main/resources/META-INF/LICENSE.txt
rename to components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/LICENSE.txt
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/NOTICE.txt b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/NOTICE.txt
similarity index 100%
rename from components-starter/camel-cxf-starter/src/main/resources/META-INF/NOTICE.txt
rename to components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/NOTICE.txt
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.factories
similarity index 81%
copy from components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
copy to components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.factories
index fbd6fbf20a1..e1ec9c35d43 100644
--- a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
+++ b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.factories
@@ -14,4 +14,9 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-provides: camel-cxf
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.apache.camel.component.cxf.jaxws.springboot.CxfComponentAutoConfiguration,\
+org.apache.camel.component.cxf.jaxws.springboot.CxfComponentConverter
+
+
+
diff --git a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.provides
similarity index 97%
rename from components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
rename to components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.provides
index fbd6fbf20a1..13f37ba793e 100644
--- a/components-starter/camel-cxf-starter/src/main/resources/META-INF/spring.provides
+++ b/components-starter/camel-cxf-soap-starter/src/main/resources/META-INF/spring.provides
@@ -14,4 +14,4 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-provides: camel-cxf
+provides: camel-cxf-soap
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java
new file mode 100644
index 00000000000..2b75b4d1d66
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.jaxws;
+
+import java.util.List;
+
+public interface HelloService {
+    String sayHello();
+
+    void ping();
+
+    int getInvocationCount();
+
+    String echo(String text) throws Exception;
+
+    Boolean echoBoolean(Boolean bool);
+
+    String complexParameters(List<String> par1, List<String> par2);
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java
new file mode 100644
index 00000000000..1b1cd9fed49
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Service;
+
+import org.apache.camel.cxf.multipart.MultiPartInvoke;
+import org.apache.camel.cxf.multipart.types.InE;
+import org.apache.camel.cxf.multipart.types.ObjectFactory;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CXFMultiPartTest.class
+    },
+    properties = {
+              "camel.springboot.routes-include-pattern=file:src/test/resources/routes/multipartRoute.xml"}
+)
+    
+@ImportResource({
+                 "classpath:routes/MultiPartTest.xml"
+})
+public class CXFMultiPartTest {
+
+    public static final QName SERVICE_NAME = new QName("http://camel.apache.org/cxf/multipart",
+                                                       "MultiPartInvokeService");
+
+    public static final QName ROUTE_PORT_NAME = new QName("http://camel.apache.org/cxf/multipart",
+                                                          "MultiPartInvokePort");
+    protected static Endpoint endpoint;
+
+    
+    public void startService() {
+        Object implementor = new MultiPartInvokeImpl();
+        String address = "http://localhost:16231"
+                         + "/CXFMultiPartTest/SoapContext/SoapPort";
+        endpoint = Endpoint.publish(address, implementor);
+
+    }
+
+    
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+        startService();
+        String reply = invokeMultiPartService("http://localhost:16233"
+                                              + "/CXFMultiPartTest/CamelContext/RouterPort", "in0", "in1");
+        assertNotNull(reply, "No response received from service");
+        assertEquals("in0 in1", reply);
+
+        assertNotNull(reply, "No response received from service");
+        assertEquals("in0 in1", reply);
+        stopService();
+    }
+
+    private String invokeMultiPartService(String address, String in0, String in1) {
+
+        Service service = Service.create(SERVICE_NAME);
+        service.addPort(ROUTE_PORT_NAME, "http://schemas.xmlsoap.org/soap/", address);
+        MultiPartInvoke multiPartClient = service.getPort(ROUTE_PORT_NAME, MultiPartInvoke.class);
+
+        InE e0 = new ObjectFactory().createInE();
+        InE e1 = new ObjectFactory().createInE();
+        e0.setV(in0);
+        e1.setV(in1);
+
+        javax.xml.ws.Holder<InE> h = new javax.xml.ws.Holder<>();
+        javax.xml.ws.Holder<InE> h1 = new javax.xml.ws.Holder<>();
+        multiPartClient.foo(e0, e1, h, h1);
+        return h.value.getV() + " " + h1.value.getV();
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java
new file mode 100644
index 00000000000..45a423bad3e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfConsumerMessageTest.class,
+        CxfConsumerMessageTest.TestConfiguration.class
+    }
+)
+public class CxfConsumerMessageTest {
+
+    private static final String TEST_MESSAGE = "Hello World!";
+
+    private static final String ECHO_METHOD = "ns1:echo xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\"";
+
+    private static final String ECHO_RESPONSE = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+                                                + "<soap:Body><ns1:echoResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
+                                                + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">echo Hello World!</return>"
+                                                + "</ns1:echoResponse></soap:Body></soap:Envelope>";
+    private static final String ECHO_BOOLEAN_RESPONSE
+            = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+              + "<soap:Body><ns1:echoBooleanResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
+              + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</return>"
+              + "</ns1:echoBooleanResponse></soap:Body></soap:Envelope>";
+
+    protected final String simpleEndpointAddress = "http://localhost:"
+                                                   + CXFTestSupport.getPort1() + "/" + getClass().getSimpleName() + "/test";
+    protected final String simpleEndpointURI = "cxf://" + simpleEndpointAddress
+                                               + "?serviceClass=org.apache.camel.component.cxf.jaxws.HelloService";
+
+
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testInvokingServiceFromClient() throws Exception {
+        ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress(simpleEndpointAddress);
+        clientBean.setServiceClass(HelloService.class);
+        clientBean.setBus(BusFactory.getDefaultBus());
+
+        HelloService client = (HelloService) proxyFactory.create();
+
+        String result = client.echo(TEST_MESSAGE);
+        assertEquals(result, "echo " + TEST_MESSAGE, "We should get the echo string result from router");
+
+        Boolean bool = client.echoBoolean(Boolean.TRUE);
+        assertNotNull(bool, "The result should not be null");
+        assertEquals("true", bool.toString(), "We should get the echo boolean result from router");
+
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from(simpleEndpointURI + "&dataFormat=RAW").process(new Processor() {
+                        public void process(final Exchange exchange) {
+                            Message in = exchange.getIn();
+                            // check the content-length header is filtered 
+                            Object value = in.getHeader("Content-Length");
+                            assertNull(value, "The Content-Length header should be removed");
+                            // Get the request message
+                            String request = in.getBody(String.class);
+                            // Send the response message back
+                            if (request.indexOf(ECHO_METHOD) > 0) {
+                                exchange.getMessage().setBody(ECHO_RESPONSE);
+                            } else { // echoBoolean call
+                                exchange.getMessage().setBody(ECHO_BOOLEAN_RESPONSE);
+                            }
+
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java
new file mode 100644
index 00000000000..45eec68628d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+import java.util.List;
+
+import javax.xml.transform.Source;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfConsumerPayLoadConverterTest.class,
+        CxfConsumerPayLoadConverterTest.TestConfiguration.class
+    }
+)
+public class CxfConsumerPayLoadConverterTest extends CxfConsumerPayloadTest {
+
+        
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from(simpleEndpointURI + "&dataFormat=PAYLOAD").to("log:info").process(new Processor() {
+                        @SuppressWarnings("unchecked")
+                        public void process(final Exchange exchange) throws Exception {
+                            CxfPayload<SoapHeader> requestPayload = exchange.getIn().getBody(CxfPayload.class);
+                            List<Source> inElements = requestPayload.getBodySources();
+                            // You can use a customer toStringConverter to turn a CxfPayLoad message into String as you want                        
+                            String request = exchange.getIn().getBody(String.class);
+                            String documentString = ECHO_RESPONSE;
+
+                            Element in = new XmlConverter().toDOMElement(inElements.get(0));
+                            // Just check the element namespace
+                            if (!in.getNamespaceURI().equals(ELEMENT_NAMESPACE)) {
+                                throw new IllegalArgumentException("Wrong element namespace");
+                            }
+                            if (in.getLocalName().equals("echoBoolean")) {
+                                documentString = ECHO_BOOLEAN_RESPONSE;
+                                checkRequest("ECHO_BOOLEAN_REQUEST", request);
+                            } else {
+                                documentString = ECHO_RESPONSE;
+                                checkRequest("ECHO_REQUEST", request);
+                            }
+                            // just set the documentString into to the message body
+                            exchange.getMessage().setBody(documentString);
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java
new file mode 100644
index 00000000000..5cd4405947b
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfConsumerPayloadTest.class,
+        CxfConsumerPayloadTest.TestConfiguration.class
+    }
+)
+public class CxfConsumerPayloadTest extends CxfConsumerMessageTest{
+
+    protected static final String ECHO_RESPONSE = "<ns1:echoResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
+        + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">echo Hello World!</return>"
+        + "</ns1:echoResponse>";
+protected static final String ECHO_BOOLEAN_RESPONSE
+= "<ns1:echoBooleanResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
++ "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</return>"
++ "</ns1:echoBooleanResponse>";
+protected static final String ECHO_REQUEST = "<ns1:echo xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
+       + "<arg0 xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">Hello World!</arg0></ns1:echo>";
+protected static final String ECHO_BOOLEAN_REQUEST
+= "<ns1:echoBoolean xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
++ "<arg0 xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</arg0></ns1:echoBoolean>";
+
+protected static final String ELEMENT_NAMESPACE = "http://jaxws.cxf.component.camel.apache.org/";
+
+protected void checkRequest(String expect, String request) {
+//REVIST use a more reliable comparison to tolerate some namespaces being added to the root element
+if (expect.equals("ECHO_REQUEST")) {
+assertTrue(request.startsWith(ECHO_REQUEST.substring(0, 66))
+&& request.endsWith(ECHO_REQUEST.substring(67)), "Get a wrong request");
+} else {
+assertTrue(request.startsWith(ECHO_BOOLEAN_REQUEST.substring(0, 73))
+&& request.endsWith(ECHO_BOOLEAN_REQUEST.substring(74)), "Get a wrong request");
+}
+}
+
+    
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from(simpleEndpointURI + "&dataFormat=PAYLOAD").to("log:info").process(new Processor() {
+                        @SuppressWarnings("unchecked")
+                        public void process(final Exchange exchange) throws Exception {
+                            CxfPayload<SoapHeader> requestPayload = exchange.getIn().getBody(CxfPayload.class);
+                            List<Source> inElements = requestPayload.getBodySources();
+                            List<Source> outElements = new ArrayList<>();
+                            // You can use a customer toStringConverter to turn a CxfPayLoad message into String as you want                        
+                            String request = exchange.getIn().getBody(String.class);
+                            XmlConverter converter = new XmlConverter();
+                            String documentString = ECHO_RESPONSE;
+
+                            Element in = new XmlConverter().toDOMElement(inElements.get(0));
+                            // Just check the element namespace
+                            if (!in.getNamespaceURI().equals(ELEMENT_NAMESPACE)) {
+                                throw new IllegalArgumentException("Wrong element namespace");
+                            }
+                            if (in.getLocalName().equals("echoBoolean")) {
+                                documentString = ECHO_BOOLEAN_RESPONSE;
+                                checkRequest("ECHO_BOOLEAN_REQUEST", request);
+                            } else {
+                                documentString = ECHO_RESPONSE;
+                                checkRequest("ECHO_REQUEST", request);
+                            }
+                            Document outDocument = converter.toDOMDocument(documentString, exchange);
+                            outElements.add(new DOMSource(outDocument.getDocumentElement()));
+                            // set the payload header with null
+                            CxfPayload<SoapHeader> responsePayload = new CxfPayload<>(null, outElements, null);
+                            exchange.getMessage().setBody(responsePayload);
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java
new file mode 100644
index 00000000000..0a98efffa4f
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+import org.w3c.dom.Node;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfConsumerProviderTest.class,
+        CxfConsumerProviderTest.TestConfiguration.class
+    }
+)
+public class CxfConsumerProviderTest {
+
+    protected static final String REQUEST_MESSAGE
+        = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"test/service\">"
+            + "<soapenv:Header/><soapenv:Body><ser:ping/></soapenv:Body></soapenv:Envelope>";
+
+    protected static final String RESPONSE_MESSAGE_BEGINE
+        = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+            + "<soap:Body><pong xmlns=\"test/service\"";
+    protected static final String RESPONSE_MESSAGE_END = "/></soap:Body></soap:Envelope>";
+
+    protected static final String RESPONSE = "<pong xmlns=\"test/service\"/>";
+
+    protected final String simpleEndpointAddress = "http://localhost:"
+                                           + CXFTestSupport.getPort1() + "/" + getClass().getSimpleName() + "/test";
+    protected final String simpleEndpointURI = "cxf://" + simpleEndpointAddress
+                                       + "?serviceClass=org.apache.camel.component.cxf.soap.springboot.ServiceProvider";
+
+
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testInvokingServiceFromHttpCompnent() throws Exception {
+        // call the service with right post message
+
+        String response = template.requestBody(simpleEndpointAddress, REQUEST_MESSAGE, String.class);
+        assertTrue(response.startsWith(RESPONSE_MESSAGE_BEGINE), "Get a wrong response");
+        assertTrue(response.endsWith(RESPONSE_MESSAGE_END), "Get a wrong response");
+        try {
+            template.requestBody(simpleEndpointAddress, null, String.class);
+            fail("Excpetion to get exception here");
+        } catch (Exception ex) {
+            // do nothing here
+        }
+
+        response = template.requestBody(simpleEndpointAddress, REQUEST_MESSAGE, String.class);
+        assertTrue(response.startsWith(RESPONSE_MESSAGE_BEGINE), "Get a wrong response");
+        assertTrue(response.endsWith(RESPONSE_MESSAGE_END), "Get a wrong response");
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from(getFromEndpointUri()).process(new Processor() {
+                        public void process(final Exchange exchange) {
+                            Message in = exchange.getIn();
+                            Node node = in.getBody(Node.class);
+                            assertNotNull(node);
+                            XmlConverter xmlConverter = new XmlConverter();
+                            // Put the result back
+                            exchange.getMessage().setBody(xmlConverter.toSource(RESPONSE));
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+    protected String getFromEndpointUri() {
+        return simpleEndpointURI;
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
new file mode 100644
index 00000000000..d64a58c9c59
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import javax.xml.ws.Holder;
+
+import org.apache.camel.cxf.multipart.MultiPartInvoke;
+import org.apache.camel.cxf.multipart.types.InE;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@javax.jws.WebService(
+                      serviceName = "MultiPartInvokeService",
+                      portName = "MultiPartInvokePort",
+                      targetNamespace = "http://adapter.ti.tongtech.com/ws",
+                      endpointInterface = "org.apache.camel.cxf.multipart.MultiPartInvoke")
+
+public class MultiPartInvokeImpl implements MultiPartInvoke {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MultiPartInvokeImpl.class);
+
+    @Override
+    public void foo(InE in, InE in1, Holder<InE> out, Holder<InE> out1) {
+        LOG.info("Executing operation foo");
+        LOG.info("{}", in);
+        LOG.info("{}", in1);
+        try {
+            InE outValue = in;
+            out.value = outValue;
+            InE out1Value = in1;
+            out1.value = out1Value;
+        } catch (Exception ex) {
+            LOG.warn("I/O error: {}", ex.getMessage(), ex);
+            throw new RuntimeException(ex);
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java
new file mode 100644
index 00000000000..897eaaf503c
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import javax.xml.transform.Source;
+import javax.xml.ws.Provider;
+import javax.xml.ws.Service.Mode;
+import javax.xml.ws.ServiceMode;
+import javax.xml.ws.WebServiceProvider;
+
+@WebServiceProvider
+@ServiceMode(Mode.PAYLOAD)
+public class ServiceProvider implements Provider<Source> {
+
+    @Override
+    public Source invoke(Source m) {
+        throw new UnsupportedOperationException("Place holder method");
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java
new file mode 100644
index 00000000000..b166016bb8d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.StaxOutInterceptor;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+//START SNIPPET: example
+public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
+    public WriteXmlDeclarationInterceptor() {
+        super(Phase.PRE_STREAM);
+        addBefore(StaxOutInterceptor.class.getName());
+    }
+
+    @Override
+    public void handleMessage(SoapMessage message) throws Fault {
+        message.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
+    }
+
+}
+//END SNIPPET: example
diff --git a/components-starter/camel-cxf-soap-starter/src/test/resources/MultiPartTest.wsdl b/components-starter/camel-cxf-soap-starter/src/test/resources/MultiPartTest.wsdl
new file mode 100644
index 00000000000..3ff0b7d9f36
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/resources/MultiPartTest.wsdl
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+	xmlns:tns="http://camel.apache.org/cxf/multipart" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="flow"
+	xmlns:x1="http://camel.apache.org/cxf/multipart/types"
+	targetNamespace="http://camel.apache.org/cxf/multipart">
+	<wsdl:types>
+        <schema targetNamespace="http://camel.apache.org/cxf/multipart/types" 
+        	xmlns="http://www.w3.org/2001/XMLSchema" 
+        	xmlns:x1="http://camel.apache.org/cxf/multipart/types" 
+        	elementFormDefault="qualified">
+            <element name="inE">
+                <complexType>
+                    <sequence>
+                        <element name="v" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+        </schema>
+	</wsdl:types>
+	<wsdl:message name="inputRequest">
+		<wsdl:part name="in" element="x1:inE" />
+		<wsdl:part name="in1" element="x1:inE" />
+	</wsdl:message>
+	<wsdl:message name="inputResponse">
+		<wsdl:part name="out" element="x1:inE" />
+		<wsdl:part name="out1" element="x1:inE" />
+	</wsdl:message>
+	
+	<wsdl:portType name="MultiPartInvoke">
+		<wsdl:operation name="foo">
+			<wsdl:input message="tns:inputRequest" />
+			<wsdl:output message="tns:inputResponse" />
+		</wsdl:operation>
+	</wsdl:portType>
+	<wsdl:binding name="MultiPartInvokeSoapBinding" type="tns:MultiPartInvoke">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<wsdl:operation name="foo">
+			<soap:operation soapAction="http://camel.apache.org/cxf/multipart/input" />
+			<wsdl:input>
+				<soap:header use="literal" part="in" message="tns:inputRequest"/>
+				<soap:body use="literal" />
+			</wsdl:input>
+			<wsdl:output>
+				<soap:header use="literal" part="out" message="tns:inputResponse"/>
+				<soap:body use="literal" />
+			</wsdl:output>
+		</wsdl:operation>
+	</wsdl:binding>
+	<wsdl:service name="MultiPartInvokeService">
+		<wsdl:port binding="tns:MultiPartInvokeSoapBinding" name="MultiPartInvokePort">
+			<soap:address location="http://localhost:9000/SoapContext/SoapPort"/>
+		</wsdl:port>
+	</wsdl:service>
+</wsdl:definitions>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/resources/routes/MultiPartTest.xml b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/MultiPartTest.xml
new file mode 100644
index 00000000000..0a712a16d3d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/MultiPartTest.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf/jaxws"
+       xsi:schemaLocation="
+         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+         http://camel.apache.org/schema/cxf/jaxws http://camel.apache.org/schema/cxf/jaxws/camel-cxf.xsd
+         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+      ">
+      
+    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+    <import resource="classpath:META-INF/cxf/cxf.xml"/>
+  
+    <cxf:cxfEndpoint id="routerEndpoint"
+        address="http://localhost:16233/CXFMultiPartTest/CamelContext/RouterPort" 
+        wsdlURL="classpath:/MultiPartTest.wsdl"
+        endpointName="s:MultiPartInvokePort"
+        serviceName="s:MultiPartInvokeService"
+        xmlns:s="http://camel.apache.org/cxf/multipart">
+
+        <cxf:outInterceptors>
+            <bean class="org.apache.camel.component.cxf.soap.springboot.WriteXmlDeclarationInterceptor"/>
+        </cxf:outInterceptors>
+   </cxf:cxfEndpoint>
+  
+    <cxf:cxfEndpoint id="serviceEndpoint" 
+        address="http://localhost:16231/CXFMultiPartTest/SoapContext/SoapPort"
+        wsdlURL="classpath:MultiPartTest.wsdl"
+        endpointName="s:MultiPartInvokePort"
+        serviceName="s:MultiPartInvokeService"
+        xmlns:s="http://camel.apache.org/cxf/multipart" />
+
+    <bean id="noErrorHandler" class="org.apache.camel.builder.NoErrorHandlerBuilder"/>
+	
+</beans>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/resources/routes/multipartRoute.xml b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/multipartRoute.xml
new file mode 100644
index 00000000000..d1f1ce13e12
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/multipartRoute.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+
+    <!-- START SNIPPET: e1 -->
+    <routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route errorHandlerRef="noErrorHandler">
+            <from uri="cxf:bean:routerEndpoint?dataFormat=PAYLOAD" />
+            <to uri="cxf:bean:serviceEndpoint?dataFormat=PAYLOAD" />
+        </route>
+    </routes>
diff --git a/components-starter/camel-cxf-transport-starter/pom.xml b/components-starter/camel-cxf-transport-starter/pom.xml
index b230950696a..1bceb4231d3 100644
--- a/components-starter/camel-cxf-transport-starter/pom.xml
+++ b/components-starter/camel-cxf-transport-starter/pom.xml
@@ -36,7 +36,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
-      <artifactId>camel-cxf-transport</artifactId>
+      <artifactId>camel-cxf-spring-transport</artifactId>
       <version>${camel-version}</version>
     </dependency>
     <!--START OF GENERATED CODE-->
diff --git a/components-starter/camel-soap-starter/pom.xml b/components-starter/camel-soap-starter/pom.xml
index 7cc4f4aa0b5..abd306695c4 100644
--- a/components-starter/camel-soap-starter/pom.xml
+++ b/components-starter/camel-soap-starter/pom.xml
@@ -47,7 +47,13 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
-      <artifactId>camel-cxf</artifactId>
+      <artifactId>camel-cxf-spring-transport</artifactId>
+      <version>${camel-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-cxf-soap</artifactId>
       <version>${camel-version}</version>
       <scope>test</scope>
     </dependency>
diff --git a/components-starter/pom.xml b/components-starter/pom.xml
index fca45e3b17c..567b33bff2f 100644
--- a/components-starter/pom.xml
+++ b/components-starter/pom.xml
@@ -183,7 +183,8 @@
     <module>camel-crypto-starter</module>
     <module>camel-csimple-joor-starter</module>
     <module>camel-csv-starter</module>
-    <module>camel-cxf-starter</module>
+    <module>camel-cxf-soap-starter</module>
+    <module>camel-cxf-rest-starter</module>
     <module>camel-cxf-transport-starter</module>
     <module>camel-dataformat-starter</module>
     <module>camel-dataset-starter</module>
diff --git a/tooling/camel-spring-boot-bom/pom.xml b/tooling/camel-spring-boot-bom/pom.xml
index f7ed58a9c6b..a8529e04582 100644
--- a/tooling/camel-spring-boot-bom/pom.xml
+++ b/tooling/camel-spring-boot-bom/pom.xml
@@ -410,7 +410,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel.springboot</groupId>
-        <artifactId>camel-cxf-starter</artifactId>
+        <artifactId>camel-cxf-rest-starter</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel.springboot</groupId>
+        <artifactId>camel-cxf-soap-starter</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
diff --git a/tooling/camel-spring-boot-dependencies/pom.xml b/tooling/camel-spring-boot-dependencies/pom.xml
index 531f98f9f0e..2761ac3d3c1 100644
--- a/tooling/camel-spring-boot-dependencies/pom.xml
+++ b/tooling/camel-spring-boot-dependencies/pom.xml
@@ -603,7 +603,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel.springboot</groupId>
-        <artifactId>camel-cxf-starter</artifactId>
+        <artifactId>camel-cxf-rest-starter</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel.springboot</groupId>
+        <artifactId>camel-cxf-soap-starter</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>