You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ff...@apache.org on 2022/11/23 21:32:32 UTC

[camel-spring-boot] branch camel-spring-boot-3.18.x updated (8b0eb2a54de -> 8ebcf05fac8)

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

ffang pushed a change to branch camel-spring-boot-3.18.x
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git


    from 8b0eb2a54de CAMEL-18746 Add missing debezium db2/oracle starters (#671)
     new f144eed1d1f ✅ CXF Simple JAAS Test (#593)
     new 8ebcf05fac8 [CAMEL-18729]add more tests in camel-cxf-soap-starter

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 components-starter/camel-cxf-soap-starter/pom.xml  |  81 +-
 .../GreetingService.java}                          |  19 +-
 .../GreetingServiceImpl.java}                      |  22 +-
 .../cxf/security/jaas/SimpleLoginModule.java       | 104 +++
 .../springboot/CxfComponentEnableMtomTest.java     | 145 +++
 .../soap/springboot/CxfConsumerMessageTest.java    |  32 +-
 .../CxfConsumerPayLoadConverterTest.java           |   9 +-
 .../CxfConsumerPayloadFaultCauseEnabledTest.java   | 159 ++++
 .../soap/springboot/CxfConsumerPayloadTest.java    |  38 +-
 .../soap/springboot/CxfConsumerProviderTest.java   |  16 +-
 .../cxf/soap/springboot/CxfEndpointBeanTest.java   | 157 ++++
 .../springboot/CxfMessageHeaderTimeoutTest.java    | 167 ++++
 .../cxf/soap/springboot/CxfNonWrapperTest.java     | 142 +++
 .../cxf/soap/springboot/CxfOneWayRouteTest.java    | 219 +++++
 .../CxfPayLoadMessageXmlBindingRouterTest.java     | 177 ++++
 .../springboot/CxfPayLoadSoapHeaderSpringTest.java | 213 +++++
 .../CxfSpringCustomizedExceptionTest.java          | 146 +++
 .../cxf/soap/springboot/CxfSpringRouterTest.java   | 163 ++++
 .../cxf/soap/springboot/CxfTimeoutTest.java        | 266 ++++++
 .../springboot/FileToCxfMessageDataFormatTest.java | 176 ++++
 .../cxf/soap/springboot/JaxwsTestHandler.java      |  82 ++
 .../LoggingInterceptorInMessageModeTest.java       | 209 +++++
 .../cxf/soap/springboot/MultiPartInvokeImpl.java   |  52 --
 .../cxf/soap/springboot/SpringBusFactoryTest.java  |  70 ++
 .../converter/PayLoadConvertToPOJOTest.java        | 130 +++
 .../dispatch/CxfDispatchMessageTest.java           | 159 ++++
 .../dispatch/CxfDispatchPayloadTest.java           | 161 ++++
 .../dispatch/CxfDispatchTestSupport.java           | 122 +++
 .../dispatch/CxfSoapMessageProviderTest.java       | 188 ++++
 .../greeterroute/AbstractCXFGreeterRouterTest.java | 132 +++
 .../greeterroute/CXFGreeterEnrichTest.java         | 120 +++
 .../greeterroute/CXFGreeterRouterTest.java         | 120 +++
 .../CxfGreeterCXFMessageRouterTest.java            | 113 +++
 .../CxfGreeterCXFMessageWithoutSEIRouterTest.java  | 118 +++
 .../CxfGreeterConverterRouterTest.java             | 117 +++
 .../CxfGreeterMessageCamelHttpRouterTest.java      | 106 +++
 .../greeterroute/CxfGreeterMessageRouterTest.java  | 113 +++
 .../greeterroute/CxfGreeterPayLoadRouterTest.java  | 115 +++
 .../CxfGreeterPayLoadWithFeatureRouterTest.java    | 115 +++
 .../greeterroute/CxfGreeterWSDLOnlyRouterTest.java | 113 +++
 .../greeterroute/CxfPayloadProviderRouterTest.java | 186 ++++
 .../springboot/jms/CxfEndpointJMSConsumerTest.java | 127 +++
 .../mtom/CxfJavaMtomProducerPayloadTest.java       | 104 +++
 .../mtom/CxfMtomConsumerMutipleParameterTest.java  | 152 ++++
 .../mtom/CxfMtomConsumerPayloadModeTest.java       | 206 +++++
 .../soap/springboot/mtom/CxfMtomConsumerTest.java  | 168 ++++
 .../CxfMtomDisabledConsumerPayloadModeTest.java    | 192 ++++
 .../CxfMtomDisabledProducerPayloadModeTest.java    | 287 ++++++
 .../springboot/mtom/CxfMtomPOJOProducerTest.java   | 192 ++++
 .../mtom/CxfMtomProducerPayloadModeTest.java       | 241 +++++
 .../mtom/CxfMtomRouterCxfMessageModeTest.java      | 102 +++
 .../mtom/CxfMtomRouterPayloadMode12Test.java       | 109 +++
 .../mtom/CxfMtomRouterPayloadModeTest.java         | 214 +++++
 .../springboot/mtom/CxfMtomRouterRawModeTest.java  | 102 +++
 .../ImageService.java}                             |  31 +-
 .../cxf/soap/springboot/mtom/MtomTestHelper.java   | 102 +++
 ...dConsumerDuplicateNamespaceStreamCacheTest.java |  70 ++
 ...ConsumerNamespaceOnEnvelopeStreamCacheTest.java |  75 ++
 .../CxfPayloadConsumerNamespaceOnEnvelopeTest.java | 150 ++++
 ...ProducerNamespaceOnEnvelopeStreamCacheTest.java |  84 ++
 .../CxfPayloadProducerNamespaceOnEnvelopeTest.java | 151 ++++
 .../cxf/soap/springboot/noparam/NoParamTest.java   | 125 +++
 .../soap/headers/CxfMessageHeadersRelayTest.java   | 977 +++++++++++++++++++++
 .../{ => springxml}/CXFMultiPartTest.java          |  18 +-
 .../springxml/WSSUsernameTokenHandler.java         |  85 ++
 .../springboot/springxml/WSSUsernameTokenTest.java | 133 +++
 .../soap/springboot/ssl/SslBuilderCustomizer.java  | 231 +++++
 .../cxf/soap/springboot/ssl/SslGlobalTest.java     | 250 ++++++
 .../component/cxf/soap/springboot/ssl/SslTest.java | 253 ++++++
 .../undertowhandler/AccessLogHandlerTest.java      | 188 ++++
 .../DisallowedMethodsHandlerTest.java              | 169 ++++
 .../RequestLimitingHandlerTest.java                | 191 ++++
 .../springboot/wsa/WSAddressingPAYLOADTest.java    | 192 ++++
 .../cxf/soap/springboot/wsa/WSAddressingTest.java  | 189 ++++
 .../springboot/wsdl/AbstractCxfWsdlFirstTest.java  | 169 ++++
 .../cxf/soap/springboot/wsdl/CXFWsdlOnlyTest.java  | 234 +++++
 .../wsdl/CxfPayloadWsdlWithoutSEITest.java         | 168 ++++
 .../wsdl/CxfWsdlFirstPayloadModeTest.java          | 148 ++++
 .../springboot/wsdl/CxfWsdlFirstProcessorTest.java | 185 ++++
 .../cxf/soap/springboot/wsdl/CxfWsdlFirstTest.java | 130 +++
 .../cxf/soap/springboot/wsdl/OrderTest.java        | 156 ++++
 .../cxf/soap/springboot/wsrm/WSRMTest.java         | 193 ++++
 .../cxf/soap/springboot/wssecurity/CxfServer.java  |  18 +
 .../springboot/wssecurity/WSSecurityRouteTest.java | 319 +++++++
 .../org/apache/camel/wsdl_first/PersonImpl.java    |  41 +
 .../src/test/resources/MultiPartTest.wsdl          |  56 --
 .../soap/springboot/wssecurity/client/wssec.xml    | 129 +++
 .../soap/springboot/wssecurity/server/wssec.xml    | 151 ++++
 .../src/test/resources/routes/MultiPartTest.xml    |   4 +-
 .../src/test/resources/routes/soap-security.xml    |  49 ++
 .../simple-jaas.conf}                              |  21 +-
 .../springboot/MllpMaxConcurrentConsumersTest.java |   2 +-
 .../MllpTcpClientProducerConnectionErrorTest.java  |   3 -
 93 files changed, 12874 insertions(+), 254 deletions(-)
 copy components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/{jaxws/HelloService.java => security/GreetingService.java} (71%)
 rename components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/{soap/springboot/ServiceProvider.java => security/GreetingServiceImpl.java} (63%)
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/jaas/SimpleLoginModule.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java
 delete mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java
 rename components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/{WriteXmlDeclarationInterceptor.java => mtom/ImageService.java} (52%)
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java
 rename components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/{ => springxml}/CXFMultiPartTest.java (86%)
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/undertowhandler/AccessLogHandlerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/undertowhandler/DisallowedMethodsHandlerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/undertowhandler/RequestLimitingHandlerTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsa/WSAddressingPAYLOADTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsa/WSAddressingTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/AbstractCxfWsdlFirstTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/CXFWsdlOnlyTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/CxfPayloadWsdlWithoutSEITest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/CxfWsdlFirstPayloadModeTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/CxfWsdlFirstProcessorTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/CxfWsdlFirstTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsdl/OrderTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wsrm/WSRMTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wssecurity/CxfServer.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/wssecurity/WSSecurityRouteTest.java
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/wsdl_first/PersonImpl.java
 delete mode 100644 components-starter/camel-cxf-soap-starter/src/test/resources/MultiPartTest.wsdl
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/resources/org/apache/camel/component/cxf/soap/springboot/wssecurity/client/wssec.xml
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/resources/org/apache/camel/component/cxf/soap/springboot/wssecurity/server/wssec.xml
 create mode 100644 components-starter/camel-cxf-soap-starter/src/test/resources/routes/soap-security.xml
 rename components-starter/camel-cxf-soap-starter/src/test/{java/org/apache/camel/component/cxf/jaxws/HelloService.java => resources/simple-jaas.conf} (70%)


[camel-spring-boot] 02/02: [CAMEL-18729]add more tests in camel-cxf-soap-starter

Posted by ff...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8ebcf05fac8fe400644cac1fd7b0d96785e5e166
Author: Freeman Fang <fr...@gmail.com>
AuthorDate: Tue Sep 20 16:38:35 2022 -0400

    [CAMEL-18729]add more tests in camel-cxf-soap-starter
    
    (cherry picked from commit 9d04c4bfedef9c80b22c533b33da41191415bd7c)
    (cherry picked from commit 263ac456dc6fcdcf2b821c95fd2bf0b945f72566)
    (cherry picked from commit a5b2a7032fcf8126bd34b121fe798fea18af1004)
---
 components-starter/camel-cxf-soap-starter/pom.xml  |  76 +-
 .../springboot/CxfComponentEnableMtomTest.java     | 145 +++
 .../soap/springboot/CxfConsumerMessageTest.java    |  32 +-
 .../CxfConsumerPayLoadConverterTest.java           |   9 +-
 .../CxfConsumerPayloadFaultCauseEnabledTest.java   | 159 ++++
 .../soap/springboot/CxfConsumerPayloadTest.java    |  38 +-
 .../soap/springboot/CxfConsumerProviderTest.java   |  16 +-
 .../cxf/soap/springboot/CxfEndpointBeanTest.java   | 157 ++++
 .../springboot/CxfMessageHeaderTimeoutTest.java    | 167 ++++
 .../cxf/soap/springboot/CxfNonWrapperTest.java     | 142 +++
 .../cxf/soap/springboot/CxfOneWayRouteTest.java    | 219 +++++
 .../CxfPayLoadMessageXmlBindingRouterTest.java     | 177 ++++
 .../springboot/CxfPayLoadSoapHeaderSpringTest.java | 213 +++++
 .../CxfSpringCustomizedExceptionTest.java          | 146 +++
 .../cxf/soap/springboot/CxfSpringRouterTest.java   | 163 ++++
 .../cxf/soap/springboot/CxfTimeoutTest.java        | 266 ++++++
 .../springboot/FileToCxfMessageDataFormatTest.java | 176 ++++
 .../cxf/soap/springboot/JaxwsTestHandler.java      |  82 ++
 .../LoggingInterceptorInMessageModeTest.java       | 209 +++++
 .../cxf/soap/springboot/MultiPartInvokeImpl.java   |  52 --
 .../cxf/soap/springboot/ServiceProvider.java       |  34 -
 .../cxf/soap/springboot/SpringBusFactoryTest.java  |  70 ++
 .../springboot/WriteXmlDeclarationInterceptor.java |  38 -
 .../converter/PayLoadConvertToPOJOTest.java        | 130 +++
 .../dispatch/CxfDispatchMessageTest.java           | 159 ++++
 .../dispatch/CxfDispatchPayloadTest.java           | 161 ++++
 .../dispatch/CxfDispatchTestSupport.java           | 122 +++
 .../dispatch/CxfSoapMessageProviderTest.java       | 188 ++++
 .../greeterroute/AbstractCXFGreeterRouterTest.java | 132 +++
 .../greeterroute/CXFGreeterEnrichTest.java         | 120 +++
 .../greeterroute/CXFGreeterRouterTest.java         | 120 +++
 .../CxfGreeterCXFMessageRouterTest.java            | 113 +++
 .../CxfGreeterCXFMessageWithoutSEIRouterTest.java  | 118 +++
 .../CxfGreeterConverterRouterTest.java             | 117 +++
 .../CxfGreeterMessageCamelHttpRouterTest.java      | 106 +++
 .../greeterroute/CxfGreeterMessageRouterTest.java  | 113 +++
 .../greeterroute/CxfGreeterPayLoadRouterTest.java  | 115 +++
 .../CxfGreeterPayLoadWithFeatureRouterTest.java    | 115 +++
 .../greeterroute/CxfGreeterWSDLOnlyRouterTest.java | 113 +++
 .../greeterroute/CxfPayloadProviderRouterTest.java | 186 ++++
 .../springboot/jms/CxfEndpointJMSConsumerTest.java | 127 +++
 .../mtom/CxfJavaMtomProducerPayloadTest.java       | 104 +++
 .../mtom/CxfMtomConsumerMutipleParameterTest.java  | 152 ++++
 .../mtom/CxfMtomConsumerPayloadModeTest.java       | 206 +++++
 .../soap/springboot/mtom/CxfMtomConsumerTest.java  | 168 ++++
 .../CxfMtomDisabledConsumerPayloadModeTest.java    | 192 ++++
 .../CxfMtomDisabledProducerPayloadModeTest.java    | 287 ++++++
 .../springboot/mtom/CxfMtomPOJOProducerTest.java   | 192 ++++
 .../mtom/CxfMtomProducerPayloadModeTest.java       | 241 +++++
 .../mtom/CxfMtomRouterCxfMessageModeTest.java      | 102 +++
 .../mtom/CxfMtomRouterPayloadMode12Test.java       | 109 +++
 .../mtom/CxfMtomRouterPayloadModeTest.java         | 214 +++++
 .../springboot/mtom/CxfMtomRouterRawModeTest.java  | 102 +++
 .../springboot/mtom/ImageService.java}             |  25 +-
 .../cxf/soap/springboot/mtom/MtomTestHelper.java   | 102 +++
 ...dConsumerDuplicateNamespaceStreamCacheTest.java |  70 ++
 ...ConsumerNamespaceOnEnvelopeStreamCacheTest.java |  75 ++
 .../CxfPayloadConsumerNamespaceOnEnvelopeTest.java | 150 ++++
 ...ProducerNamespaceOnEnvelopeStreamCacheTest.java |  84 ++
 .../CxfPayloadProducerNamespaceOnEnvelopeTest.java | 151 ++++
 .../cxf/soap/springboot/noparam/NoParamTest.java   | 125 +++
 .../soap/headers/CxfMessageHeadersRelayTest.java   | 977 +++++++++++++++++++++
 .../{ => springxml}/CXFMultiPartTest.java          |  18 +-
 .../{ => springxml}/WSSUsernameTokenHandler.java   |   2 +-
 .../{ => springxml}/WSSUsernameTokenTest.java      |  27 +-
 .../soap/springboot/ssl/SslBuilderCustomizer.java  | 231 +++++
 .../cxf/soap/springboot/ssl/SslGlobalTest.java     | 250 ++++++
 .../component/cxf/soap/springboot/ssl/SslTest.java | 253 ++++++
 .../undertowhandler/AccessLogHandlerTest.java      | 188 ++++
 .../DisallowedMethodsHandlerTest.java              | 169 ++++
 .../RequestLimitingHandlerTest.java                | 191 ++++
 .../springboot/wsa/WSAddressingPAYLOADTest.java    | 192 ++++
 .../cxf/soap/springboot/wsa/WSAddressingTest.java  | 189 ++++
 .../springboot/wsdl/AbstractCxfWsdlFirstTest.java  | 169 ++++
 .../cxf/soap/springboot/wsdl/CXFWsdlOnlyTest.java  | 234 +++++
 .../wsdl/CxfPayloadWsdlWithoutSEITest.java         | 168 ++++
 .../wsdl/CxfWsdlFirstPayloadModeTest.java          | 148 ++++
 .../springboot/wsdl/CxfWsdlFirstProcessorTest.java | 185 ++++
 .../cxf/soap/springboot/wsdl/CxfWsdlFirstTest.java | 130 +++
 .../cxf/soap/springboot/wsdl/OrderTest.java        | 156 ++++
 .../cxf/soap/springboot/wsrm/WSRMTest.java         | 193 ++++
 .../cxf/soap/springboot/wssecurity/CxfServer.java  |  18 +
 .../springboot/wssecurity/WSSecurityRouteTest.java | 319 +++++++
 .../org/apache/camel/wsdl_first/PersonImpl.java    |  41 +
 .../src/test/resources/MultiPartTest.wsdl          |  56 --
 .../soap/springboot/wssecurity/client/wssec.xml    | 129 +++
 .../soap/springboot/wssecurity/server/wssec.xml    | 151 ++++
 .../src/test/resources/routes/MultiPartTest.xml    |   4 +-
 .../src/test/resources/routes/soap-security.xml    |   2 +-
 89 files changed, 12501 insertions(+), 281 deletions(-)

diff --git a/components-starter/camel-cxf-soap-starter/pom.xml b/components-starter/camel-cxf-soap-starter/pom.xml
index 11bdee34a66..71c2a91aa13 100644
--- a/components-starter/camel-cxf-soap-starter/pom.xml
+++ b/components-starter/camel-cxf-soap-starter/pom.xml
@@ -57,12 +57,32 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-cxf-spring-soap</artifactId>
+      <version>${camel-version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-cxf-soap</artifactId>
+      <version>${camel-version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-http</artifactId>
       <version>${camel-version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-jaxb</artifactId>
+      <version>${camel-version}</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
@@ -85,6 +105,33 @@
       <scope>test</scope>
       <version>${cxf-version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-ws-rm</artifactId>
+      <scope>test</scope>
+      <version>${cxf-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-testutils</artifactId>
+      <scope>test</scope>
+      <version>${cxf-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-jms</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.activemq</groupId>
+      <artifactId>activemq-broker</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.activemq</groupId>
+      <artifactId>activemq-kahadb-store</artifactId>
+      <scope>test</scope>
+    </dependency>
     <!--START OF GENERATED CODE-->
     <dependency>
       <groupId>org.apache.camel.springboot</groupId>
@@ -95,31 +142,10 @@
   <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>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <rerunFailingTestsCount>0</rerunFailingTestsCount>
+        </configuration>
       </plugin>
     </plugins>
   </build>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java
new file mode 100644
index 00000000000..0d5c74e5a9f
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.HashMap;
+import java.util.Map;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+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;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfComponentEnableMtomTest.class,
+                           CxfComponentEnableMtomTest.TestConfig.class,
+                           CxfAutoConfiguration.class
+})
+public class CxfComponentEnableMtomTest {
+
+    @Autowired
+    private CamelContext camelContext;
+    
+    
+    @Test
+    public void testIsMtomEnabledEnabledThroughBeanSetter() throws InterruptedException {
+        Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByBeanSetter");
+
+        if (endpoint instanceof CxfEndpoint) {
+            CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+            assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+        } else {
+            fail("CXF Endpoint not found");
+        }
+    }
+
+    @Test
+    public void testIsMtomEnabledEnabledThroughBeanProperties() throws InterruptedException {
+        Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByBeanProperties");
+
+        if (endpoint instanceof CxfEndpoint) {
+            CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+            assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+        } else {
+            fail("CXF Endpoint not found");
+        }
+    }
+
+    @Test
+    public void testIsMtomEnabledEnabledThroughURIProperties() throws InterruptedException {
+        Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByURIProperties?properties.mtom-enabled=true");
+
+        if (endpoint instanceof CxfEndpoint) {
+            CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+            assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+        } else {
+            fail("CXF Endpoint not found");
+        }
+    }
+
+    @Test
+    public void testIsMtomEnabledEnabledThroughQueryParameters() throws InterruptedException {
+        Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByQueryParameters?mtomEnabled=true");
+
+        if (endpoint instanceof CxfEndpoint) {
+            CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+            assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+        } else {
+            fail("CXF Endpoint not found");
+        }
+    }
+
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    
+    static class TestConfig {
+
+        @Bean("mtomByQueryParameters")
+        public CxfEndpoint mtomByQueryParameters(CamelContext context) {
+            CxfEndpoint endpoint = new CxfSpringEndpoint();
+            return endpoint;
+        }
+
+        @Bean("mtomByURIProperties")
+        public CxfEndpoint mtomByURIProperties() {
+            return new CxfSpringEndpoint();
+        }
+
+        @Bean("mtomByBeanProperties")
+        public CxfEndpoint mtomByBeanProperties() {
+            CxfEndpoint endpoint = new CxfSpringEndpoint();
+            Map<String, Object> properties = new HashMap<>();
+            properties.put(Message.MTOM_ENABLED, true);
+
+            endpoint.setProperties(properties);
+            return endpoint;
+
+        }
+
+        @Bean("mtomByBeanSetter")
+        public CxfEndpoint mtomByBeanSetter() {
+            CxfEndpoint endpoint = new CxfSpringEndpoint();
+            endpoint.setMtomEnabled(true);
+            return endpoint;
+
+        }
+    }
+
+}
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
index 71c130ba172..fa7c76f7fb5 100644
--- 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
@@ -23,7 +23,8 @@ 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.jaxws.HelloService;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.HelloService;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 
 import org.junit.jupiter.api.Test;
@@ -54,6 +55,7 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
         CamelAutoConfiguration.class,
         CxfConsumerMessageTest.class,
         CxfConsumerMessageTest.TestConfiguration.class,
+        CxfConsumerMessageTest.ServletConfiguration.class,
         CxfAutoConfiguration.class
     }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
        
@@ -62,36 +64,35 @@ 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_METHOD = "ns1:echo xmlns:ns1=\"http://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>"
+                                                + "<soap:Body><ns1:echoResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+                                                + "<return xmlns=\"http://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>"
+              + "<soap:Body><ns1:echoBooleanResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+              + "<return xmlns=\"http://cxf.component.camel.apache.org/\">true</return>"
               + "</ns1:echoBooleanResponse></soap:Body></soap:Envelope>";
 
     protected final String simpleEndpointAddress = "/" + getClass().getSimpleName() + "-test";
     protected final String simpleEndpointURI = "cxf://" + simpleEndpointAddress
-                                               + "?serviceClass=org.apache.camel.component.cxf.jaxws.HelloService";
+                                               + "?serviceClass=org.apache.camel.component.cxf.HelloService";
 
+    static int port = CXFTestSupport.getPort1();
 
     @Autowired
     ProducerTemplate template;
     
-    @Bean
-    public ServletWebServerFactory servletWebServerFactory() {
-        return new UndertowServletWebServerFactory();
-    }
+    
     
     @Test
     public void testInvokingServiceFromClient() throws Exception {
         ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
         ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
-        clientBean.setAddress("http://localhost:8080/services" + simpleEndpointAddress);
+        clientBean.setAddress("http://localhost:" + port 
+                              + "/services" + simpleEndpointAddress);
         clientBean.setServiceClass(HelloService.class);
         clientBean.setBus(BusFactory.getDefaultBus());
 
@@ -142,4 +143,11 @@ public class CxfConsumerMessageTest {
         }
     }
     
+    @Configuration
+    class ServletConfiguration {
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+    }
 }
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
index 4a4f6ce1906..a12ecefd852 100644
--- 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
@@ -32,8 +32,6 @@ import org.apache.camel.spring.boot.CamelAutoConfiguration;
 
 
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
-import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.test.annotation.DirtiesContext;
@@ -49,17 +47,14 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
         CamelAutoConfiguration.class,
         CxfConsumerPayLoadConverterTest.class,
         CxfConsumerPayLoadConverterTest.TestConfiguration.class,
+        CxfConsumerMessageTest.ServletConfiguration.class,
         CxfAutoConfiguration.class
     }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
 )
 public class CxfConsumerPayLoadConverterTest extends CxfConsumerPayloadTest {
 
         
-    @Bean
-    public ServletWebServerFactory servletWebServerFactory() {
-        return new UndertowServletWebServerFactory();
-    }
-    
+        
     // *************************************
     // Config
     // *************************************
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java
new file mode 100644
index 00000000000..c11463c2630
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPFault;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPFaultException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.camel.wsdl_first.Person;
+import org.apache.camel.wsdl_first.PersonService;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfConsumerPayloadFaultCauseEnabledTest.class,
+        CxfConsumerPayloadFaultCauseEnabledTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfConsumerPayloadFaultCauseEnabledTest {
+
+    protected static final QName SERVICE_QNAME = new QName("http://camel.apache.org/wsdl-first", "PersonService");
+    protected static final QName PORT_QNAME = new QName("http://camel.apache.org/wsdl-first", "soap");
+
+    static int port = CXFTestSupport.getPort1();
+    
+    
+    @Test
+    public void testInvokingFromCxfClient() throws Exception {
+        
+        URL wsdlURL = getClass().getClassLoader().getResource("person.wsdl");
+        PersonService ss = new PersonService(wsdlURL, SERVICE_QNAME);
+
+        Person client = ss.getSoap();
+
+        Client c = ClientProxy.getClient(client);
+        c.getInInterceptors().add(new LoggingInInterceptor());
+        c.getOutInterceptors().add(new LoggingOutInterceptor());
+        ((BindingProvider) client).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
+                     "http://localhost:" + port 
+                     + "/services/CxfConsumerPayloadFaultCauseEnabledTest/PersonService");
+
+        Holder<String> personId = new Holder<>();
+        personId.value = "";
+        Holder<String> ssn = new Holder<>();
+        Holder<String> name = new Holder<>();
+        try {
+            client.getPerson(personId, ssn, name);
+            fail("SOAPFault expected!");
+        } catch (Exception e) {
+            assertTrue(e instanceof SOAPFaultException);
+            SOAPFault fault = ((SOAPFaultException) e).getFault();
+            assertEquals("Someone messed up the service. Caused by: Homer", fault.getFaultString());
+        }
+    }
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint consumerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/CxfConsumerPayloadFaultCauseEnabledTest/PersonService");
+            cxfEndpoint.setWsdlURL("classpath:person.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("exceptionMessageCauseEnabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:consumerEndpoint").process(new Processor() {
+                        public void process(final Exchange exchange) throws Exception {
+                            Throwable cause = new IllegalArgumentException("Homer");
+                            Fault fault = new Fault("Someone messed up the service.", (ResourceBundle) null, cause);
+                            exchange.setException(fault);
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+    
+}
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
index b5a8d89c10a..0bc605e4989 100644
--- 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
@@ -35,8 +35,6 @@ 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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
-import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.test.annotation.DirtiesContext;
@@ -47,38 +45,36 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
 @DirtiesContext
 @CamelSpringBootTest
 @SpringBootTest(classes = {
-                           CamelAutoConfiguration.class, CxfConsumerPayloadTest.class,
+                           CamelAutoConfiguration.class, 
+                           CxfConsumerPayloadTest.class,
                            CxfConsumerPayloadTest.TestConfiguration.class,
+                           CxfConsumerMessageTest.ServletConfiguration.class,
                            CxfAutoConfiguration.class
 }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 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>"
+    protected static final String ECHO_RESPONSE = "<ns1:echoResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+                                                  + "<return xmlns=\"http://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>"
+    protected static final String ECHO_BOOLEAN_RESPONSE = "<ns1:echoBooleanResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+                                                          + "<return xmlns=\"http://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 ECHO_REQUEST = "<ns1:echo xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+                                                 + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">Hello World!</arg0></ns1:echo>";
+    protected static final String ECHO_BOOLEAN_REQUEST = "<ns1:echoBoolean xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+                                                         + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">true</arg0></ns1:echoBoolean>";
 
-    protected static final String ELEMENT_NAMESPACE = "http://jaxws.cxf.component.camel.apache.org/";
+    protected static final String ELEMENT_NAMESPACE = "http://cxf.component.camel.apache.org/";
     
-    @Bean
-    public ServletWebServerFactory servletWebServerFactory() {
-        return new UndertowServletWebServerFactory();
-    }
-
+   
     protected void checkRequest(String expect, String request) {
 
         if (expect.equals("ECHO_REQUEST")) {
-            assertTrue(request.startsWith(ECHO_REQUEST.substring(0, 66))
-                       && request.endsWith(ECHO_REQUEST.substring(67)), "Get a wrong request");
+            assertTrue(request.startsWith(ECHO_REQUEST.substring(0, 60))
+                       && request.endsWith(ECHO_REQUEST.substring(61)), "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");
+            assertTrue(request.startsWith(ECHO_BOOLEAN_REQUEST.substring(0, 67))
+                       && request.endsWith(ECHO_BOOLEAN_REQUEST.substring(68)), "Get a wrong request");
         }
     }
 
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
index c601b66e0cc..53b1cb8b8b1 100644
--- 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
@@ -24,6 +24,7 @@ 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;
 
@@ -69,19 +70,17 @@ public class CxfConsumerProviderTest {
 
     protected final String relativeAddress = "/" + getClass().getSimpleName() + "/test";
     
-    protected final String simpleEndpointAddress = "http://localhost:8080/services"
+    protected final String simpleEndpointAddress = "http://localhost:" + port + "/services"
                                             + relativeAddress;
     protected final String simpleEndpointURI = "cxf://" + relativeAddress
-                                       + "?serviceClass=org.apache.camel.component.cxf.soap.springboot.ServiceProvider";
+                                       + "?serviceClass=org.apache.camel.component.cxf.ServiceProvider";
 
+    static int port = CXFTestSupport.getPort1();
 
     @Autowired
     ProducerTemplate template;
     
-    @Bean
-    public ServletWebServerFactory servletWebServerFactory() {
-        return new UndertowServletWebServerFactory();
-    }
+    
     
     @Test
     public void testInvokingServiceFromHttpCompnent() throws Exception {
@@ -110,6 +109,11 @@ public class CxfConsumerProviderTest {
 
     @Configuration
     public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
 
         @Bean
         public RouteBuilder routeBuilder() {
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java
new file mode 100644
index 00000000000..69da17b4357
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.Handler;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.jaxws.CxfProducer;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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.ApplicationContext;
+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.Soap12;
+import org.apache.cxf.binding.soap.SoapBindingConfiguration;
+import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.transport.http.HTTPConduit;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfEndpointBeanTest.class,
+                           CxfEndpointBeanTest.TestConfiguration.class
+})
+public class CxfEndpointBeanTest {
+    
+    private QName serviceName = QName.valueOf("{http://camel.apache.org/wsdl-first}PersonService");
+    private QName endpointName = QName.valueOf("{http://camel.apache.org/wsdl-first}soap");
+    static int port = CXFTestSupport.getPort1();
+    @Autowired
+    ApplicationContext ctx;
+    
+    @Test
+    public void testCxfEndpointsWithCamelContext() {
+        CamelContext context = ctx.getBean("camelContext", CamelContext.class);
+        // try to create a new CxfEndpoint which could override the old bean's setting
+        CxfEndpoint myLocalCxfEndpoint = (CxfEndpoint)context
+            .getEndpoint("cxf:bean:routerEndpoint?address=http://localhost:" + port + "/services"
+                         + "/CxfEndpointBeanTest/myCamelContext/");
+        assertEquals("http://localhost:" + port + "/services" + "/CxfEndpointBeanTest/myCamelContext/",
+                     myLocalCxfEndpoint.getAddress(), "Got the wrong endpoint address");
+
+        CxfEndpoint routerEndpoint = ctx.getBean("routerEndpoint", CxfEndpoint.class);
+        assertEquals("http://localhost:" + port + "/services" + "/CxfEndpointBeanTest/myCamelContext/",
+                     routerEndpoint.getAddress(), "Got the wrong endpoint address");
+    }
+
+    @Test
+    public void testPropertiesSettingOnCxfClient() throws Exception {
+        CxfEndpoint clientEndpoint = ctx.getBean("clientEndpoint", CxfEndpoint.class);
+        CxfProducer producer = (CxfProducer) clientEndpoint.createProducer();
+        // need to start the producer to get the client
+        producer.start();
+        Client client = producer.getClient();
+        HTTPConduit conduit = (HTTPConduit) client.getConduit();
+        assertEquals("test", conduit.getAuthorization().getUserName(), "Got the wrong user name");
+    }
+    
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            cxfEndpoint.setAddress("/CxfEndpointBeanTest/router");
+            cxfEndpoint.setContinuationTimeout(60000);
+            List<String> schemaLocations = new ArrayList<String>();
+            schemaLocations.add("classpath:wsdl/Message.xsd");
+            cxfEndpoint.setSchemaLocations(schemaLocations);
+            List<Handler> handlers = new ArrayList<Handler>();
+            handlers.add(new JaxwsTestHandler());
+            cxfEndpoint.setHandlers(handlers);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint clientEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfEndpointBeanTest/helloworld");
+            
+            Map<String, Object> properties = new HashMap<String, Object>();
+            AuthorizationPolicy policy = new AuthorizationPolicy();
+            policy.setUserName("test");
+            properties.put("org.apache.cxf.configuration.security.AuthorizationPolicy", policy);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint myEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.wsdl_first.Person.class);
+            cxfEndpoint.setAddress("/CxfEndpointBeanTest/test");
+            cxfEndpoint.setWsdlURL("person.wsdl");
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setLoggingFeatureEnabled(true);
+            cxfEndpoint.setLoggingSizeLimit(200);
+            
+            SoapBindingConfiguration bindingCfg = new SoapBindingConfiguration();
+            bindingCfg.setVersion(Soap12.getInstance());
+            cxfEndpoint.setBindingConfig(bindingCfg);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:start")
+                            .to("cxf:bean:myEndpoint");
+                    from("cxf:bean:myEndpoint").to("mock:result");
+                }
+            };
+        }
+    }
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java
new file mode 100644
index 00000000000..27dded0c7ae
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java
@@ -0,0 +1,167 @@
+/*
+ * 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.net.SocketTimeoutException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.GreeterImplWithSleep;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfMessageHeaderTimeoutTest.class,
+        CxfMessageHeaderTimeoutTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMessageHeaderTimeoutTest {
+    
+    
+    protected static final String GREET_ME_OPERATION = "greetMe";
+    protected static final String TEST_MESSAGE = "Hello World!";
+    protected static final String SERVER_ADDRESS
+            = "/CxfMessageHeaderTimeoutTest/SoapContext/SoapPort";
+
+    
+    
+    static int port = CXFTestSupport.getPort1();
+
+    private Endpoint endpoint;
+    
+    @BeforeEach
+    public void startService() {
+        Greeter implementor = new GreeterImplWithSleep();
+        endpoint = Endpoint.publish(SERVER_ADDRESS, implementor);
+    }
+    
+    @AfterEach
+    public void stopService() {
+        endpoint.stop();
+    }
+    
+    
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testInvokingJaxWsServerWithCxfEndpoint() throws Exception {
+        sendTimeOutMessage("cxf://bean:springEndpoint");
+    }
+
+    protected void sendTimeOutMessage(String endpointUri) throws Exception {
+        Exchange reply = sendJaxWsMessage(endpointUri);
+        Exception e = reply.getException();
+        assertNotNull(e, "We should get the exception cause here");
+        assertTrue(e instanceof SocketTimeoutException, "We should get the socket time out exception here");
+    }
+
+    protected Exchange sendJaxWsMessage(String endpointUri) throws InterruptedException {
+        Exchange exchange = template.send(endpointUri, new Processor() {
+            public void process(final Exchange exchange) {
+                final List<String> params = new ArrayList<>();
+                params.add(TEST_MESSAGE);
+                exchange.getIn().setBody(params);
+                exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
+                // setup the receive timeout dynamically
+                Map<String, Object> requestContext = new HashMap<>();
+                HTTPClientPolicy clientPolicy = new HTTPClientPolicy();
+                clientPolicy.setReceiveTimeout(100);
+                requestContext.put(HTTPClientPolicy.class.getName(), clientPolicy);
+                exchange.getIn().setBody(params);
+                exchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+            }
+        });
+        return exchange;
+    }
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("direct:start").to("cxf:bean:springEndpoint");
+                }
+            };
+        }
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        public CxfEndpoint springEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port 
+                                   + "/services" + SERVER_ADDRESS);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            return cxfEndpoint;
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java
new file mode 100644
index 00000000000..f0b6477c12c
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.non_wrapper.Person;
+import org.apache.camel.non_wrapper.PersonProcessor;
+import org.apache.camel.non_wrapper.PersonService;
+import org.apache.camel.non_wrapper.UnknownPersonFault;
+import org.apache.camel.non_wrapper.types.GetPerson;
+import org.apache.camel.non_wrapper.types.GetPersonResponse;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfNonWrapperTest.class,
+        CxfNonWrapperTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfNonWrapperTest {
+    
+    private static final QName SERVICE_NAME = new QName("http://camel.apache.org/wsdl-first", "PersonService");
+    private static final QName PORT_NAME = new QName("http://camel.apache.org/wsdl-first", "soap");
+
+    
+    static int port = CXFTestSupport.getPort1();
+
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+
+        URL wsdlURL = getClass().getClassLoader().getResource("person-non-wrapper.wsdl");
+        PersonService ss = new PersonService(wsdlURL, new QName("http://camel.apache.org/non-wrapper", "PersonService"));
+        Person client = ss.getSoap();
+        ((BindingProvider) client).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfNonWrapperTest/PersonService/");
+
+        GetPerson request = new GetPerson();
+        request.setPersonId("hello");
+        GetPersonResponse response = client.getPerson(request);
+
+        assertEquals("Bonjour", response.getName(), "we should get the right answer from router");
+
+        request.setPersonId("");
+        try {
+            client.getPerson(request);
+            fail("We expect to get the UnknowPersonFault here");
+        } catch (UnknownPersonFault fault) {
+            // We expect to get fault here
+        }
+    }
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public PersonProcessor personProcessor() {
+            return new PersonProcessor();
+        }
+        
+           
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_NAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_NAME);
+            cxfEndpoint.setServiceClass(org.apache.camel.non_wrapper.Person.class);
+            cxfEndpoint.setAddress("/CxfNonWrapperTest/PersonService/");
+            cxfEndpoint.setDataFormat(DataFormat.POJO);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                    .process("personProcessor");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java
new file mode 100644
index 00000000000..b80190cea7e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java
@@ -0,0 +1,219 @@
+/*
+ * 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.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.jaxws.DefaultCxfBinding;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spi.Synchronization;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfOneWayRouteTest.class,
+        CxfOneWayRouteTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfOneWayRouteTest {
+
+    private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
+    private static final QName PORT_NAME = new QName("http://apache.org/hello_world_soap_http", "SoapPort");
+    private static final String ROUTER_ADDRESS = "/CxfOneWayRouteTest/router";
+
+    private static Exception bindingException;
+    private static boolean bindingDone;
+    private static boolean onCompeletedCalled;
+    
+    static int port = CXFTestSupport.getPort1();
+
+    @BeforeEach
+    public void setup() {
+        bindingException = null;
+        bindingDone = false;
+        onCompeletedCalled = false;
+    }
+    
+    
+    protected Greeter getCXFClient() throws Exception {
+        Service service = Service.create(SERVICE_NAME);
+        service.addPort(PORT_NAME, "http://schemas.xmlsoap.org/soap/", 
+                        "http://localhost:" + port 
+                        + "/services" + ROUTER_ADDRESS);
+        Greeter greeter = service.getPort(PORT_NAME, Greeter.class);
+        return greeter;
+    }
+
+ 
+
+    @EndpointInject("mock:result")
+    MockEndpoint mock;
+    
+       
+    @Bean
+    TestProcessor testProcessor() {
+        return new TestProcessor();
+    }
+    
+    @Test
+    public void testInvokingOneWayServiceFromCXFClient() throws Exception {
+        mock.expectedMessageCount(1);
+        mock.expectedFileExists("target/camel-file/cxf-oneway-route");
+
+        Greeter client = getCXFClient();
+        client.greetMeOneWay("lemac");
+
+        // may need to wait until the oneway call completes 
+        long waitUntil = System.currentTimeMillis() + 10000;
+        while (!bindingDone && System.currentTimeMillis() < waitUntil) {
+            Thread.sleep(1000);
+        }
+
+        mock.assertIsSatisfied();
+        assertTrue(onCompeletedCalled, "UnitOfWork done should be called");
+        assertNull(bindingException, "exception occured: " + bindingException);
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_NAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_NAME);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress(ROUTER_ADDRESS);
+            cxfEndpoint.getInInterceptors().add(new org.apache.cxf.ext.logging.LoggingInInterceptor());
+            cxfEndpoint.getOutInterceptors().add(new org.apache.cxf.ext.logging.LoggingOutInterceptor());
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("org.apache.cxf.oneway.robust", true);
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setCxfBinding(new TestCxfBinding());
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                    .to("log:org.apache.camel?level=DEBUG")
+                    .to("bean:testProcessor")
+                    .to("file://target/camel-file/cxf-oneway-route")
+                    .to("mock:result");
+                }
+            };
+        }
+    }
+    
+    public static class TestProcessor implements Processor {
+        static final byte[] MAGIC = { (byte) 0xca, 0x3e, 0x1e };
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            // just check the MEP here
+            assertEquals(ExchangePattern.InOnly, exchange.getPattern(), "Don't get the right MEP");
+            // adding some binary segment
+            String msg = exchange.getIn().getBody(String.class);
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            bos.write(MAGIC);
+            bos.write(msg.getBytes());
+            exchange.getIn().setBody(bos.toByteArray());
+            // add compliation
+            exchange.getUnitOfWork().addSynchronization(new Synchronization() {
+                @Override
+                public void onComplete(Exchange exchange) {
+                    onCompeletedCalled = true;
+                }
+
+                @Override
+                public void onFailure(Exchange exchange) {
+                    // do nothing here
+                }
+            });
+        }
+    }
+
+    public static class TestCxfBinding extends DefaultCxfBinding {
+
+        @Override
+        public void populateCxfResponseFromExchange(Exchange camelExchange, org.apache.cxf.message.Exchange cxfExchange) {
+            try {
+                super.populateCxfResponseFromExchange(camelExchange, cxfExchange);
+            } catch (RuntimeException e) {
+                bindingException = e;
+                throw e;
+            } finally {
+                bindingDone = true;
+            }
+        }
+
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java
new file mode 100644
index 00000000000..7b716842d80
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java
@@ -0,0 +1,177 @@
+/*
+ * 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.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.BeforeEach;
+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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfPayLoadMessageXmlBindingRouterTest.class,
+                           CxfPayLoadMessageXmlBindingRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayLoadMessageXmlBindingRouterTest {
+
+    protected static final String ROUTER_ADDRESS =  "/CxfPayLoadMessageXmlBindingRouterTest/router";
+    protected static final String SERVICE_ADDRESS = "/CxfPayLoadMessageXmlBindingRouterTest/helloworld";
+
+    protected static String getBindingId() {
+        return "http://cxf.apache.org/bindings/xformat";
+    }
+    
+    static int port = CXFTestSupport.getPort1();;
+    
+    @BeforeEach
+    public void startService() {
+        //start a service
+        ServerFactoryBean svrBean = new ServerFactoryBean();
+
+        svrBean.setAddress(SERVICE_ADDRESS);
+        svrBean.setServiceClass(HelloService.class);
+        svrBean.setServiceBean(new HelloServiceImpl());
+        svrBean.setBindingId(getBindingId());
+        Server server = svrBean.create();
+        server.start();
+    }
+    
+    
+    
+    protected HelloService getCXFClient() throws Exception {
+        ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress("http://localhost:" + port 
+                              + "/services" + ROUTER_ADDRESS);
+        clientBean.setServiceClass(HelloService.class);
+        clientBean.setBindingId(getBindingId());
+
+        HelloService client = (HelloService) proxyFactory.create();
+        return client;
+    }
+    
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+        HelloService client = getCXFClient();
+        String result = client.echo("hello world");
+        assertEquals("echo hello world", result, "we should get the right answer from router");
+
+        int count = client.getInvocationCount();
+        client.ping();
+        //oneway ping invoked, so invocationCount ++
+        assertEquals(client.getInvocationCount(), ++count, "The ping should be invocated");
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+            ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+            return webServerFactory;
+        }
+
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            cxfEndpoint.setAddress(ROUTER_ADDRESS);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setBindingId(getBindingId());
+            return cxfEndpoint;
+        }
+
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            cxfEndpoint.setAddress("http://localhost:" 
+                + port  + "/services" + SERVICE_ADDRESS);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setBindingId(getBindingId());
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("cxf:bean:routerEndpoint").process(new Processor() {
+                        public void process(Exchange exchange) throws Exception {
+                            CxfPayload<?> payload = exchange.getIn().getBody(CxfPayload.class);
+                            List<Source> elements = payload.getBodySources();
+                            assertNotNull(elements, "We should get the elements here");
+                            assertEquals(1, elements.size(), "Get the wrong elements size");
+
+                            Element el = new XmlConverter().toDOMElement(elements.get(0));
+                            assertEquals("http://cxf.component.camel.apache.org/", el.getNamespaceURI(),
+                                    "Get the wrong namespace URI");
+                        }
+
+                    })
+                            .to("cxf:bean:serviceEndpoint");
+
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java
new file mode 100644
index 00000000000..7fa13457755
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java
@@ -0,0 +1,213 @@
+/*
+ * 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.net.URL;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+
+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.PizzaImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.pizza.Pizza;
+import org.apache.camel.pizza.PizzaService;
+import org.apache.camel.pizza.types.CallerIDHeaderType;
+import org.apache.camel.pizza.types.OrderPizzaResponseType;
+import org.apache.camel.pizza.types.OrderPizzaType;
+import org.apache.camel.pizza.types.ToppingsListType;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfPayLoadSoapHeaderSpringTest.class,
+        CxfPayLoadSoapHeaderSpringTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayLoadSoapHeaderSpringTest {
+    
+    private final QName serviceName = new QName("http://camel.apache.org/pizza", "PizzaService");
+    
+    static int port = CXFTestSupport.getPort1();
+
+    protected void start(String n) {
+        Object implementor = new PizzaImpl();
+        String address = "/" + n
+                         + "/new_pizza_service/services/PizzaService";
+        Endpoint.publish(address, implementor);
+    }
+
+    @BeforeEach
+    public void startService() {
+        start(getClass().getSimpleName());
+    }
+
+       
+    
+    @Test
+    public void testPizzaService() {
+        Pizza port = getPort();
+
+        OrderPizzaType req = new OrderPizzaType();
+        ToppingsListType t = new ToppingsListType();
+        t.getTopping().add("test");
+        req.setToppings(t);
+
+        CallerIDHeaderType header = new CallerIDHeaderType();
+        header.setName("Willem");
+        header.setPhoneNumber("108");
+
+        OrderPizzaResponseType res = port.orderPizza(req, header);
+
+        assertEquals(208, res.getMinutesUntilReady());
+    }
+
+    private Pizza getPort() {
+        URL wsdl = getClass().getResource("/pizza_service.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        PizzaService service = new PizzaService(wsdl, serviceName);
+        assertNotNull(service, "Service is null");
+
+        Pizza pizza = service.getPizzaPort();
+        ((BindingProvider) pizza).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/" + getClass().getSimpleName()
+                                                                + "/pizza_service/services/PizzaService");
+        return pizza;
+    }
+
+     
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setWsdlURL("pizza_service.wsdl");
+            cxfEndpoint.setAddress("/" + "CxfPayLoadSoapHeaderSpringTest" 
+                                   + "/pizza_service/services/PizzaService");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setWsdlURL("pizza_service.wsdl");
+            cxfEndpoint.setAddress("http://localhost:" + port  
+                                   + "/services/" + "CxfPayLoadSoapHeaderSpringTest" 
+                                   + "/new_pizza_service/services/PizzaService");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    // START SNIPPET: payload
+                    from("cxf:bean:routerEndpoint").process(new Processor() {
+                        @SuppressWarnings("unchecked")
+                        public void process(Exchange exchange) throws Exception {
+                            CxfPayload<SoapHeader> payload = exchange.getIn().getBody(CxfPayload.class);
+                            List<Source> elements = payload.getBodySources();
+                            assertNotNull(elements, "We should get the elements here");
+                            assertEquals(1, elements.size(), "Get the wrong elements size");
+
+                            Element el = new XmlConverter().toDOMElement(elements.get(0));
+                            elements.set(0, new DOMSource(el));
+                            assertEquals("http://camel.apache.org/pizza/types",
+                                    el.getNamespaceURI(), "Get the wrong namespace URI");
+
+                            List<SoapHeader> headers = payload.getHeaders();
+                            assertNotNull(headers, "We should get the headers here");
+                            assertEquals(1, headers.size(), "Get the wrong headers size");
+                            assertEquals("http://camel.apache.org/pizza/types",
+                                    ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
+                            // alternatively you can also get the SOAP header via the camel header:
+                            headers = exchange.getIn().getHeader(Header.HEADER_LIST, List.class);
+                            assertNotNull(headers, "We should get the headers here");
+                            assertEquals(1, headers.size(), "Get the wrong headers size");
+                            assertEquals("http://camel.apache.org/pizza/types",
+                                    ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
+
+                        }
+
+                    })
+                            .to("cxf:bean:serviceEndpoint");
+                    // END SNIPPET: payload
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java
new file mode 100644
index 00000000000..7c00b156e9d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+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.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfSpringCustomizedExceptionTest.class,
+                           CxfSpringCustomizedExceptionTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfSpringCustomizedExceptionTest {
+
+    private static final String EXCEPTION_MESSAGE = "This is an exception test message";
+    private static final String DETAIL_TEXT = "This is a detail text node";
+    private static final SoapFault SOAP_FAULT;
+    static int port = CXFTestSupport.getPort1();
+
+    static {
+        // START SNIPPET: FaultDefine
+        SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, Fault.FAULT_CODE_CLIENT);
+        Element detail = SOAP_FAULT.getOrCreateDetail();
+        Document doc = detail.getOwnerDocument();
+        Text tn = doc.createTextNode(DETAIL_TEXT);
+        detail.appendChild(tn);
+        // END SNIPPET: FaultDefine
+    }
+    
+    
+    
+    @Bean
+    private CxfEndpoint serviceEndpoint() {
+        CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+        cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+        cxfEndpoint.setAddress("http://localhost:" + port 
+                               + "/services/CxfSpringCustomizedExceptionTest/router");
+        return cxfEndpoint;
+    }
+
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testInvokingServiceFromCamel() throws Exception {
+        try {
+            template.sendBodyAndHeader("direct:start", ExchangePattern.InOut, "hello world", CxfConstants.OPERATION_NAME,
+                    "echo");
+            fail("Should have thrown an exception");
+        } catch (Exception ex) {
+            Throwable result = ex.getCause();
+            assertTrue(result instanceof SoapFault, "Exception is not instance of SoapFault");
+            assertEquals(DETAIL_TEXT, ((SoapFault) result).getDetail().getTextContent(), "Expect to get right detail message");
+            assertEquals("{http://schemas.xmlsoap.org/soap/envelope/}Client", ((SoapFault) result).getFaultCode().toString(),
+                    "Expect to get right fault-code");
+        }
+
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            cxfEndpoint.setAddress("/CxfSpringCustomizedExceptionTest/router");
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:start")
+                            .to("cxf:bean:serviceEndpoint");
+                    from("cxf:bean:routerEndpoint").process(new Processor() {
+                        public void process(final Exchange exchange) {
+                            exchange.getMessage().setBody(SOAP_FAULT);
+                        }
+                    }).to("log:mylog");
+
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java
new file mode 100644
index 00000000000..3c53764ff9e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfSpringRouterTest.class,
+        CxfSpringRouterTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfSpringRouterTest {
+    
+    protected Server server;
+    
+    static int port = CXFTestSupport.getPort1();
+
+    @BeforeEach
+    public void startService() {
+        //start a service
+        ServerFactoryBean svrBean = new ServerFactoryBean();
+
+        svrBean.setAddress("/CxfSpringRouterTest/helloworld");
+        svrBean.setServiceClass(HelloService.class);
+        svrBean.setServiceBean(new HelloServiceImpl());
+        server = svrBean.create();
+        server.start();
+    }
+
+    @AfterEach
+    public void shutdownService() {
+        if (server != null) {
+            server.stop();
+        }
+    }
+
+    
+    
+    
+    @Bean
+    private CxfEndpoint routerEndpoint() {
+        CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+        cxfEndpoint.setServiceClass(HelloService.class);
+        cxfEndpoint.setAddress("/CxfSpringRouterTest/router");
+        return cxfEndpoint;
+    }
+    
+    @Bean
+    private CxfEndpoint serviceEndpoint() {
+        CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+        cxfEndpoint.setServiceClass(HelloService.class);
+        cxfEndpoint.setAddress("http://localhost:" + port 
+                               + "/services/CxfSpringRouterTest/helloworld");
+        return cxfEndpoint;
+    }
+    
+    protected HelloService getCXFClient() throws Exception {
+        ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress("http://localhost:" + port 
+                              + "/services/CxfSpringRouterTest/router");
+        clientBean.setServiceClass(HelloService.class);
+
+        HelloService client = (HelloService) proxyFactory.create();
+        return client;
+    }
+
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+        HelloService client = getCXFClient();
+        String result = client.echo("hello world");
+        assertEquals("echo hello world", result, "we should get the right answer from router");
+
+    }
+
+    @Test
+    public void testOnwayInvocation() throws Exception {
+        HelloService client = getCXFClient();
+        int count = client.getInvocationCount();
+        client.ping();
+        //oneway ping invoked, so invocationCount ++
+        assertEquals(client.getInvocationCount(), ++count, "The ping should be invocated");
+    }
+
+     
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint").to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java
new file mode 100644
index 00000000000..747cf58b95a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java
@@ -0,0 +1,266 @@
+/*
+ * 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.net.SocketTimeoutException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.GreeterImplWithSleep;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfConfigurer;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.support.jsse.KeyManagersParameters;
+import org.apache.camel.support.jsse.KeyStoreParameters;
+import org.apache.camel.support.jsse.SSLContextParameters;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.endpoint.Client;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hello_world_soap_http.Greeter;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, CxfTimeoutTest.class,
+                           CxfTimeoutTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfTimeoutTest {
+
+      
+    static int port = CXFTestSupport.getPort1();;
+    
+    protected static final String GREET_ME_OPERATION = "greetMe";
+    protected static final String TEST_MESSAGE = "Hello World!";
+    protected static final String SERVER_ADDRESS = "/CxfTimeoutTest/SoapContext/SoapPort";
+    protected static final String JAXWS_SERVER_ADDRESS
+            = "http://localhost:" + port + "/services/CxfTimeoutTest/SoapContext/SoapPort";
+
+    private Endpoint endpoint;
+    @BeforeEach
+    public void startService() {
+        Greeter implementor = new GreeterImplWithSleep();
+        endpoint = Endpoint.publish(SERVER_ADDRESS, implementor);
+    }
+    
+    @AfterEach
+    public void stopService() {
+        endpoint.stop();
+    }
+    
+    
+
+    @Test
+    public void testInvokingJaxWsServerWithBusUriParams() throws Exception {
+        sendTimeOutMessage("cxf://" + JAXWS_SERVER_ADDRESS + "?serviceClass=org.apache.hello_world_soap_http.Greeter&bus=#cxf&cxfConfigurer=#origConfigurer");
+    }
+
+    @Test
+    public void testInvokingJaxWsServerWithoutBusUriParams() throws Exception {
+        sendTimeOutMessage("cxf://" + JAXWS_SERVER_ADDRESS + "?serviceClass=org.apache.hello_world_soap_http.Greeter&cxfConfigurer=#origConfigurer");
+    }
+
+    @Test
+    public void testInvokingJaxWsServerWithCxfEndpoint() throws Exception {
+        sendTimeOutMessage("cxf://bean:springEndpoint");
+    }
+
+    @Test
+    public void testInvokingFromCamelRoute() throws Exception {
+        sendTimeOutMessage("direct:start");
+    }
+
+    @Test
+    public void testDoCatchWithTimeOutException() throws Exception {
+        sendTimeOutMessage("direct:doCatch");
+    }
+
+    protected void sendTimeOutMessage(String endpointUri) throws Exception {
+        Exchange reply = sendJaxWsMessage(endpointUri);
+        Exception e = reply.getException();
+        assertNotNull(e, "We should get the exception cause here");
+        assertTrue(e instanceof SocketTimeoutException, "We should get the socket time out exception here");
+    }
+
+    @Autowired
+    ProducerTemplate template;
+    protected Exchange sendJaxWsMessage(String endpointUri) throws InterruptedException {
+        Exchange exchange = template.send(endpointUri, new Processor() {
+            public void process(final Exchange exchange) {
+                final List<String> params = new ArrayList<>();
+                params.add(TEST_MESSAGE);
+                exchange.getIn().setBody(params);
+                exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
+            }
+        });
+        return exchange;
+    }
+
+    public static class MyCxfConfigurer implements CxfConfigurer {
+
+        @Override
+        public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
+            // Do nothing here
+        }
+
+        @Override
+        public void configureClient(Client client) {
+            // reset the timeout option to override the spring configuration one
+            HTTPConduit conduit = (HTTPConduit) client.getConduit();
+            HTTPClientPolicy policy = new HTTPClientPolicy();
+            policy.setReceiveTimeout(60000);
+            conduit.setClient(policy);
+
+        }
+
+        @Override
+        public void configureServer(Server server) {
+            // Do nothing here
+
+        }
+
+    }
+    
+    public static class OrigCxfConfigurer implements CxfConfigurer {
+
+        @Override
+        public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
+            // Do nothing here
+        }
+
+        @Override
+        public void configureClient(Client client) {
+            // reset the timeout option to override the spring configuration one
+            HTTPConduit conduit = (HTTPConduit) client.getConduit();
+            HTTPClientPolicy policy = new HTTPClientPolicy();
+            policy.setReceiveTimeout(100);
+            conduit.setClient(policy);
+
+        }
+
+        @Override
+        public void configureServer(Server server) {
+            // Do nothing here
+
+        }
+
+    }
+    
+    
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        HostnameVerifier defaultHostnameVerifier() {
+            return new org.apache.cxf.transport.https.httpclient.DefaultHostnameVerifier();
+        }
+        
+        @Bean
+        MyCxfConfigurer myConfigurer() {
+            return new MyCxfConfigurer();
+        }
+        
+        @Bean
+        OrigCxfConfigurer origConfigurer() {
+            return new OrigCxfConfigurer();
+        }
+        
+        @Bean
+        SSLContextParameters mySslContext() {
+            SSLContextParameters sslContext = new SSLContextParameters();
+            KeyManagersParameters keyManager = new KeyManagersParameters();
+            keyManager.setKeyPassword("changeit");
+            KeyStoreParameters keyStore = new KeyStoreParameters();
+            keyStore.setPassword("changeit");
+            keyStore.setResource("/localhost.p12");
+            keyManager.setKeyStore(keyStore);
+            sslContext.setKeyManagers(keyManager);
+            return sslContext;
+        }
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+            ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+            return webServerFactory;
+        }
+
+        
+        @Bean
+        CxfEndpoint springEndpoint() {
+            
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress(JAXWS_SERVER_ADDRESS);
+            cxfEndpoint.setCxfConfigurer(new OrigCxfConfigurer());
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("direct:start").
+                        to("cxf:bean:springEndpoint?sslContextParameters=#mySslContext&hostnameVerifier=#defaultHostnameVerifier");
+                    from("direct:doCatch").
+                        to("cxf:bean:springEndpoint");
+                   
+                   
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java
new file mode 100644
index 00000000000..24a6e4e40cd
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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 static org.apache.camel.test.junit5.TestSupport.deleteDirectory;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+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.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        FileToCxfMessageDataFormatTest.class,
+        FileToCxfMessageDataFormatTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class FileToCxfMessageDataFormatTest {
+
+    
+    private static final Logger LOG = LoggerFactory.getLogger(FileToCxfMessageDataFormatTest.class);
+    
+    private Server server;
+    
+    static int port = CXFTestSupport.getPort1();
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        deleteDirectory("target/filetocxf");
+
+        // set CXF
+        ServerFactoryBean factory = new ServerFactoryBean();
+
+        factory.setAddress("/FileToCxfMessageDataFormatTest/router");
+        factory.setServiceClass(HelloService.class);
+        factory.setServiceBean(new HelloServiceImpl());
+
+        server = factory.create();
+        server.start();
+
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        server.stop();
+        server.destroy();
+    }
+
+    
+    
+    
+    @EndpointInject("mock:result")
+    MockEndpoint mock;
+    
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testFileToCxfMessageDataFormat() throws Exception {
+        
+        mock.expectedMessageCount(1);
+
+        template.sendBodyAndHeader("file:target/filetocxf", createBody(), Exchange.FILE_NAME, "payload.xml");
+
+        mock.assertIsSatisfied();
+
+        String out = mock.getReceivedExchanges().get(0).getIn().getBody(String.class);
+        assertNotNull(out);
+        LOG.info("Reply payload as a String:\n" + out);
+        assertTrue(out.contains("echo Camel"), "Should invoke the echo operation");
+    }
+
+    private String createBody() throws Exception {
+        return "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:cxf=\"http://cxf.component.camel.apache.org/\">\n"
+               + "   <soapenv:Header/>\n"
+               + "   <soapenv:Body>\n"
+               + "      <cxf:echo>\n"
+               + "          <cxf:arg0>Camel</cxf:arg0>\n"
+               + "      </cxf:echo>\n"
+               + "   </soapenv:Body>\n"
+               + "</soapenv:Envelope>";
+    }
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port 
+                                   + "/services" + "/FileToCxfMessageDataFormatTest/router");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("file:target/filetocxf")
+                    .to("log:request")
+                    .to(ExchangePattern.InOut, "routerEndpoint")
+                    .to("log:reply")
+                    .to("mock:result");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java
new file mode 100644
index 00000000000..38e78a882fc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java
@@ -0,0 +1,82 @@
+/*
+ * 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.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+public class JaxwsTestHandler implements SOAPHandler<SOAPMessageContext> {
+
+    private int faultCount;
+    private int messageCount;
+    private int getHeadersCount;
+
+    public JaxwsTestHandler() {
+    }
+    
+    public int getGetHeadersCount() {
+        return getHeadersCount;
+    }
+
+    @Override
+    public Set<QName> getHeaders() {
+        getHeadersCount++;
+        return null;
+    }
+
+    @Override
+    public void close(MessageContext messagecontext) {
+
+    }
+
+    @Override
+    public boolean handleFault(SOAPMessageContext messagecontext) {
+        faultCount++;
+        return true;
+    }
+
+    @Override
+    public boolean handleMessage(SOAPMessageContext messagecontext) {
+        messageCount++;
+        return true;
+    }
+
+    public void reset() {
+        faultCount = 0;
+        messageCount = 0;
+        getHeadersCount = 0;
+    }
+
+    public int getFaultCount() {
+        return faultCount;
+    }
+
+    public int getMessageCount() {
+        return messageCount;
+    }
+
+    @Override
+    public String toString() {
+        return "faultCount=" + faultCount + ", messageCount="
+               + messageCount + ", getHeadersCount=" + getHeadersCount;
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java
new file mode 100644
index 00000000000..90fbfc7348d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        LoggingInterceptorInMessageModeTest.class,
+        LoggingInterceptorInMessageModeTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class LoggingInterceptorInMessageModeTest {
+    
+    
+    protected static final String ROUTER_ADDRESS = "/LoggingInterceptorInMessageModeTest/router";
+    protected static final String SERVICE_ADDRESS
+            = "/LoggingInterceptorInMessageModeTest/helloworld";
+
+    static Server server;
+
+    
+    static int port = CXFTestSupport.getPort1();
+
+        
+    @BeforeEach
+    public void startService() {
+      //start a service
+        ServerFactoryBean svrBean = new ServerFactoryBean();
+
+        svrBean.setAddress(SERVICE_ADDRESS);
+        svrBean.setServiceClass(HelloService.class);
+        svrBean.setServiceBean(new HelloServiceImpl());
+
+        server = svrBean.create();
+    }
+    
+    @AfterEach
+    public void stopService() {
+        server.stop();
+        server.destroy();
+    }
+    
+    
+    @Autowired
+    protected CamelContext context;
+    
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+
+        LoggingOutInterceptor logInterceptor = null;
+
+        for (Interceptor<?> interceptor : context.getEndpoint("cxf:bean:serviceEndpoint", CxfSpringEndpoint.class)
+                .getOutInterceptors()) {
+            if (interceptor instanceof LoggingOutInterceptor) {
+                logInterceptor = LoggingOutInterceptor.class.cast(interceptor);
+                break;
+            }
+        }
+
+        assertNotNull(logInterceptor);
+        // StringPrintWriter writer = new StringPrintWriter();
+        // Unfortunately, LoggingOutInterceptor does not have a setter for writer so
+        // we can't capture the output to verify.
+        // logInterceptor.setPrintWriter(writer);
+
+        ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress("http://localhost:" + port
+                              + "/services" + ROUTER_ADDRESS);
+        clientBean.setServiceClass(HelloService.class);
+
+        HelloService client = (HelloService) proxyFactory.create();
+
+        String result = client.echo("hello world");
+        assertEquals("echo hello world", result, "we should get the right answer from router");
+
+    }
+
+    @SuppressWarnings("unused")
+    private static final class StringPrintWriter extends PrintWriter {
+        private StringPrintWriter() {
+            super(new StringWriter());
+        }
+
+        private StringPrintWriter(int initialSize) {
+            super(new StringWriter(initialSize));
+        }
+
+        private String getString() {
+            flush();
+            return ((StringWriter) out).toString();
+        }
+    }
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint").to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        public CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress(ROUTER_ADDRESS);
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "RAW");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public CxfEndpoint serviceEndpoint(LoggingOutInterceptor loggingOutInterceptor) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port 
+                                   + "/services" + SERVICE_ADDRESS);
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "RAW");
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.getOutInterceptors().add(loggingOutInterceptor);
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        public LoggingOutInterceptor loggingOutInterceptor() {
+            LoggingOutInterceptor logger = new LoggingOutInterceptor("write");
+            return logger;
+        }
+    }
+    
+    
+}
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
deleted file mode 100644
index d64a58c9c59..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 897eaaf503c..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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/SpringBusFactoryTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java
new file mode 100644
index 00000000000..697d8361658
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.Bus;
+import org.apache.cxf.binding.soap.SoapBindingFactory;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           SpringBusFactoryTest.class,
+                           
+})
+public class SpringBusFactoryTest {
+    @Autowired
+    ApplicationContext ctx;
+    
+    @Bean
+    Bus cxfBus() {
+        SpringBusFactory bf = new SpringBusFactory();
+        return bf.createBus("META-INF/cxf/cxf.xml", false);
+    }
+    
+    @Bean
+    Bus myBus() {
+        SpringBusFactory bf = new SpringBusFactory();
+        return bf.createBus("META-INF/cxf/cxf.xml", true);
+    }
+    
+    @Test
+    public void getTheBusInstance() {
+        Bus bus = ctx.getBean("cxfBus", Bus.class);
+        assertNotNull(bus, "The bus should not be null");
+
+        bus = ctx.getBean("myBus", Bus.class);
+        assertNotNull(bus, "The bus should not be null");
+
+        SoapBindingFactory soapBindingFactory = bus.getExtension(SoapBindingFactory.class);
+        assertNotNull(soapBindingFactory, "You should find the factory here");
+    }
+    
+}
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
deleted file mode 100644
index b166016bb8d..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java
new file mode 100644
index 00000000000..8ee6f77d530
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.converter;
+
+
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.non_wrapper.Person;
+import org.apache.camel.non_wrapper.types.GetPerson;
+import org.apache.camel.non_wrapper.types.GetPersonResponse;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        PayLoadConvertToPOJOTest.class,
+        PayLoadConvertToPOJOTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+        
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class PayLoadConvertToPOJOTest {
+    
+    
+    static int port = CXFTestSupport.getPort1();
+
+    @Test
+    public void testClient() throws Exception {
+
+        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
+        factory.setAddress("http://localhost:" + port + "/services/"
+                           + getClass().getSimpleName() + "/CamelContext/RouterPort");
+        factory.setServiceClass(Person.class);
+        Person person = factory.create(Person.class);
+        GetPerson payload = new GetPerson();
+        payload.setPersonId("1234");
+
+        GetPersonResponse reply = person.getPerson(payload);
+        assertEquals("1234", reply.getPersonId(), "Get the wrong person id.");
+
+    }
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        public CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/PayLoadConvertToPOJOTest/CamelContext/RouterPort");
+            cxfEndpoint.setServiceClass(org.apache.camel.non_wrapper.Person.class);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint").streamCaching().process(new Processor() {
+
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            // just try to turn the payload to the parameter we want
+                            // to use
+                            GetPerson request = exchange.getIn().getBody(GetPerson.class);
+
+                            GetPersonResponse reply = new GetPersonResponse();
+                            reply.setPersonId(request.getPersonId());
+                            exchange.getMessage().setBody(reply);
+                        }
+
+                    });
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java
new file mode 100644
index 00000000000..1af7b5e57cd
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.dispatch;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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 static org.junit.jupiter.api.Assertions.assertTrue;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfDispatchMessageTest.class,
+                           CxfDispatchMessageTest.TestConfiguration.class,
+                           CxfDispatchTestSupport.ServletConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfDispatchMessageTest extends CxfDispatchTestSupport {
+
+    @Autowired
+    ProducerTemplate template;
+    
+    
+    
+    
+    
+    @Test
+    public void testDipatchMessage() throws Exception {
+        final String name = "Tila";
+        Exchange exchange = sendJaxWsDispatchMessage(name, false);
+        assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+        org.apache.camel.Message response = exchange.getMessage();
+        assertNotNull(response, "The response message must not be null");
+
+        String value = decodeResponseFromMessage(response.getBody(InputStream.class), exchange);
+        assertTrue(value.endsWith(name), "The response body must match the request");
+    }
+
+    @Test
+    public void testDipatchMessageOneway() throws Exception {
+        final String name = "Tila";
+        Exchange exchange = sendJaxWsDispatchMessage(name, true);
+        assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+        org.apache.camel.Message response = exchange.getOut();
+        assertNotNull(response, "The response message must not be null");
+
+        assertNull(response.getBody(), "The response body must be null");
+    }
+
+    protected Exchange sendJaxWsDispatchMessage(final String name, final boolean oneway) {
+        Exchange exchange = template.send("direct:producer", new Processor() {
+            public void process(final Exchange exchange) {
+                InputStream request
+                        = encodeRequestInMessage(oneway ? MESSAGE_ONEWAY_TEMPLATE : MESSAGE_TEMPLATE, name, exchange);
+                exchange.getIn().setBody(request, InputStream.class);
+                // set the operation for oneway; otherwise use the default operation                
+                if (oneway) {
+                    exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, INVOKE_ONEWAY_NAME);
+                }
+            }
+        });
+        return exchange;
+    }
+
+    private static InputStream encodeRequestInMessage(String form, String name, Exchange exchange) {
+        String payloadstr = String.format(form, name);
+        InputStream message = null;
+        try {
+            message = new ByteArrayInputStream(payloadstr.getBytes("utf-8"));
+        } catch (Exception e) {
+            // ignore and let it fail
+        }
+        return message;
+    }
+
+    private String decodeResponseFromMessage(InputStream message, Exchange exchange) {
+        String value = null;
+        try {
+            Document doc = getDocumentBuilderFactory().newDocumentBuilder().parse(message);
+            value = getResponseType(doc.getDocumentElement());
+        } catch (Exception e) {
+            // ignore and let it fail
+        }
+        return value;
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" 
+                + "/CxfDispatchMessageTest/SoapContext/GreeterPort");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            cxfEndpoint.setSynchronous(true);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:producer")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java
new file mode 100644
index 00000000000..08f2b5fe6e9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.dispatch;
+
+import java.io.ByteArrayInputStream;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.converter.CxfPayloadConverter;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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 static org.junit.jupiter.api.Assertions.assertTrue;
+
+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.binding.soap.SoapHeader;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfDispatchPayloadTest.class,
+                           CxfDispatchPayloadTest.TestConfiguration.class,
+                           CxfDispatchTestSupport.ServletConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfDispatchPayloadTest extends CxfDispatchTestSupport {
+
+    @Autowired
+    ProducerTemplate template;
+    
+    
+    @Test
+    public void testDispatchPayload() throws Exception {
+        final String name = "Tila";
+        Exchange exchange = sendJaxWsDispatchPayload(name, false);
+        assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+        org.apache.camel.Message response = exchange.getMessage();
+        assertNotNull(response, "The response must not be null");
+
+        String value = decodeResponseFromPayload((CxfPayload<?>) response.getBody(CxfPayload.class), exchange);
+        assertTrue(value.endsWith(name), "The response must match the request");
+    }
+
+    @Test
+    public void testDispatchPayloadOneway() throws Exception {
+        final String name = "Tila";
+        Exchange exchange = sendJaxWsDispatchPayload(name, true);
+        assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+        org.apache.camel.Message response = exchange.getOut();
+        assertNotNull(response, "The response must not be null");
+
+        assertNull(response.getBody(), "The response must be null");
+    }
+
+    private Exchange sendJaxWsDispatchPayload(final String name, final boolean oneway) {
+        Exchange exchange = template.send("direct:producer", new Processor() {
+            public void process(final Exchange exchange) {
+                CxfPayload<SoapHeader> request = encodeRequestInPayload(oneway ? PAYLOAD_ONEWAY_TEMPLATE : PAYLOAD_TEMPLATE,
+                        name, exchange);
+                exchange.getIn().setBody(request, CxfPayload.class);
+                exchange.getIn().setHeader(CxfConstants.OPERATION_NAMESPACE, DISPATCH_NS);
+                // set the operation for oneway; otherwise use the default operation                
+                if (oneway) {
+                    exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, INVOKE_ONEWAY_NAME);
+                }
+            }
+        });
+        return exchange;
+    }
+
+    private static <T> CxfPayload<T> encodeRequestInPayload(String form, String name, Exchange exchange) {
+        String payloadstr = String.format(form, name);
+        CxfPayload<T> payload = null;
+        try {
+            Document doc = getDocumentBuilderFactory().newDocumentBuilder()
+                    .parse(new ByteArrayInputStream(payloadstr.getBytes("utf-8")));
+            payload = CxfPayloadConverter.documentToCxfPayload(doc, exchange);
+        } catch (Exception e) {
+            // ignore and let it fail
+        }
+        return payload;
+    }
+
+    private <T> String decodeResponseFromPayload(CxfPayload<T> payload, Exchange exchange) {
+        String value = null;
+        NodeList nodes = CxfPayloadConverter.cxfPayloadToNodeList(payload, exchange);
+        if (nodes != null && nodes.getLength() == 1 && nodes.item(0) instanceof Element) {
+            value = getResponseType((Element) nodes.item(0));
+        }
+        return value;
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" 
+                + "/CxfDispatchPayloadTest/SoapContext/GreeterPort");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setSynchronous(true);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:producer")
+                        .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java
new file mode 100644
index 00000000000..86609b0b78e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java
@@ -0,0 +1,122 @@
+/*
+ * 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.dispatch;
+
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.ws.Endpoint;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfDispatchTestSupport.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public abstract class CxfDispatchTestSupport {
+
+    
+      
+    protected static final String DISPATCH_NS = "http://camel.apache.org/cxf/jaxws/dispatch";
+    protected static final String INVOKE_NAME = "Invoke";
+    protected static final String INVOKE_ONEWAY_NAME = "InvokeOneWay";
+
+    protected static final String PAYLOAD_TEMPLATE
+            = "<ns1:greetMe xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\"><ns1:requestType>%s</ns1:requestType></ns1:greetMe>";
+    protected static final String PAYLOAD_ONEWAY_TEMPLATE
+            = "<ns1:greetMeOneWay xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\"><ns1:requestType>%s</ns1:requestType></ns1:greetMeOneWay>";
+    protected static final String MESSAGE_TEMPLATE
+            = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"
+              + PAYLOAD_TEMPLATE
+              + "</soap:Body></soap:Envelope>";
+    protected static final String MESSAGE_ONEWAY_TEMPLATE
+            = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"
+              + PAYLOAD_ONEWAY_TEMPLATE
+              + "</soap:Body></soap:Envelope>";
+    private static DocumentBuilderFactory documentBuilderFactory;
+    
+    static int port = CXFTestSupport.getPort1();
+
+    protected Endpoint endpoint;
+    
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        String address = "/"
+                         + getClass().getSimpleName() + "/SoapContext/GreeterPort";
+        endpoint = Endpoint.publish(address, implementor);
+    }
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    protected static String getResponseType(Element node) {
+        NodeList nodes = node.getElementsByTagNameNS("http://apache.org/hello_world_soap_http/types", "responseType");
+        if (nodes != null && nodes.getLength() == 1) {
+            Node c = nodes.item(0).getFirstChild();
+            if (c != null) {
+                return c.getNodeValue();
+            }
+        }
+        return null;
+    }
+
+    protected static synchronized DocumentBuilderFactory getDocumentBuilderFactory() {
+        if (documentBuilderFactory == null) {
+            documentBuilderFactory = DocumentBuilderFactory.newInstance();
+            documentBuilderFactory.setNamespaceAware(true);
+            documentBuilderFactory.setIgnoringElementContentWhitespace(true);
+            documentBuilderFactory.setIgnoringComments(true);
+        }
+        return documentBuilderFactory;
+    }
+    
+    @Configuration
+    class ServletConfiguration {
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+
+    }
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java
new file mode 100644
index 00000000000..cd05b630ac9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java
@@ -0,0 +1,188 @@
+/*
+ * 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.dispatch;
+
+
+
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.handler.Handler;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.ParameterProcessor;
+import org.apache.camel.component.cxf.SoapTargetBean;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+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.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.wsdl_first.JaxwsTestHandler;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.SOAPService;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfSoapMessageProviderTest.class,
+        CxfSoapMessageProviderTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfSoapMessageProviderTest {
+    
+   
+    
+    static int port = CXFTestSupport.getPort1();
+
+
+           
+    @Test
+    public void testSOAPMessageModeDocLit() throws Exception {
+        JaxwsTestHandler fromHandler = getMandatoryBean(JaxwsTestHandler.class, "fromEndpointJaxwsHandler");
+        fromHandler.reset();
+
+        QName serviceName = new QName("http://apache.org/hello_world_soap_http", "SOAPProviderService");
+        QName portName = new QName("http://apache.org/hello_world_soap_http", "SoapProviderPort");
+
+        URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+        assertNotNull(wsdl);
+
+        SOAPService service = new SOAPService(wsdl, serviceName);
+        assertNotNull(service);
+
+        String response1 = new String("TestSOAPOutputPMessage");
+        String response2 = new String("Bonjour");
+        try {
+            Greeter greeter = service.getPort(portName, Greeter.class);
+            ((BindingProvider) greeter).getRequestContext()
+                    .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                            "http://localhost:" + port + "/services/CxfSoapMessageProviderTest/SoapContext/SoapProviderPort");
+            for (int idx = 0; idx < 2; idx++) {
+                String greeting = greeter.greetMe("Milestone-" + idx);
+                assertNotNull(greeting, "no response received from service");
+                assertEquals(response1, greeting);
+
+                String reply = greeter.sayHi();
+                assertNotNull(reply, "no response received from service");
+                assertEquals(response2, reply);
+            }
+        } catch (UndeclaredThrowableException ex) {
+            throw (Exception) ex.getCause();
+        }
+
+        assertEquals(8, fromHandler.getMessageCount(), "Can't get the right message count");
+        assertEquals(0, fromHandler.getFaultCount(), "Can't get the right fault count");
+       
+    }
+    
+    @Autowired
+    AbstractApplicationContext applicationContext;
+    
+    private <T> T getMandatoryBean(Class<T> type, String name) {
+        Object value = applicationContext.getBean(name);
+        assertNotNull(value, "No spring bean found for name <" + name + ">");
+        if (type.isInstance(value)) {
+            return type.cast(value);
+        } else {
+            fail("Spring bean <" + name + "> is not an instanceof " + type.getName() + " but is of type "
+                 + ObjectHelper.className(value));
+            return null;
+        }
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public SoapTargetBean targetBean() {
+            return new SoapTargetBean();
+        }
+        
+        @Bean
+        public ParameterProcessor parameterProcessor() {
+            return new ParameterProcessor();
+        }
+        
+        @Bean
+        public JaxwsTestHandler fromEndpointJaxwsHandler() {
+            return new JaxwsTestHandler();
+        }
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint soapMessageEndpoint(JaxwsTestHandler fromEndpointJaxwsHandler) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.SoapMessageProvider.class);
+            cxfEndpoint.setAddress("/CxfSoapMessageProviderTest/SoapContext/SoapProviderPort");
+            List<Handler> handlers = new ArrayList<Handler>();
+            handlers.add(fromEndpointJaxwsHandler);
+            cxfEndpoint.setHandlers(handlers);
+            return cxfEndpoint;
+        }
+        
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:soapMessageEndpoint")
+                    .process("parameterProcessor")
+                    .to("bean:targetBean?method=invokeSoapMessage");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java
new file mode 100644
index 00000000000..85babddb697
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.greeterroute;
+
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.http.base.HttpOperationFailedException;
+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.assertThrows;
+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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.NoSuchCodeLitFault;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           AbstractCXFGreeterRouterTest.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public abstract class AbstractCXFGreeterRouterTest {
+
+    
+    private final String testDocLitFaultBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+                                               + "<soap:Body><testDocLitFault xmlns=\"http://apache.org/hello_world_soap_http/types\">"
+                                               + "<faultType>NoSuchCodeLitFault</faultType></testDocLitFault>"
+                                               + "</soap:Body></soap:Envelope>";
+    
+    protected String routerAddress = "http://localhost:" + port + "/services/" 
+        + getClass().getSimpleName() + "/CamelContext/RouterPort";
+    
+    protected final QName serviceName = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
+    protected final QName routerPortName = new QName("http://apache.org/hello_world_soap_http", "RouterPort");
+    protected final QName endpointName = new QName("http://apache.org/hello_world_soap_http", "SoapPort");
+
+    static int port = CXFTestSupport.getPort1();
+    
+    @Autowired
+    ProducerTemplate template;
+
+    
+
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+        Service service = Service.create(serviceName);
+        service.addPort(routerPortName, "http://schemas.xmlsoap.org/soap/",
+                routerAddress);
+        Greeter greeter = service.getPort(routerPortName, Greeter.class);
+
+        String reply = greeter.greetMe("test");
+        assertNotNull(reply, "No response received from service");
+        assertEquals("Hello test", reply, "Got the wrong reply");
+        reply = greeter.sayHi();
+        assertNotNull(reply, "No response received from service");
+        assertEquals("Bonjour", reply, "Got the wrong reply");
+
+        greeter.greetMeOneWay("call greetMe OneWay !");
+
+        // test throw the exception
+        try {
+            greeter.testDocLitFault("NoSuchCodeLitFault");
+            // should get the exception here
+            fail("Should get the NoSuchCodeLitFault here.");
+        } catch (NoSuchCodeLitFault fault) {
+            // expect the fault here
+            assertNotNull(fault.getFaultInfo(), "The fault info should not be null");
+        }
+
+    }
+
+    @Test
+    public void testRoutingSOAPFault() {
+        Exception ex = assertThrows(RuntimeCamelException.class,
+                () -> template.sendBody(routerAddress, testDocLitFaultBody));
+
+        assertTrue(ex.getCause() instanceof HttpOperationFailedException, "It should get the response error");
+        assertEquals(500, ((HttpOperationFailedException) ex.getCause()).getStatusCode(),
+                "Get a wrong response code");
+    }
+
+    @Test
+    public void testPublishEndpointUrl() throws Exception {
+        String response = template.requestBody(routerAddress
+                                                + "?wsdl",
+                null, String.class);
+        assertTrue(response.indexOf("http://www.simple.com/services/test") > 0, "Can't find the right service location.");
+    }
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java
new file mode 100644
index 00000000000..8e07c18b1c9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.WriteXmlDeclarationInterceptor;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CXFGreeterEnrichTest.class,
+                           CXFGreeterEnrichTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CXFGreeterEnrichTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CXFGreeterEnrichTest/SoapContext/SoapPort";
+    protected Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CXFGreeterEnrichTest/CamelContext/RouterPort");
+            cxfEndpoint.setSkipFaultLogging(true);
+            //This interceptor will force the CXF server send the XML start document to client
+            cxfEndpoint.getOutInterceptors().
+                add(new WriteXmlDeclarationInterceptor());
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("cxf:bean:routerEndpoint")
+                            .enrich().simple("ref:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java
new file mode 100644
index 00000000000..2b4bbca1988
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.WriteXmlDeclarationInterceptor;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CXFGreeterRouterTest.class,
+                           CXFGreeterRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CXFGreeterRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CXFGreeterRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CXFGreeterRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setSkipFaultLogging(true);
+            //This interceptor will force the CXF server send the XML start document to client
+            cxfEndpoint.getOutInterceptors().
+                add(new WriteXmlDeclarationInterceptor());
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java
new file mode 100644
index 00000000000..f032ad1d1be
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterCXFMessageRouterTest.class,
+                           CxfGreeterCXFMessageRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterCXFMessageRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterCXFMessageRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CxfGreeterCXFMessageRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setLoggingFeatureEnabled(true);
+            cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+            return cxfEndpoint;
+        }
+
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java
new file mode 100644
index 00000000000..685833f86b3
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterCXFMessageWithoutSEIRouterTest.class,
+                           CxfGreeterCXFMessageWithoutSEIRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterCXFMessageWithoutSEIRouterTest extends CxfGreeterCXFMessageRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterCXFMessageWithoutSEIRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setAddress("/CxfGreeterCXFMessageWithoutSEIRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setLoggingFeatureEnabled(true);
+            cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+                
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java
new file mode 100644
index 00000000000..ef28b0b29d2
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterConverterRouterTest.class,
+                           CxfGreeterConverterRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterConverterRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterConverterRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("/CxfGreeterConverterRouterTest/CamelContext/RouterPort");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            return cxfEndpoint;
+        }
+
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java
new file mode 100644
index 00000000000..c6a73377c43
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.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.greeterroute;
+
+
+import javax.xml.ws.Endpoint;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfGreeterMessageCamelHttpRouterTest.class,
+        CxfGreeterMessageCamelHttpRouterTest.TestConfiguration.class,
+        AbstractCXFGreeterRouterTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfGreeterMessageCamelHttpRouterTest extends CxfGreeterMessageRouterTest {
+
+    protected static Endpoint endpoint;
+    protected static String serverAddress = "http://localhost:" + port + "/services" 
+                                            + "/CxfGreeterMessageCamelHttpRouterTest/SoapContext/SoapPort";
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        String address = "/CxfGreeterMessageCamelHttpRouterTest/SoapContext/SoapPort";
+        endpoint = Endpoint.publish(address, implementor);
+    }
+    
+        
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CxfGreeterMessageCamelHttpRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .removeHeaders("CamelHttp*")
+                            .to(serverAddress + "?throwExceptionOnFailure=false");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java
new file mode 100644
index 00000000000..4c1833ab9b5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterMessageRouterTest.class,
+                           CxfGreeterMessageRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterMessageRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterMessageRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CxfGreeterMessageRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setLoggingFeatureEnabled(true);
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            return cxfEndpoint;
+        }
+
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java
new file mode 100644
index 00000000000..77888e53eaf
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterPayLoadRouterTest.class,
+                           CxfGreeterPayLoadRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterPayLoadRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterPayLoadRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CxfGreeterPayLoadRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setLoggingFeatureEnabled(true);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf://http://localhost:" + port + "/services" + backServiceAddress
+                                + "?wsdlURL=testutils/hello_world.wsdl" 
+                                + "&dataFormat=PAYLOAD&serviceClass=org.apache.hello_world_soap_http.Greeter");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java
new file mode 100644
index 00000000000..cd409f5c118
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.TestCxfFeature;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterPayLoadWithFeatureRouterTest.class,
+                           CxfGreeterPayLoadWithFeatureRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterPayLoadWithFeatureRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterPayLoadWithFeatureRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+            cxfEndpoint.setAddress("/CxfGreeterPayLoadWithFeatureRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.getFeatures().add(new TestCxfFeature());
+            return cxfEndpoint;
+        }
+
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    errorHandler(noErrorHandler());
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java
new file mode 100644
index 00000000000..f17f3910089
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfGreeterWSDLOnlyRouterTest.class,
+                           CxfGreeterWSDLOnlyRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterWSDLOnlyRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfGreeterWSDLOnlyRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        Object implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/CxfGreeterWSDLOnlyRouterTest/CamelContext/RouterPort");
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java
new file mode 100644
index 00000000000..5cca137bdb3
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Service;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+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.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfPayloadProviderRouterTest.class,
+                           CxfPayloadProviderRouterTest.TestConfiguration.class,
+                           AbstractCXFGreeterRouterTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadProviderRouterTest extends AbstractCXFGreeterRouterTest {
+
+    private static String backServiceAddress = "/CxfPayloadProviderRouterTest/SoapContext/SoapPort";
+    protected static Endpoint endpoint;
+    protected static GreeterImpl implementor;
+    
+
+    @AfterEach
+    public void stopService() {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @BeforeEach
+    public void startService() {
+        implementor = new GreeterImpl();
+        endpoint = Endpoint.publish(backServiceAddress, implementor);
+    }
+
+    @Override
+    @Test
+    public void testPublishEndpointUrl() throws Exception {
+        final String path = getClass().getSimpleName() + "/CamelContext/RouterPort/" + getClass().getSimpleName();
+        String response = template.requestBody("http://localhost:" + port + "/services/" + path
+                                               + "?wsdl",
+                null, String.class);
+        assertTrue(response.indexOf(path) > 0, "Can't find the right service location.");
+    }
+
+    @Test
+    public void testInvokeGreetMeOverProvider() throws Exception {
+        Service service = Service.create(serviceName);
+        service.addPort(routerPortName, "http://schemas.xmlsoap.org/soap/",
+                "http://localhost:" + port + "/services/"
+                    + getClass().getSimpleName()
+                    + "/CamelContext/RouterPort");
+        Greeter greeter = service.getPort(routerPortName, Greeter.class);
+        org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(greeter);
+        VerifyInboundInterceptor icp = new VerifyInboundInterceptor();
+        client.getInInterceptors().add(icp);
+
+        int ic = implementor.getInvocationCount();
+
+        icp.setCalled(false);
+        String reply = greeter.greetMe("test");
+        assertEquals("Hello test", reply, "Got the wrong reply");
+        assertTrue(icp.isCalled(), "No Inbound message received");
+        assertEquals(++ic, implementor.getInvocationCount(), "The target service not invoked");
+
+        icp.setCalled(false);
+        greeter.greetMeOneWay("call greetMe OneWay !");
+        assertFalse(icp.isCalled(), "An unnecessary inbound message");
+        // wait a few seconds for the async oneway service to be invoked
+        Thread.sleep(3000);
+        assertEquals(++ic, implementor.getInvocationCount(), "The target service not invoked");
+    }
+
+    static class VerifyInboundInterceptor extends AbstractPhaseInterceptor<Message> {
+        private boolean called;
+
+        VerifyInboundInterceptor() {
+            super(Phase.USER_PROTOCOL);
+        }
+
+        @Override
+        public void handleMessage(Message message) throws Fault {
+            called = true;
+        }
+
+        public boolean isCalled() {
+            return called;
+        }
+
+        public void setCalled(boolean b) {
+            called = b;
+        }
+
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/CxfPayloadProviderRouterTest/CamelContext/RouterPort");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("jaxws.provider.interpretNullAsOneway", true);
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setSynchronous(true);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            cxfEndpoint.setSynchronous(true);
+            return cxfEndpoint;
+        }
+
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint")
+                            .setHeader("operationNamespace", constant("http://camel.apache.org/cxf/jaxws/dispatch"))
+                            .setHeader("operationName", constant("Invoke"))
+                            .to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+    
+    
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java
new file mode 100644
index 00000000000..832e6c1fcd5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.jms;
+
+
+
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfEndpointJMSConsumerTest.class,
+        CxfEndpointJMSConsumerTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }
+)
+public class CxfEndpointJMSConsumerTest {
+
+    private String namespace = "http://apache.org/hello_world_soap_http";
+    private QName serviceName = new QName(namespace, "SOAPService");
+    private QName endpointName = new QName(namespace, "SoapPort");
+    // Here we just the address with JMS URI
+    String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue"
+                     + "?jndiInitialContextFactory"
+                     + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
+                     + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL="
+                     + "vm://localhost";
+        
+    
+    
+    @Test
+    public void testInvocation() {
+        // Here we just the address with JMS URI
+        String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue"
+                         + "?jndiInitialContextFactory"
+                         + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
+                         + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL="
+                         + "vm://localhost";
+
+        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
+        factory.setServiceClass(Greeter.class);
+        factory.setAddress(address);
+        Greeter greeter = factory.create(Greeter.class);
+        String response = greeter.greetMe("Camel");
+        assertEquals("Hello Camel", response, "Get a wrong response");
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        CxfEndpoint jmsEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setEndpointNameAsQName(endpointName);
+            cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+            cxfEndpoint.setAddress(address);
+            cxfEndpoint.getInInterceptors().add(new org.apache.cxf.ext.logging.LoggingInInterceptor());
+            cxfEndpoint.getOutInterceptors().add(new org.apache.cxf.ext.logging.LoggingOutInterceptor());
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:jmsEndpoint").process(new Processor() {
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            // just set the response for greetme operation here
+                            String me = exchange.getIn().getBody(String.class);
+                            exchange.getMessage().setBody("Hello " + me);
+                        }
+                    });
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java
new file mode 100644
index 00000000000..e95ec0609dc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java
@@ -0,0 +1,104 @@
+/*
+ * 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.mtom;
+
+import java.awt.Image;
+import java.util.List;
+
+import javax.xml.ws.Holder;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+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.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, CxfJavaMtomProducerPayloadTest.class,
+                           CxfAutoConfiguration.class,
+                           CxfMtomConsumerTest.TestConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfJavaMtomProducerPayloadTest extends CxfMtomConsumerTest {
+    protected String MTOM_ENDPOINT_URI_MTOM_ENABLE = "cxf://http://localhost:" + port + "/services" 
+                                                                  + MTOM_ENDPOINT_ADDRESS
+                                                                  + "?serviceClass=org.apache.camel.cxf.mtom_feature.Hello"
+                                                                  + "&properties.mtom-enabled=true"
+                                                                  + "&defaultOperationName=Detail";
+    private static final Logger LOG = LoggerFactory.getLogger(CxfJavaMtomProducerPayloadTest.class);
+
+    @Autowired
+    CamelContext context;
+    
+      
+    @Override
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testInvokingService() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        final Holder<byte[]> photo = new Holder<>("RequestFromCXF".getBytes("UTF-8"));
+        final Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+        Exchange exchange = context.createProducerTemplate().send(MTOM_ENDPOINT_URI_MTOM_ENABLE,
+                                                                  new Processor() {
+
+                                                                      @Override
+                                                                      public void process(Exchange exchange)
+                                                                          throws Exception {
+                                                                          exchange.getIn()
+                                                                              .setBody(new Object[] {
+                                                                                                     photo,
+                                                                                                     image
+                                                                          });
+
+                                                                      }
+
+                                                                  });
+
+        AttachmentMessage out = exchange.getMessage(AttachmentMessage.class);
+        assertEquals(2, out.getAttachments().size(), "We should get 2 attachements here.");
+        assertEquals("application/xop+xml", out.getHeader("Content-Type"), "Get a wrong Content-Type header");
+        // Get the parameter list
+        List<?> parameter = out.getBody(List.class);
+        // Get the operation name
+        final Holder<byte[]> responsePhoto = (Holder<byte[]>)parameter.get(1);
+        assertNotNull(responsePhoto.value, "The photo should not be null");
+        assertEquals(new String(responsePhoto.value, "UTF-8"), "ResponseFromCamel",
+                     "Should get the right response");
+
+        final Holder<Image> responseImage = (Holder<Image>)parameter.get(2);
+        assertNotNull(responseImage.value, "We should get the image here");
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java
new file mode 100644
index 00000000000..601b33881f4
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.mtom;
+
+import java.awt.image.BufferedImage;
+import java.util.List;
+
+import java.awt.Image;
+import javax.imageio.ImageIO;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+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.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.ext.logging.LoggingFeature;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomConsumerMutipleParameterTest.class,
+                           CxfMtomConsumerMutipleParameterTest.TestConfiguration.class, 
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerMutipleParameterTest {
+
+    protected String MTOM_ENDPOINT_ADDRESS = "/CxfMtomConsumerTest/jaxws-mtom/hello";
+    protected String MTOM_ENDPOINT_URI = "cxf://" + MTOM_ENDPOINT_ADDRESS
+                                                      + "?serviceClass=org.apache.camel.component.cxf.soap.springboot.mtom.ImageService&properties.mtom-enabled=true";
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerMutipleParameterTest.class);
+
+    static int port = CXFTestSupport.getPort1();
+    
+    
+
+    
+    private ImageService getPort() {
+              
+        JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress("http://localhost:" + port + "/services" + MTOM_ENDPOINT_ADDRESS);
+        clientBean.setServiceClass(ImageService.class);
+        proxyFactory.getFeatures().add(new LoggingFeature());
+        ImageService imageService = (ImageService) proxyFactory.create();
+        return imageService;
+    }
+
+    protected Image getImage(String name) throws Exception {
+        return ImageIO.read(getClass().getResource(name));
+    }
+
+        
+    @Test
+    public void testInvokingServiceBare() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        Image image = getImage("/java.jpg");
+        
+        ImageService port = getPort();
+
+        SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+        binding.setMTOMEnabled(true);
+
+        String ret = port.uploadImage(image, "RequestFromCXF");
+
+        assertEquals(ret,
+                     "RequestFromCXF hello", "Should get the right response");
+
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from(MTOM_ENDPOINT_URI).process(new Processor() {
+                        public void process(final Exchange exchange) throws Exception {
+                            AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
+                            assertNull(in.getAttachments(), "We should not get any attachements here.");
+                            assertEquals("application/xop+xml", in.getHeader("Content-Type"), "Get a wrong Content-Type header");
+                            // Get the parameter list
+                            List<?> parameter = in.getBody(List.class);
+                            // Get the operation name
+                            String name = (String)parameter.get(1);
+                            assertNotNull(name, "The name should not be null");
+                            assertEquals(name,
+                                    "RequestFromCXF", "Should get the right request");
+                            BufferedImage image = (BufferedImage) parameter.get(0);
+                            assertNotNull(image, "We should get the image here");
+                            exchange.getMessage().setBody(name + " hello");
+
+                        }
+                    });
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java
new file mode 100644
index 00000000000..72b053f3edc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.mtom;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.xpath.XPathConstants;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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.assertArrayEquals;
+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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XPathUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomConsumerPayloadModeTest.class,
+                           CxfMtomConsumerPayloadModeTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerPayloadModeTest {
+    
+    private final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    private final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    
+    
+    
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerPayloadModeTest.class);
+
+    static int port = CXFTestSupport.getPort1();
+    
+    @Autowired
+    private ProducerTemplate template;
+
+    @Test
+    public void testConsumer() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        Exchange exchange = template.send("cxf:bean:consumerEndpoint", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                List<Source> elements = new ArrayList<>();
+                elements.add(new DOMSource(StaxUtils.read(new StringReader(getRequestMessage())).getDocumentElement()));
+                CxfPayload<SoapHeader> body = new CxfPayload<>(
+                        new ArrayList<SoapHeader>(),
+                        elements, null);
+                exchange.getIn().setBody(body);
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+            }
+        });
+        assertEquals(exchange.getIn(AttachmentMessage.class).getAttachments().size(), 2);
+    }
+
+    protected String getRequestMessage() {
+        return MtomTestHelper.REQ_MESSAGE;
+    }
+
+    
+ // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        public CxfEndpoint consumerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + getClass().getSimpleName()+ "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", true);
+            properties.put("loggingFeatureEnabled", false);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:consumerEndpoint").process(new Processor() {
+                        
+                        @SuppressWarnings("unchecked")
+                        public void process(Exchange exchange) throws Exception {
+                            CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
+
+                            // verify request
+                            assertEquals(1, in.getBody().size());
+
+                            Map<String, String> ns = new HashMap<>();
+                            ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
+                            ns.put("xop", MtomTestHelper.XOP_NS);
+
+                            XPathUtils xu = new XPathUtils(ns);
+                            Element body = new XmlConverter().toDOMElement(in.getBody().get(0));
+                            Element ele = (Element) xu.getValue("//ns:Detail/ns:photo/xop:Include", body,
+                                    XPathConstants.NODE);
+                            String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
+                            assertEquals(MtomTestHelper.REQ_PHOTO_CID, photoId);
+
+                            ele = (Element) xu.getValue("//ns:Detail/ns:image/xop:Include", body,
+                                    XPathConstants.NODE);
+                            String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
+                            assertEquals(MtomTestHelper.REQ_IMAGE_CID, imageId);
+
+                            DataHandler dr = exchange.getIn(AttachmentMessage.class).getAttachment(photoId);
+                            assertEquals("application/octet-stream", dr.getContentType());
+                            assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+                            dr = exchange.getIn(AttachmentMessage.class).getAttachment(imageId);
+                            assertEquals("image/jpeg", dr.getContentType());
+                            assertArrayEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+                            // create response
+                            List<Source> elements = new ArrayList<>();
+                            elements.add(new DOMSource(StaxUtils.read(new StringReader(MtomTestHelper.RESP_MESSAGE)).getDocumentElement()));
+                            CxfPayload<SoapHeader> sbody = new CxfPayload<>(
+                                    new ArrayList<SoapHeader>(),
+                                    elements, null);
+                            exchange.getIn().setBody(sbody);
+                            exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
+                                    new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, "application/octet-stream")));
+
+                            exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
+                                    new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
+
+                        }
+                    });
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java
new file mode 100644
index 00000000000..7e9ba5d77ae
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.mtom;
+
+import java.awt.Image;
+import java.net.URL;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.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.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomConsumerTest.class,
+                           CxfMtomConsumerTest.TestConfiguration.class, 
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerTest {
+
+    protected String MTOM_ENDPOINT_ADDRESS = "/CxfMtomConsumerTest/jaxws-mtom/hello";
+    protected String MTOM_ENDPOINT_URI = "cxf://" + MTOM_ENDPOINT_ADDRESS
+                                                      + "?serviceClass=org.apache.camel.cxf.mtom_feature.Hello&properties.mtom-enabled=true";
+
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerTest.class);
+
+    private final QName serviceName = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+
+    static int port = CXFTestSupport.getPort1();
+    
+    
+
+    
+    private Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        HelloService service = new HelloService(wsdl, serviceName);
+        assertNotNull(service, "Service is null");
+        Hello hello = service.getHelloPort();
+
+        ((BindingProvider) hello).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services" + MTOM_ENDPOINT_ADDRESS);
+        Client c = ClientProxy.getClient(hello);
+        c.getInInterceptors().add(new LoggingInInterceptor());
+        c.getOutInterceptors().add(new LoggingOutInterceptor());
+        return hello;
+    }
+
+    protected Image getImage(String name) throws Exception {
+        return ImageIO.read(getClass().getResource(name));
+    }
+
+    @Test
+    public void testInvokingService() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        Holder<byte[]> photo = new Holder<>("RequestFromCXF".getBytes("UTF-8"));
+        Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+        Hello port = getPort();
+
+        SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+        binding.setMTOMEnabled(true);
+
+        port.detail(photo, image);
+
+        assertEquals("ResponseFromCamel", new String(photo.value, "UTF-8"));
+        assertNotNull(image.value);
+
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from(MTOM_ENDPOINT_URI).process(new Processor() {
+                        @SuppressWarnings("unchecked")
+                        public void process(final Exchange exchange) throws Exception {
+                            AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
+                            assertNull(in.getAttachments(), "We should not get any attachements here.");
+                            assertEquals("application/xop+xml", in.getHeader("Content-Type"), "Get a wrong Content-Type header");
+                            // Get the parameter list
+                            List<?> parameter = in.getBody(List.class);
+                            // Get the operation name
+                            Holder<byte[]> photo = (Holder<byte[]>) parameter.get(0);
+                            assertNotNull(photo.value, "The photo should not be null");
+                            assertEquals(new String(photo.value, "UTF-8"),
+                                    "RequestFromCXF", "Should get the right request");
+                            photo.value = "ResponseFromCamel".getBytes("UTF-8");
+                            Holder<Image> image = (Holder<Image>) parameter.get(1);
+                            assertNotNull(image.value, "We should get the image here");
+                            // set the holder message back    
+                            exchange.getMessage().setBody(new Object[] { null, photo, image });
+
+                        }
+                    });
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
new file mode 100644
index 00000000000..fd52ce69a74
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
@@ -0,0 +1,192 @@
+/*
+ * 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.mtom;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.CxfMtomConsumerPayloadModeTest;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Unit test for exercising SOAP with Attachment (SwA) feature of a CxfConsumer in PAYLOAD mode. That is, testing
+ * attachment with MTOM optimization off.
+ */
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, CxfMtomDisabledConsumerPayloadModeTest.class,
+                           CxfMtomDisabledConsumerPayloadModeTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomDisabledConsumerPayloadModeTest {
+    
+    
+    private final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    private final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    
+    static int port = CXFTestSupport.getPort1();
+    
+    
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerPayloadModeTest.class);
+
+    @Autowired
+    private ProducerTemplate template;
+
+    @Test
+    public void testConsumer() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        template.send("cxf:bean:consumerEndpoint", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                List<Source> elements = new ArrayList<>();
+                elements.add(new DOMSource(StaxUtils.read(new StringReader(getRequestMessage())).getDocumentElement()));
+                CxfPayload<SoapHeader> body = new CxfPayload<>(
+                        new ArrayList<SoapHeader>(),
+                        elements, null);
+                exchange.getIn().setBody(body);
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+            }
+        });
+    }
+
+    protected String getRequestMessage() {
+        return MtomTestHelper.MTOM_DISABLED_REQ_MESSAGE;
+    }
+
+
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        public CxfEndpoint consumerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + getClass().getSimpleName()+ "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", false);
+            properties.put("loggingFeatureEnabled", false);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:consumerEndpoint").process(new Processor() {
+                        
+                        @SuppressWarnings("unchecked")
+                        public void process(Exchange exchange) throws Exception {
+                            CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
+
+                            // verify request
+                            assertEquals(1, in.getBody().size());
+
+                            DataHandler dr = exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_PHOTO_CID);
+                            assertEquals("application/octet-stream", dr.getContentType());
+                            assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+                            dr = exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_IMAGE_CID);
+                            assertEquals("image/jpeg", dr.getContentType());
+                            assertArrayEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+                            // create response
+                            List<Source> elements = new ArrayList<>();
+                            elements.add(new DOMSource(
+                                    StaxUtils.read(new StringReader(MtomTestHelper.MTOM_DISABLED_RESP_MESSAGE)).getDocumentElement()));
+                            CxfPayload<SoapHeader> body = new CxfPayload<>(
+                                    new ArrayList<SoapHeader>(),
+                                    elements, null);
+                            exchange.getMessage().setBody(body);
+                            exchange.getMessage(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
+                                    new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, "application/octet-stream")));
+
+                            exchange.getMessage(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
+                                    new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
+
+                        }
+                    });
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java
new file mode 100644
index 00000000000..70e77210e0a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java
@@ -0,0 +1,287 @@
+/*
+ * 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.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.attachment.AttachmentDataSource;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfMtomDisabledProducerPayloadModeTest.class,
+        CxfMtomDisabledProducerPayloadModeTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomDisabledProducerPayloadModeTest {
+
+    protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomDisabledProducerPayloadModeTest.class);
+
+    @Autowired
+    protected CamelContext context;
+    private Endpoint endpoint;
+    
+    static int port = CXFTestSupport.getPort1();
+    
+    
+    
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        endpoint = Endpoint.publish("/" + getClass().getSimpleName()
+                                    + "/jaxws-mtom/hello",
+                getServiceImpl());
+        SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+        binding.setMTOMEnabled(isMtomEnabled());
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @Test
+    public void testProducer() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                List<Source> elements = new ArrayList<>();
+                elements.add(new DOMSource(
+                        StaxUtils.read(new StringReader(MtomTestHelper.MTOM_DISABLED_REQ_MESSAGE)).getDocumentElement()));
+                CxfPayload<SoapHeader> body = new CxfPayload<>(
+                        new ArrayList<SoapHeader>(),
+                        elements, null);
+                exchange.getIn().setBody(body);
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+
+            }
+
+        });
+
+        // process response - verify response attachments
+
+        CxfPayload<?> out = exchange.getMessage().getBody(CxfPayload.class);
+        assertEquals(1, out.getBody().size());
+
+        DataHandler dr = exchange.getMessage(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_PHOTO_CID);
+        assertEquals("application/octet-stream", dr.getContentType());
+        assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+        dr = exchange.getMessage(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_IMAGE_CID);
+        assertEquals("image/jpeg", dr.getContentType());
+
+        BufferedImage image = ImageIO.read(dr.getInputStream());
+        assertEquals(560, image.getWidth());
+        assertEquals(300, image.getHeight());
+
+    }
+
+    public static class MyHelloImpl extends HelloImpl implements Hello {
+
+        @Resource
+        WebServiceContext ctx;
+
+        @Override
+        public void detail(Holder<byte[]> photo, Holder<Image> image) {
+
+            // verify request attachments
+            Map<String, DataHandler> map
+                    = CastUtils.cast((Map<?, ?>) ctx.getMessageContext().get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS));
+            assertEquals(2, map.size());
+
+            DataHandler dh = map.get(MtomTestHelper.REQ_PHOTO_CID);
+            assertEquals("application/octet-stream", dh.getContentType());
+            byte[] bytes = null;
+            try {
+                bytes = IOUtils.readBytesFromStream(dh.getInputStream());
+            } catch (IOException e) {
+                LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+            }
+            assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, bytes);
+
+            dh = map.get(MtomTestHelper.REQ_IMAGE_CID);
+            assertEquals("image/jpeg", dh.getContentType());
+
+            BufferedImage bufferedImage = null;
+            try {
+                bufferedImage = ImageIO.read(dh.getInputStream());
+
+            } catch (IOException e) {
+                LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+            }
+            assertNotNull(bufferedImage);
+            assertEquals(41, bufferedImage.getWidth());
+            assertEquals(39, bufferedImage.getHeight());
+
+            // add output attachments
+            map = CastUtils.cast((Map<?, ?>) ctx.getMessageContext().get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS));
+
+            try {
+                DataSource ds = new AttachmentDataSource("image/jpeg", getClass().getResourceAsStream("/Splash.jpg"));
+                map.put(MtomTestHelper.RESP_IMAGE_CID, new DataHandler(ds));
+
+            } catch (Exception e) {
+                LOG.warn("I/O error: {}", e.getMessage(), e);
+            }
+
+            try {
+                DataSource ds = new AttachmentDataSource(
+                        "application/octet-stream",
+                        new ByteArrayInputStream(MtomTestHelper.RESP_PHOTO_DATA));
+                map.put(MtomTestHelper.RESP_PHOTO_CID, new DataHandler(ds));
+
+            } catch (Exception e) {
+                LOG.warn("I/O error: {}", e.getMessage(), e);
+            }
+
+        }
+    }
+
+    
+    protected boolean isMtomEnabled() {
+        return false;
+    }
+
+    protected Object getServiceImpl() {
+        return new MyHelloImpl();
+    }
+
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+       
+        @Bean
+        public CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomDisabledProducerPayloadModeTest" + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("loggingFeatureEnabled", false);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:testEndpoint").
+                    to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java
new file mode 100644
index 00000000000..cfeaefc6702
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java
@@ -0,0 +1,192 @@
+/*
+ * 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.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfMtomPOJOProducerTest.class,
+        CxfMtomPOJOProducerTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomPOJOProducerTest {
+
+    protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomPOJOProducerTest.class);
+
+    @Autowired
+    protected CamelContext context;
+    private Endpoint endpoint;
+    
+    static int port = CXFTestSupport.getPort1();
+    
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        endpoint = Endpoint.publish("/CxfMtomPOJOProducerTest/jaxws-mtom/hello", getImpl());
+        SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+        binding.setMTOMEnabled(true);
+
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testInvokingServiceFromCxfProducer() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        final Holder<byte[]> photo = new Holder<>(MtomTestHelper.REQ_PHOTO_DATA);
+        final Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+        Exchange exchange = context.createProducerTemplate().send("direct://testEndpoint", new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody(new Object[] { photo, image });
+
+            }
+
+        });
+
+        assertEquals(2, exchange.getMessage(AttachmentMessage.class).getAttachments().size(),
+                "The attachement size should be 2");
+
+        Object[] result = exchange.getMessage().getBody(Object[].class);
+        Holder<byte[]> photo1 = (Holder<byte[]>) result[1];
+        assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, photo1.value);
+        Holder<Image> image1 = (Holder<Image>) result[2];
+        assertNotNull(image1.value);
+        if (image.value instanceof BufferedImage) {
+            assertEquals(560, ((BufferedImage) image1.value).getWidth());
+            assertEquals(300, ((BufferedImage) image1.value).getHeight());
+        }
+
+    }
+
+    private Image getImage(String name) throws Exception {
+        return ImageIO.read(getClass().getResource(name));
+    }
+
+    protected Object getImpl() {
+        return new HelloImpl();
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+       
+        @Bean
+        public CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomPOJOProducerTest" + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            cxfEndpoint.setServiceClass(org.apache.camel.cxf.mtom_feature.Hello.class);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("mtom-enabled", true);
+            properties.put("loggingFeatureEnabled", false);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:testEndpoint").
+                    to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java
new file mode 100644
index 00000000000..48271a55b8f
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java
@@ -0,0 +1,241 @@
+/*
+ * 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.mtom;
+
+
+
+
+import java.awt.image.BufferedImage;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.imageio.ImageIO;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.xpath.XPathConstants;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XPathUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfMtomProducerPayloadModeTest.class,
+        CxfMtomProducerPayloadModeTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomProducerPayloadModeTest {
+
+    protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomProducerPayloadModeTest.class);
+
+    @Autowired
+    protected CamelContext context;
+    private Endpoint endpoint;
+    
+    static int port = CXFTestSupport.getPort1();
+    
+    
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        endpoint = Endpoint.publish("/" + getClass().getSimpleName()
+                                    + "/jaxws-mtom/hello",
+                getServiceImpl());
+        SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+        binding.setMTOMEnabled(isMtomEnabled());
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testProducer() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        // START SNIPPET: producer
+
+        Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                List<Source> elements = new ArrayList<>();
+                elements.add(new DOMSource(StaxUtils.read(new StringReader(MtomTestHelper.REQ_MESSAGE)).getDocumentElement()));
+                CxfPayload<SoapHeader> body = new CxfPayload<>(
+                        new ArrayList<SoapHeader>(),
+                        elements, null);
+                exchange.getIn().setBody(body);
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+                exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+                        new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+
+            }
+
+        });
+
+        // process response 
+
+        CxfPayload<SoapHeader> out = exchange.getMessage().getBody(CxfPayload.class);
+        assertEquals(1, out.getBody().size());
+
+        Map<String, String> ns = new HashMap<>();
+        ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
+        ns.put("xop", MtomTestHelper.XOP_NS);
+
+        XPathUtils xu = new XPathUtils(ns);
+        Element oute = new XmlConverter().toDOMElement(out.getBody().get(0));
+        Element ele = (Element) xu.getValue("//ns:DetailResponse/ns:photo/xop:Include", oute,
+                XPathConstants.NODE);
+        String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
+
+        ele = (Element) xu.getValue("//ns:DetailResponse/ns:image/xop:Include", oute,
+                XPathConstants.NODE);
+        String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
+
+        DataHandler dr = exchange.getMessage(AttachmentMessage.class).getAttachment(decodingReference(photoId));
+        assertEquals("application/octet-stream", dr.getContentType());
+        assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+        dr = exchange.getMessage(AttachmentMessage.class).getAttachment(decodingReference(imageId));
+        assertEquals("image/jpeg", dr.getContentType());
+
+        BufferedImage image = ImageIO.read(dr.getInputStream());
+        assertEquals(560, image.getWidth());
+        assertEquals(300, image.getHeight());
+
+        // END SNIPPET: producer
+
+    }
+
+    // CXF encoding the XOP reference since 3.0.1
+    private String decodingReference(String reference) throws UnsupportedEncodingException {
+        return java.net.URLDecoder.decode(reference, "UTF-8");
+    }
+
+    protected boolean isMtomEnabled() {
+        return true;
+    }
+
+    protected Object getServiceImpl() {
+        return new HelloImpl();
+    }
+
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+       
+        @Bean
+        public CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomProducerPayloadModeTest" + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", true);
+            properties.put("loggingFeatureEnabled", false);
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:testEndpoint").
+                    to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java
new file mode 100644
index 00000000000..dc11e8b3385
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomRouterCxfMessageModeTest.class,
+                           CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+                           CxfMtomRouterCxfMessageModeTest.EndpointConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterCxfMessageModeTest extends CxfMtomRouterPayloadModeTest {
+    
+       
+    
+
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull(service, "Service is null");
+        Hello hello = service.getHelloPort();
+        ((BindingProvider) hello).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services" + "/CxfMtomRouterCxfMessageModeTest/jaxws-mtom/hello");
+        return hello;
+    }
+    
+    @Configuration
+    class EndpointConfiguration {
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + "CxfMtomRouterCxfMessageModeTest" 
+                + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "CXF_MESSAGE");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomRouterCxfMessageModeTest" + "/jaxws-mtom/backend");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "CXF_MESSAGE");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java
new file mode 100644
index 00000000000..b8d5f015028
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.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.soap.springboot.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl12;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService12;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomRouterPayloadMode12Test.class,
+                           CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+                           CxfMtomRouterPayloadMode12Test.EndpointConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterPayloadMode12Test extends CxfMtomRouterPayloadModeTest {
+    
+    protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService12");
+    
+        
+    @Override
+    protected Object getImpl() {
+        return new HelloImpl12();
+    }
+
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        HelloService12 service = new HelloService12(wsdl, HelloService12.SERVICE);
+        assertNotNull(service, "Service is null");
+        Hello hello = service.getHelloPort();
+        ((BindingProvider) hello).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services" + "/CxfMtomRouterPayloadMode12Test/jaxws-mtom/hello");
+        return hello;
+    }
+
+    @Configuration
+    class EndpointConfiguration {
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + "CxfMtomRouterPayloadMode12Test" 
+                + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomRouterPayloadMode12Test" + "/jaxws-mtom/backend");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java
new file mode 100644
index 00000000000..7b635447867
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java
@@ -0,0 +1,214 @@
+/*
+ * 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.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfMtomRouterPayloadModeTest.class,
+        CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+        CxfMtomRouterPayloadModeTest.EndpointConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomRouterPayloadModeTest {
+
+    protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+    protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMtomRouterPayloadModeTest.class);
+
+    @Autowired
+    protected CamelContext context;
+    private Endpoint endpoint;
+    
+    static int port = CXFTestSupport.getPort1();
+    
+    
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        endpoint = Endpoint.publish("/"
+                                    + getClass().getSimpleName() + "/jaxws-mtom/backend",
+                getImpl());
+        SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+        binding.setMTOMEnabled(true);
+
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        if (endpoint != null) {
+            endpoint.stop();
+        }
+    }
+
+    @Test
+    public void testInvokingServiceFromCXFClient() throws Exception {
+        if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+            return;
+        }
+
+        Holder<byte[]> photo = new Holder<>(MtomTestHelper.REQ_PHOTO_DATA);
+        Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+        Hello port = getPort();
+
+        SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+        binding.setMTOMEnabled(true);
+
+        port.detail(photo, image);
+
+        assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, photo.value);
+        assertNotNull(image.value);
+        if (image.value instanceof BufferedImage) {
+            assertEquals(560, ((BufferedImage) image.value).getWidth());
+            assertEquals(300, ((BufferedImage) image.value).getHeight());
+        }
+
+    }
+
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull(service, "Service is null");
+        Hello hello = service.getHelloPort();
+        ((BindingProvider) hello).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMtomRouterPayloadModeTest/jaxws-mtom/hello");
+        return hello;
+    }
+
+    private Image getImage(String name) throws Exception {
+        return ImageIO.read(getClass().getResource(name));
+    }
+
+    protected Object getImpl() {
+        return new HelloImpl();
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:routerEndpoint").
+                    to("cxf:bean:serviceEndpoint");
+                }
+            };
+        }
+    }
+    
+    @Configuration
+    class EndpointConfiguration {
+        @Bean
+        public CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + "CxfMtomRouterPayloadModeTest"
+                + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomRouterPayloadModeTest" + "/jaxws-mtom/backend");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java
new file mode 100644
index 00000000000..639d37c39e5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMtomRouterRawModeTest.class,
+                           CxfMtomRouterRawModeTest.TestConfiguration.class,
+                           CxfMtomRouterRawModeTest.EndpointConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterRawModeTest extends CxfMtomRouterPayloadModeTest {
+    
+    
+    
+
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull(wsdl, "WSDL is null");
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull(service, "Service is null");
+        Hello hello = service.getHelloPort();
+        ((BindingProvider) hello).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services" + "/CxfMtomRouterRawModeTest/jaxws-mtom/hello");
+        return hello;
+    }
+    
+    @Configuration
+    class EndpointConfiguration {
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("/" + "CxfMtomRouterRawModeTest" 
+                + "/jaxws-mtom/hello");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "RAW");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+            cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/" 
+                + "CxfMtomRouterRawModeTest" + "/jaxws-mtom/backend");
+            cxfEndpoint.setWsdlURL("mtom.wsdl");
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "RAW");
+            properties.put("mtom-enabled", "true");
+            cxfEndpoint.setProperties(properties);
+            return cxfEndpoint;
+        }
+    }
+
+}
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/soap/springboot/mtom/ImageService.java
similarity index 63%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/ImageService.java
index 2b75b4d1d66..7c0b6f74e1f 100644
--- 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/soap/springboot/mtom/ImageService.java
@@ -14,21 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.jaxws;
+package org.apache.camel.component.cxf.soap.springboot.mtom;
 
-import java.util.List;
+import java.awt.Image;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.xml.ws.soap.MTOM;
 
-public interface HelloService {
-    String sayHello();
+@WebService(name = "ImageService", targetNamespace = "http://apache.org/camel/cxf/mtom_feature")
+@MTOM
+public interface ImageService {
 
-    void ping();
+    Image downloadImage(@WebParam(name = "name") String name);
 
-    int getInvocationCount();
+    
+    String uploadImage(@WebParam(name = "data") Image data, @WebParam(name = "name") String name);
 
-    String echo(String text) throws Exception;
-
-    Boolean echoBoolean(Boolean bool);
-
-    String complexParameters(List<String> par1, List<String> par2);
-
-}
+}
\ No newline at end of file
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java
new file mode 100644
index 00000000000..179c0ecfbc7
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java
@@ -0,0 +1,102 @@
+/*
+ * 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.mtom;
+
+import java.io.IOException;
+
+import org.apache.cxf.helpers.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+/**
+ * Package local test helper
+ */
+public final class MtomTestHelper {
+    static final String SERVICE_TYPES_NS = "http://apache.org/camel/cxf/mtom_feature/types";
+    static final String XOP_NS = "http://www.w3.org/2004/08/xop/include";
+    static final byte[] REQ_PHOTO_DATA = { 1, 0, -1, 34, 23, 3, 23, 55, 33 };
+    static final byte[] RESP_PHOTO_DATA = { 5, -7, 23, 1, 0, -1, 34, 23, 3, 23, 55, 33, 3 };
+
+    static final String REQ_PHOTO_CID = "e33b6792-6666-4837-b0d9-68c88c8cadcb-1@apache.org";
+    static final String REQ_IMAGE_CID = "e33b6792-6666-4837-b0d9-68c88c8cadcb-2@apache.org";
+
+    static final String REQ_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                                      + "<Detail xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+                                      + "<photo><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+                                      + " href=\"cid:" + REQ_PHOTO_CID + "\"/>"
+                                      + "</photo><image><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+                                      + " href=\"cid:" + REQ_IMAGE_CID + "\"/></image></Detail>";
+
+    static final String MTOM_DISABLED_REQ_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                                                    + "<Detail xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+                                                    + "<photo>cid:" + REQ_PHOTO_CID + "</photo>"
+                                                    + "<image>cid:" + REQ_IMAGE_CID + "</image></Detail>";
+
+    static final String RESP_PHOTO_CID = "4c7b78dc-356a-4fca-8877-068ee2f31824-7@apache.org";
+    static final String RESP_IMAGE_CID = "4c7b78dc-356a-4fca-8877-068ee2f31824-8@apache.org";
+
+    static final String RESP_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                                       + "<DetailResponse xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+                                       + "<photo><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+                                       + " href=\"cid:" + RESP_PHOTO_CID + "\"/>"
+                                       + "</photo><image><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+                                       + " href=\"cid:" + RESP_IMAGE_CID + "\"/></image></DetailResponse>";
+
+    static final String MTOM_DISABLED_RESP_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                                                     + "<DetailResponse xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+                                                     + "<photo>cid:" + RESP_PHOTO_CID + "</photo>"
+                                                     + "<image>cid:" + RESP_IMAGE_CID + "</image></DetailResponse>";
+
+    static byte[] requestJpeg;
+    static byte[] responseJpeg;
+
+    private static final Logger LOG = LoggerFactory.getLogger(MtomTestHelper.class);
+
+    static {
+        try {
+            requestJpeg = IOUtils.readBytesFromStream(MtomTestHelper.class.getResourceAsStream("/java.jpg"));
+            responseJpeg = IOUtils.readBytesFromStream(MtomTestHelper.class.getResourceAsStream("/Splash.jpg"));
+        } catch (IOException e) {
+            LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+        }
+    }
+
+    private MtomTestHelper() {
+        // utility class
+    }
+
+    static boolean isAwtHeadless(org.apache.commons.logging.Log log, org.slf4j.Logger logger) {
+        assertFalse(log == null && logger == null, "Both loggers are not allowed to be null!");
+        boolean headless = Boolean.getBoolean("java.awt.headless");
+        if (headless) {
+            // having the conversion characters %c{1} inside log4j.properties will reveal us the
+            // test class currently running as we make use of it's logger to warn about skipping!
+            String warning = "Running headless. Skipping test as Images may not work.";
+            if (log != null) {
+                log.warn(warning);
+            }
+
+            if (logger != null) {
+                logger.warn("Running headless. Skipping test as Images may not work.");
+            }
+        }
+
+        return headless;
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java
new file mode 100644
index 00000000000..928e7c8b280
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.namespace;
+
+
+
+
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.class,
+        CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+        CxfAutoConfiguration.class,
+        CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadConsumerDuplicateNamespaceStreamCacheTest extends CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest {
+    
+    
+    /*
+     * The soap namespace prefix is already defined on the root tag of the
+     * payload. If this is set another time from the envelope, the result will
+     * be an invalid XML.
+     */
+    protected static final String REQUEST_MESSAGE
+            = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+              + "<soap:Body><ns2:getToken xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns2=\"http://camel.apache.org/cxf/namespace\">"
+              + "<arg0 xsi:type=\"xs:string\">Send</arg0></ns2:getToken></soap:Body></soap:Envelope>";
+
+    @Override
+    @Test
+    public void testInvokeRouter() {
+        Object returnValue = template.requestBody("direct:router", REQUEST_MESSAGE);
+        assertNotNull(returnValue);
+        assertTrue(returnValue instanceof String);
+        assertTrue(((String) returnValue).contains("Return Value"));
+        assertTrue(((String) returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java
new file mode 100644
index 00000000000..54e22556b35
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.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.soap.springboot.namespace;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.builder.RouteBuilder;
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class,
+                           CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.class,
+                           CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class,
+                           CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest
+    extends CxfPayloadConsumerNamespaceOnEnvelopeTest {
+    
+        
+   
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:router")
+                        // Use message mode to send the raw message
+                        .to("cxf:bean:serviceEndpoint")
+                        // Convert to String to make testing the result easier
+                        .convertBodyTo(String.class);
+                    // The consumer is running in payload mode
+                    from("cxf:bean:routerEndpoint")
+                        // Use stream caching to trigger the issue
+                        .streamCaching()
+                        // Parse to DOM to make sure it's still valid XML
+                        .convertBodyTo(Document.class).setBody().constant(RESPONSE_PAYLOAD);
+                }
+            };
+        }
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java
new file mode 100644
index 00000000000..c143728e37a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.namespace;
+
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+
+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.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfPayloadConsumerNamespaceOnEnvelopeTest.class,
+                           CxfPayloadConsumerNamespaceOnEnvelopeTest.TestConfiguration.class,
+                           CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadConsumerNamespaceOnEnvelopeTest {
+
+    /*
+     * The request message is generated directly. The issue here is that the xsi and xs namespaces are defined
+     * on the SOAP envelope but are used within the payload. This can cause issues with some type conversions
+     * in PAYLOAD mode, as the Camel-CXF endpoint will return some kind of window within the StAX parsing (and
+     * the namespace definitions are outside). If some CXF proxy is used to send the message the namespaces
+     * will be defined within the payload (and everything works fine).
+     */
+    protected static final String RESPONSE_PAYLOAD = "<ns2:getTokenResponse xmlns:ns2=\"http://camel.apache.org/cxf/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+                                                     + "<return xsi:type=\"xs:string\">Return Value</return></ns2:getTokenResponse>";
+    protected static final String REQUEST_MESSAGE = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+                                                    + "<soap:Body><ns2:getToken xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"><arg0 xsi:type=\"xs:string\">Send</arg0></ns2:getToken></soap:Body></soap:Envelope>";
+    
+    private QName serviceName = QName.valueOf("{http://camel.apache.org/cxf/namespace}GetTokenService");
+
+    @Autowired
+    ProducerTemplate template;
+    
+    static int port = CXFTestSupport.getPort1();
+
+    
+    
+    @Test
+    public void testInvokeRouter() {
+        Object returnValue = template.requestBody("direct:router", REQUEST_MESSAGE);
+        assertNotNull(returnValue);
+        assertTrue(returnValue instanceof String);
+        assertTrue(((String)returnValue).contains("Return Value"));
+        assertTrue(((String)returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+                
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:router")
+                        // Use message mode to send the raw message
+                        .to("cxf:bean:serviceEndpoint")
+                        // Convert to String to make testing the result easier
+                        .convertBodyTo(String.class);
+                    // The consumer is running in payload mode
+                    from("cxf:bean:routerEndpoint")
+                        // Convert the CxfPayload to a String to trigger the issue
+                        .convertBodyTo(String.class)
+                        // Parse to DOM to make sure it's still valid XML
+                        .convertBodyTo(Document.class).setBody().constant(RESPONSE_PAYLOAD);
+                }
+            };
+        }
+        
+        
+        
+        
+    }
+
+    @Configuration
+    public class EndpointConfiguration {
+        
+        @Bean
+        ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/GetToken/SoapContext/SoapPort");
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setWsdlURL("GetToken.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/GetToken/SoapContext/SoapPort");
+            cxfEndpoint.setServiceNameAsQName(serviceName);
+            cxfEndpoint.setWsdlURL("GetToken.wsdl");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            return cxfEndpoint;
+        }
+
+    }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java
new file mode 100644
index 00000000000..189dab3e4e8
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.namespace;
+
+
+
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.builder.RouteBuilder;
+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.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.class,
+        CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+        CxfPayloadProducerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest extends CxfPayloadProducerNamespaceOnEnvelopeTest {
+    
+    
+    
+    
+        
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:router") //
+                            .streamCaching()
+                            // call an external Web service in payload mode
+                            .to("cxf:bean:serviceEndpoint?dataFormat=PAYLOAD")
+                            // Check that the issue doesn't occur if stream caching is enabled
+                            // Parse to DOM to make sure it's still valid XML
+                            .convertBodyTo(Document.class)
+                            // Convert back to String to make testing the result
+                            // easier
+                            .convertBodyTo(String.class);
+                    // This route just returns the test message
+                    from("cxf:bean:serviceEndpoint?dataFormat=RAW").setBody().constant(RESPONSE_MESSAGE);
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java
new file mode 100644
index 00000000000..d163277480b
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.namespace;
+
+
+
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+
+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.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfPayloadProducerNamespaceOnEnvelopeTest.class,
+        CxfPayloadProducerNamespaceOnEnvelopeTest.TestConfiguration.class,
+        CxfPayloadProducerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadProducerNamespaceOnEnvelopeTest {
+    
+    
+    protected static final String RESPONSE_MESSAGE
+        = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><soap:Body>"
+            + "<ns2:getTokenResponse xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"><return xsi:type=\"xs:string\">Return Value</return></ns2:getTokenResponse></soap:Body></soap:Envelope>";
+    protected static final String REQUEST_PAYLOAD = "<ns2:getToken xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"/>";
+    
+    private static QName SERVICENAME = QName.valueOf("{http://camel.apache.org/cxf/namespace}GetTokenService");
+    
+    static int port = CXFTestSupport.getPort1();
+
+
+    
+    
+    
+    
+    @Autowired
+    ProducerTemplate template;
+    
+    @Test
+    public void testInvokeRouter() {
+        Object returnValue = template.requestBody("direct:router", REQUEST_PAYLOAD);
+        assertNotNull(returnValue);
+        assertTrue(returnValue instanceof String);
+        assertTrue(((String) returnValue).contains("Return Value"));
+        assertTrue(((String) returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+    }
+    
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("direct:router") //
+                        // call an external Web service in payload mode
+                        .to("cxf:bean:serviceEndpoint")
+                        // Convert the CxfPayload to a String to trigger the
+                        // issue
+                        .convertBodyTo(String.class)
+                        // Parse to DOM to make sure it's still valid XML
+                        .convertBodyTo(Document.class)
+                        // Convert back to String to make testing the result
+                        // easier
+                        .convertBodyTo(String.class);
+                    // This route just returns the test message
+                    from("cxf:bean:routerEndpoint").setBody().constant(RESPONSE_MESSAGE);
+                }
+            };
+        }
+    }
+    
+    @Configuration
+    class EndpointConfiguration {
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        @Bean
+        CxfEndpoint routerEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            cxfEndpoint.setAddress("/GetToken/SoapContext/SoapPort");
+            cxfEndpoint.setDataFormat(DataFormat.RAW);
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        CxfEndpoint serviceEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            cxfEndpoint.setAddress("http://localhost:" + port 
+                + "/services/GetToken/SoapContext/SoapPort");
+            cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+            return cxfEndpoint;
+        }
+    }
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java
new file mode 100644
index 00000000000..cd9d9f46660
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.noparam;
+
+
+
+import javax.xml.ws.Endpoint;
+
+import org.apache.camel.ExchangePattern;
+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.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        NoParamTest.class,
+        NoParamTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class NoParamTest {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(NoParamTest.class);
+    
+    static int port = CXFTestSupport.getPort1();
+
+
+    @BeforeEach
+    public void setup() {
+        Object implementor = new org.apache.camel.component.cxf.noparam.NoParamEndpoint();
+        String address = "/cxf-noparam/";
+        Endpoint.publish(address, implementor);
+    }
+
+    
+    
+    
+    @Autowired
+    ProducerTemplate template;
+        
+    @Test
+    public void testNullBody() throws Exception {
+        Object body = template.sendBody("direct:noParam", ExchangePattern.InOut, null);
+        assertNotNull(body);
+        LOGGER.error(body.toString());
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() {
+            return new UndertowServletWebServerFactory(port);
+        }
+        
+        
+        @Bean
+        CxfEndpoint noParamEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.noparam.NoParamEndpoint.class);
+            cxfEndpoint.setAddress("/camel-noparam/");
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("cxf:bean:noParamEndpoint")
+                    .transform(constant("OK"))
+                    .to("mock:end");
+                    
+                    from("direct:noParam")
+                    .to("cxf:bean:noParamEndpoint?address=" + "http://localhost:" + port 
+                        + "/services/camel-noparam/");
+                }
+            };
+        }
+    }
+    
+    
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java
new file mode 100644
index 00000000000..62d1a642968
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java
@@ -0,0 +1,977 @@
+/*
+ * 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.soap.headers;
+
+import java.io.StringReader;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+
+import org.w3c.dom.Node;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+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.common.CxfPayload;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.soap.headers.Constants;
+import org.apache.camel.component.cxf.soap.headers.CustomHeaderFilter;
+import org.apache.camel.component.cxf.soap.headers.HeaderService;
+import org.apache.camel.component.cxf.soap.headers.HeaderTester;
+import org.apache.camel.component.cxf.soap.headers.HeaderTesterImpl;
+import org.apache.camel.component.cxf.soap.headers.HeaderTesterWithInsertionImpl;
+import org.apache.camel.component.cxf.soap.headers.InHeader;
+import org.apache.camel.component.cxf.soap.headers.InHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.InoutHeader;
+import org.apache.camel.component.cxf.soap.headers.InoutHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.Me;
+import org.apache.camel.component.cxf.soap.headers.OutHeader;
+import org.apache.camel.component.cxf.soap.headers.OutHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.SOAPHeaderData;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.cxf.transport.header.CxfHeaderFilterStrategy;
+import org.apache.camel.component.cxf.transport.header.MessageHeaderFilter;
+import org.apache.camel.component.cxf.transport.header.SoapMessageHeaderFilter;
+import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.support.DefaultExchange;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+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 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.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+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;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.headers.Header.Direction;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxb.JAXBDataBinding;
+import org.apache.cxf.message.MessageContentsList;
+import org.apache.cxf.outofband.header.OutofBandHeader;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+                           CamelAutoConfiguration.class, 
+                           CxfMessageHeadersRelayTest.class,
+                           CxfMessageHeadersRelayTest.TestConfiguration.class,
+                           CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMessageHeadersRelayTest {
+
+    private static QName SERVICENAME = QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}HeaderService");
+    
+    static int port = CXFTestSupport.getPort1();
+        
+
+    private static final Logger LOG = LoggerFactory.getLogger(CxfMessageHeadersRelayTest.class);
+
+    @Autowired
+    protected CamelContext context;
+    
+    @Autowired
+    protected ProducerTemplate template;
+
+    private Endpoint relayEndpoint;
+    private Endpoint noRelayEndpoint;
+    private Endpoint relayEndpointWithInsertion;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        relayEndpoint = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointBackend",
+                new HeaderTesterImpl());
+        noRelayEndpoint = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend",
+                new HeaderTesterImpl(false));
+        relayEndpointWithInsertion = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertionBackend",
+                new HeaderTesterWithInsertionImpl());
+
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+
+        if (relayEndpoint != null) {
+            relayEndpoint.stop();
+            relayEndpoint = null;
+        }
+
+        if (noRelayEndpoint != null) {
+            noRelayEndpoint.stop();
+            noRelayEndpoint = null;
+        }
+
+        if (relayEndpointWithInsertion != null) {
+            relayEndpointWithInsertion.stop();
+            relayEndpointWithInsertion = null;
+        }
+    }
+
+    protected static void addOutOfBoundHeader(HeaderTester proxy, boolean invalid) throws JAXBException {
+        InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+        BindingProvider bp = null;
+
+        try {
+            if (handler instanceof BindingProvider) {
+                bp = (BindingProvider) handler;
+                Map<String, Object> requestContext = bp.getRequestContext();
+                requestContext.put(Header.HEADER_LIST, buildOutOfBandHeaderList(invalid));
+            }
+        } catch (JAXBException ex) {
+            throw ex;
+        }
+
+    }
+
+    @Test
+    public void testInHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                     "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+        InHeader me = new InHeader();
+        me.setRequestType("CXF user");
+        InHeaderResponse response = proxy.inHeader(me, Constants.IN_HEADER_DATA);
+        assertEquals("pass", response.getResponseType(), "Expected in band header to propagate but it didn't");
+    }
+
+    @Test
+    public void testOutHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+
+        OutHeader me = new OutHeader();
+        me.setRequestType("CXF user");
+        Holder<OutHeaderResponse> result = new Holder<>(new OutHeaderResponse());
+        Holder<SOAPHeaderData> header = new Holder<>(new SOAPHeaderData());
+        proxy.outHeader(me, result, header);
+        assertEquals("pass", result.value.getResponseType(), "Expected in band header to propagate but it didn't");
+        assertTrue(Constants.equals(Constants.OUT_HEADER_DATA, header.value),
+                "Expected in band response header to propagate but it either didn't "
+                                                                              + " or its contents do not match");
+    }
+
+    @Test
+    public void testInOutHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+        InoutHeader me = new InoutHeader();
+        me.setRequestType("CXF user");
+        Holder<SOAPHeaderData> header = new Holder<>(Constants.IN_OUT_REQUEST_HEADER_DATA);
+        InoutHeaderResponse result = proxy.inoutHeader(me, header);
+        assertEquals("pass", result.getResponseType(), "Expected in band header to propagate but it didn't");
+        assertTrue(Constants.equals(Constants.IN_OUT_RESPONSE_HEADER_DATA, header.value),
+                "Expected in band response header to propagate but it either didn't "
+                                                                                          + " or its contents do not match");
+    }
+
+    @Test
+    public void testInOutOfBandHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+        addOutOfBoundHeader(proxy, false);
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+
+        Me response = proxy.inOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+    }
+
+    @Test
+    public void testInoutOutOfBandHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+        addOutOfBoundHeader(proxy, false);
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Me response = proxy.inoutOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+        validateReturnedOutOfBandHeader(proxy);
+    }
+
+    @Test
+    public void testInoutOutOfBandHeaderCXFClientRelayWithHeaderInsertion() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelayWithInsertion();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertion");
+        addOutOfBoundHeader(proxy, false);
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Me response = proxy.inoutOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+
+        InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+        BindingProvider bp = null;
+        if (!(handler instanceof BindingProvider)) {
+            fail("Unable to cast dynamic proxy InocationHandler to BindingProvider type");
+        }
+
+        bp = (BindingProvider) handler;
+        Map<String, Object> responseContext = bp.getResponseContext();
+        validateReturnedOutOfBandHeaderWithInsertion(responseContext, true);
+    }
+
+    @Test
+    public void testOutOutOfBandHeaderCXFClientRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Me response = proxy.outOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+        validateReturnedOutOfBandHeader(proxy);
+    }
+
+    @Test
+    public void testInOutOfBandHeaderCXFClientNoRelay() throws Exception {
+
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+
+        addOutOfBoundHeader(proxy, false);
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Me response = proxy.inOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the in out of band header *not* to propagate but it did");
+
+    }
+
+    @Test
+    public void testOutOutOfBandHeaderCXFClientNoRelay() throws Exception {
+
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Thread.sleep(5000);
+        Me response = proxy.outOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the out out of band header *not* to propagate but it did");
+        validateReturnedOutOfBandHeader(proxy, false);
+    }
+
+    @Test
+    public void testInoutOutOfBandHeaderCXFClientNoRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+        addOutOfBoundHeader(proxy, false);
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+        Me response = proxy.inoutOutOfBandHeader(me);
+        assertEquals("pass", response.getFirstName(), "Expected the in out of band header to *not* propagate but it did");
+        validateReturnedOutOfBandHeader(proxy, false);
+    }
+
+    @Test
+    public void testInHeaderCXFClientNoRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+        InHeader me = new InHeader();
+        me.setRequestType("CXF user");
+        InHeaderResponse response = null;
+        try {
+            response = proxy.inHeader(me, Constants.IN_HEADER_DATA);
+        } catch (Exception e) {
+            // do nothing
+        }
+        assertEquals("pass", response.getResponseType(), "Expected in in band header *not* to propagate but it did");
+    }
+
+    @Test
+    public void testOutHeaderCXFClientNoRelay() throws Exception {
+        Thread.sleep(5000);
+
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+        OutHeader me = new OutHeader();
+        me.setRequestType("CXF user");
+        Holder<OutHeaderResponse> result = new Holder<>(new OutHeaderResponse());
+        Holder<SOAPHeaderData> header = new Holder<>(new SOAPHeaderData());
+        try {
+            proxy.outHeader(me, result, header);
+        } catch (Exception e) {
+            // do nothing
+        }
+        assertEquals("pass", result.value.getResponseType(),
+                "Ultimate remote HeaderTester.outHeader() destination was not reached");
+        assertNull(header.value, "Expected in band response header *not* to propagate but it did");
+    }
+
+    @Test
+    public void testInoutHeaderCXFClientNoRelay() throws Exception {
+        HeaderService s = new HeaderService(
+                getClass().getClassLoader().getResource("soap_header.wsdl"),
+                HeaderService.SERVICE);
+        HeaderTester proxy = s.getSoapPortNoRelay();
+        ((BindingProvider) proxy).getRequestContext()
+                .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                        "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+        InoutHeader me = new InoutHeader();
+        me.setRequestType("CXF user");
+        Holder<SOAPHeaderData> header = new Holder<>(Constants.IN_OUT_REQUEST_HEADER_DATA);
+        InoutHeaderResponse result = null;
+        try {
+            result = proxy.inoutHeader(me, header);
+        } catch (Exception e) {
+            // do nothing
+        }
+        assertEquals("pass", result.getResponseType(), "Expected in band out header *not* to propagate but it did");
+        assertNull(header.value, "Expected in band response header *not* to propagate but did");
+    }
+
+    @Test
+
+    public void testInoutHeaderCXFClientNoServiceClassNoRelay() throws Exception {
+        // TODO: Fix this test later
+        QName qname = QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SOAPHeaderInfo");
+        String uri = "cxf:bean:routerNoRelayNoServiceClassEndpoint?headerFilterStrategy=#dropAllMessageHeadersStrategy"
+            + "&address=http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayNoServiceClassEndpoint";
+        String requestHeader = "<ns2:SOAPHeaderInfo xmlns:ns2=\"http://apache.org/camel/"
+                               + "component/cxf/soap/headers\"><originator>CxfSoapHeaderRoutePropagationTest.testInOutHeader Requestor"
+                               + "</originator><message>Invoking CxfSoapHeaderRoutePropagationTest.testInOutHeader() Request"
+                               + "</message></ns2:SOAPHeaderInfo>";
+        String requestBody = "<ns2:inoutHeader xmlns:ns2=\"http://apache.org/camel/component/cxf/soap/headers\">"
+                             + "<requestType>CXF user</requestType></ns2:inoutHeader>";
+        List<Source> elements = new ArrayList<>();
+        elements.add(new DOMSource(StaxUtils.read(new StringReader(requestBody)).getDocumentElement()));
+        final List<SoapHeader> headers = new ArrayList<>();
+        headers.add(new SoapHeader(
+                qname,
+                StaxUtils.read(new StringReader(requestHeader)).getDocumentElement()));
+        final CxfPayload<SoapHeader> cxfPayload = new CxfPayload<>(headers, elements, null);
+
+        Exchange exchange = template.request(uri, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody(cxfPayload);
+                exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inoutHeader");
+                exchange.getIn().setHeader(Header.HEADER_LIST, headers);
+            }
+
+        });
+
+        CxfPayload<?> out = exchange.getMessage().getBody(CxfPayload.class);
+        assertEquals(1, out.getBodySources().size());
+
+        assertTrue(out.getBodySources().get(0) instanceof DOMSource);
+
+        assertEquals(0, out.getHeaders().size());
+
+        String responseExp = "<ns2:inoutHeaderResponse xmlns:ns2=\"http://apache.org/camel/"
+                             + "component/cxf/soap/headers\"><responseType>pass</responseType>"
+                             + "</ns2:inoutHeaderResponse>";
+        String response = StaxUtils.toString(out.getBody().get(0));
+        //REVISIT use a more reliable comparison to tolerate some namespaces being added to the root element
+        assertTrue(response.startsWith(responseExp.substring(0, 87))
+                && response.endsWith(responseExp.substring(88, responseExp.length())), response);
+    }
+
+    @Test
+    public void testMessageHeadersRelaysSpringContext() throws Exception {
+        CxfEndpoint endpoint = context.getEndpoint(
+                "cxf:bean:serviceExtraRelays?headerFilterStrategy=#customMessageFilterStrategy", CxfEndpoint.class);
+        CxfHeaderFilterStrategy strategy = (CxfHeaderFilterStrategy) endpoint.getHeaderFilterStrategy();
+        List<MessageHeaderFilter> filters = strategy.getMessageHeaderFilters();
+        assertEquals(2, filters.size(), "Expected number of filters");
+        Map<String, MessageHeaderFilter> messageHeaderFilterMap = strategy.getMessageHeaderFiltersMap();
+        for (String ns : new CustomHeaderFilter().getActivationNamespaces()) {
+            assertEquals(CustomHeaderFilter.class, messageHeaderFilterMap.get(ns).getClass(),
+                    "Expected a filter class for namespace: " + ns);
+        }
+    }
+
+    @Test
+    public void testInOutOfBandHeaderCamelTemplateDirect() throws Exception {
+        doTestInOutOfBandHeaderCamelTemplate("direct:directProducer");
+    }
+
+    @Test
+    public void testOutOutOfBandHeaderCamelTemplateDirect() throws Exception {
+        doTestOutOutOfBandHeaderCamelTemplate("direct:directProducer");
+    }
+
+    @Test
+    public void testInOutOutOfBandHeaderCamelTemplateDirect() throws Exception {
+        doTestInOutOutOfBandHeaderCamelTemplate("direct:directProducer");
+    }
+
+    @Test
+    public void testInOutOfBandHeaderCamelTemplateRelay() throws Exception {
+        doTestInOutOfBandHeaderCamelTemplate("direct:relayProducer");
+    }
+
+    @Test
+    public void testOutOutOfBandHeaderCamelTemplateRelay() throws Exception {
+        doTestOutOutOfBandHeaderCamelTemplate("direct:relayProducer");
+    }
+
+    @Test
+    public void testInOutOutOfBandHeaderCamelTemplateRelay() throws Exception {
+        doTestInOutOutOfBandHeaderCamelTemplate("direct:relayProducer");
+    }
+
+    protected void doTestInOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+        // START SNIPPET: sending
+        Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+        final List<Object> params = new ArrayList<>();
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+
+        params.add(me);
+        senderExchange.getIn().setBody(params);
+        senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inOutOfBandHeader");
+
+        List<Header> headers = buildOutOfBandHeaderList(false);
+        Map<String, Object> requestContext = new HashMap<>();
+        requestContext.put(Header.HEADER_LIST, headers);
+        senderExchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+        Exchange exchange = template.send(producerUri, senderExchange);
+
+        org.apache.camel.Message out = exchange.getMessage();
+        MessageContentsList result = (MessageContentsList) out.getBody();
+        Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+        assertNotNull(responseContext);
+        assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+                "Expected the out of band header to propagate but it didn't");
+
+    }
+
+    protected void doTestOutOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+        // START SNIPPET: sending
+        Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+        final List<Object> params = new ArrayList<>();
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+
+        params.add(me);
+        senderExchange.getIn().setBody(params);
+        senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "outOutOfBandHeader");
+
+        Exchange exchange = template.send(producerUri, senderExchange);
+
+        org.apache.camel.Message out = exchange.getMessage();
+        MessageContentsList result = (MessageContentsList) out.getBody();
+        assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+                "Expected the out of band header to propagate but it didn't");
+        Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+        assertNotNull(responseContext);
+        validateReturnedOutOfBandHeader(responseContext);
+    }
+
+    public void doTestInOutOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+        // START SNIPPET: sending
+        Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+        final List<Object> params = new ArrayList<>();
+        Me me = new Me();
+        me.setFirstName("john");
+        me.setLastName("Doh");
+
+        params.add(me);
+        senderExchange.getIn().setBody(params);
+        senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inoutOutOfBandHeader");
+
+        List<Header> inHeaders = buildOutOfBandHeaderList(false);
+        Map<String, Object> requestContext = new HashMap<>();
+        requestContext.put(Header.HEADER_LIST, inHeaders);
+        senderExchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+        Exchange exchange = template.send(producerUri, senderExchange);
+
+        org.apache.camel.Message out = exchange.getMessage();
+        MessageContentsList result = (MessageContentsList) out.getBody();
+        assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+                "Expected the out of band header to propagate but it didn't");
+        Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+        assertNotNull(responseContext);
+        validateReturnedOutOfBandHeader(responseContext);
+    }
+
+    protected static void validateReturnedOutOfBandHeader(HeaderTester proxy) {
+        validateReturnedOutOfBandHeader(proxy, true);
+    }
+
+    protected static void validateReturnedOutOfBandHeader(HeaderTester proxy, boolean expect) {
+        InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+        BindingProvider bp = null;
+        if (!(handler instanceof BindingProvider)) {
+            fail("Unable to cast dynamic proxy InocationHandler to BindingProvider type");
+        }
+
+        bp = (BindingProvider) handler;
+        Map<String, Object> responseContext = bp.getResponseContext();
+        validateReturnedOutOfBandHeader(responseContext, expect);
+    }
+
+    protected static void validateReturnedOutOfBandHeader(Map<String, Object> responseContext) {
+        validateReturnedOutOfBandHeader(responseContext, true);
+    }
+
+    protected static void validateReturnedOutOfBandHeader(Map<String, Object> responseContext, boolean expect) {
+        OutofBandHeader hdrToTest = null;
+        List<Header> oobHdr = CastUtils.cast((List<?>) responseContext.get(Header.HEADER_LIST));
+        if (!expect) {
+            if (oobHdr == null || oobHdr != null && oobHdr.size() == 0) {
+                return;
+            }
+            fail("Should have got *no* out-of-band headers, but some were found");
+        }
+        if (oobHdr == null) {
+            fail("Should have got List of out-of-band headers");
+        }
+
+        assertEquals(1, oobHdr.size(), "HeaderHolder list expected to conain 1 object received " + oobHdr.size());
+
+        for (Header hdr1 : oobHdr) {
+            if (hdr1.getObject() instanceof Node) {
+                try {
+                    JAXBElement<?> job = (JAXBElement<?>) JAXBContext
+                            .newInstance(org.apache.cxf.outofband.header.ObjectFactory.class)
+                            .createUnmarshaller().unmarshal((Node) hdr1.getObject());
+                    hdrToTest = (OutofBandHeader) job.getValue();
+                } catch (JAXBException ex) {
+                    LOG.warn("JAXB error: {}", ex.getMessage(), ex);
+                }
+            }
+        }
+
+        assertNotNull(hdrToTest, "out-of-band header should not be null");
+        assertEquals("testOobReturnHeaderName", hdrToTest.getName(),
+                "Expected out-of-band Header name testOobReturnHeaderName recevied :"
+                                                                     + hdrToTest.getName());
+        assertEquals("testOobReturnHeaderValue", hdrToTest.getValue(),
+                "Expected out-of-band Header value testOobReturnHeaderValue recevied :"
+                                                                       + hdrToTest.getValue());
+        assertEquals("testReturnHdrAttribute", hdrToTest.getHdrAttribute(),
+                "Expected out-of-band Header attribute testReturnHdrAttribute recevied :" + hdrToTest.getHdrAttribute());
+    }
+
+    protected static List<Header> buildOutOfBandHeaderList(boolean invalid) throws JAXBException {
+        OutofBandHeader ob = new OutofBandHeader();
+        ob.setName("testOobHeader");
+        ob.setValue("testOobHeaderValue");
+        ob.setHdrAttribute(invalid ? "dontProcess" : "testHdrAttribute");
+
+        SoapHeader hdr = new SoapHeader(
+                new QName(Constants.TEST_HDR_NS, Constants.TEST_HDR_REQUEST_ELEM),
+                ob,
+                new JAXBDataBinding(ob.getClass()));
+
+        hdr.setMustUnderstand(invalid);
+
+        List<Header> headers = new ArrayList<>();
+        headers.add(hdr);
+        return headers;
+    }
+
+    protected static void validateReturnedOutOfBandHeaderWithInsertion(Map<String, Object> responseContext, boolean expect) {
+        List<OutofBandHeader> hdrToTest = new ArrayList<>();
+        List<Header> oobHdr = CastUtils.cast((List<?>) responseContext.get(Header.HEADER_LIST));
+        if (!expect) {
+            if (oobHdr == null || oobHdr != null && oobHdr.size() == 0) {
+                return;
+            }
+            fail("Should have got *no* out-of-band headers, but some were found");
+        }
+        if (oobHdr == null) {
+            fail("Should have got List of out-of-band headers");
+        }
+
+        assertEquals(2, oobHdr.size(), "HeaderHolder list expected to conain 2 object received " + oobHdr.size());
+
+        for (Header hdr1 : oobHdr) {
+            if (hdr1.getObject() instanceof Node) {
+                try {
+                    JAXBElement<?> job = (JAXBElement<?>) JAXBContext
+                            .newInstance(org.apache.cxf.outofband.header.ObjectFactory.class)
+                            .createUnmarshaller().unmarshal((Node) hdr1.getObject());
+                    hdrToTest.add((OutofBandHeader) job.getValue());
+                } catch (JAXBException ex) {
+                    LOG.warn("JAXB error: {}", ex.getMessage(), ex);
+                }
+            }
+        }
+
+        assertTrue(hdrToTest.size() > 0, "out-of-band header should not be null");
+        assertEquals("testOobReturnHeaderName", hdrToTest.get(0).getName(),
+                "Expected out-of-band Header name testOobReturnHeaderName recevied :"
+                                                                            + hdrToTest.get(0).getName());
+        assertEquals("testOobReturnHeaderValue", hdrToTest.get(0).getValue(),
+                "Expected out-of-band Header value testOobReturnHeaderValue recevied :"
+                                                                              + hdrToTest.get(0).getValue());
+        assertEquals("testReturnHdrAttribute", hdrToTest.get(0).getHdrAttribute(),
+                "Expected out-of-band Header attribute testReturnHdrAttribute recevied :"
+                                                                                   + hdrToTest.get(0).getHdrAttribute());
+
+        assertEquals("New_testOobHeader", hdrToTest.get(1).getName(),
+                "Expected out-of-band Header name New_testOobHeader recevied :"
+                                                                      + hdrToTest.get(1).getName());
+        assertEquals("New_testOobHeaderValue", hdrToTest.get(1).getValue(),
+                "Expected out-of-band Header value New_testOobHeaderValue recevied :"
+                                                                            + hdrToTest.get(1).getValue());
+        assertEquals("testHdrAttribute", hdrToTest.get(1).getHdrAttribute(),
+                "Expected out-of-band Header attribute testHdrAttribute recevied :"
+                                                                             + hdrToTest.get(1).getHdrAttribute());
+    }
+
+    public static class InsertRequestOutHeaderProcessor implements Processor {
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));
+
+            // Insert a new header
+            String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader "
+                         + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" "
+                         + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">"
+                         + "<name>New_testOobHeader</name><value>New_testOobHeaderValue</value></outofbandHeader>";
+
+            SoapHeader newHeader = new SoapHeader(
+                    soapHeaders.get(0).getName(),
+                    StaxUtils.read(new StringReader(xml)).getDocumentElement());
+            // make sure direction is IN since it is a request message.
+            newHeader.setDirection(Direction.DIRECTION_IN);
+            //newHeader.setMustUnderstand(false);
+            soapHeaders.add(newHeader);
+
+        }
+
+    }
+
+    // START SNIPPET: InsertResponseOutHeaderProcessor
+
+    public static class InsertResponseOutHeaderProcessor implements Processor {
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            // You should be able to get the header if exchange is routed from camel-cxf endpoint
+            List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));
+            if (soapHeaders == null) {
+                // we just create a new soap headers in case the header is null
+                soapHeaders = new ArrayList<>();
+            }
+
+            // Insert a new header
+            String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader "
+                         + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" "
+                         + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">"
+                         + "<name>New_testOobHeader</name><value>New_testOobHeaderValue</value></outofbandHeader>";
+            SoapHeader newHeader = new SoapHeader(
+                    soapHeaders.get(0).getName(),
+                    StaxUtils.read(new StringReader(xml)).getDocumentElement());
+            // make sure direction is OUT since it is a response message.
+            newHeader.setDirection(Direction.DIRECTION_OUT);
+            //newHeader.setMustUnderstand(false);
+            soapHeaders.add(newHeader);
+
+        }
+
+    }
+
+    // END SNIPPET: InsertResponseOutHeaderProcessor
+    
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+        
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+            ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+            return webServerFactory;
+        }
+
+        
+        @Bean
+        CxfEndpoint routerRelayEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        CxfEndpoint serviceRelayEndpoint() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointBackend");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint routerRelayEndpointWithInsertion() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertion");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            cxfEndpoint.getFeatures().add(new LoggingFeature());
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceRelayEndpointWithInsertion() {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertionBackend");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            cxfEndpoint.getFeatures().add(new LoggingFeature());
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint routerNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+            return cxfEndpoint;
+        }
+        
+        
+        @Bean
+        CxfEndpoint routerNoRelayNoServiceClassEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayNoServiceClassEndpoint");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            properties.put("allowStreaming", "false");
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+            return cxfEndpoint;
+        }
+
+        @Bean
+        CxfEndpoint serviceNoRelayNoServiceClassEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("dataFormat", "PAYLOAD");
+            cxfEndpoint.setProperties(properties);
+            cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        CxfEndpoint serviceExtraRelays(HeaderFilterStrategy customMessageFilterStrategy) {
+            CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+            cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/serviceExtraRelays");
+            cxfEndpoint.setWsdlURL("soap_header.wsdl");
+            cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+            cxfEndpoint.setEndpointNameAsQName(
+                QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortCustomRelay"));
+            cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+            cxfEndpoint.setHeaderFilterStrategy(customMessageFilterStrategy);
+            return cxfEndpoint;
+        }
+        
+        @Bean
+        HeaderFilterStrategy dropAllMessageHeadersStrategy() {
+            CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
+            headerFilterStrategy.setRelayHeaders(false);
+            return headerFilterStrategy;
+        }
+        
+        @Bean
+        HeaderFilterStrategy customMessageFilterStrategy() {
+            CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
+            List<MessageHeaderFilter> headerFilterList = new ArrayList<MessageHeaderFilter>();
+            headerFilterList.add(new SoapMessageHeaderFilter());
+            headerFilterList.add(new CustomHeaderFilter());
+            headerFilterStrategy.setMessageHeaderFilters(headerFilterList);
+            return headerFilterStrategy;
+        }
+        
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    
+                    from("cxf:bean:routerRelayEndpoint")
+                        .to("cxf:bean:serviceRelayEndpoint");
+                    from("cxf:bean:routerRelayEndpointWithInsertion")
+                        .process(new InsertRequestOutHeaderProcessor())
+                        .to("cxf:bean:serviceRelayEndpointWithInsertion")
+                        .process(new InsertResponseOutHeaderProcessor());
+                    from("direct:directProducer")
+                        .to("cxf:bean:serviceRelayEndpoint");
+                    from("direct:relayProducer")
+                        .to("cxf://"
+                            + "http://localhost:" + port 
+                            + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint" +
+                            "?serviceClass=\"org.apache.camel.component.cxf.soap.headers.HeaderTester\"");
+                    from("cxf:bean:routerNoRelayEndpoint")
+                        .to("cxf:bean:serviceNoRelayEndpoint");
+                    from("cxf:bean:routerNoRelayNoServiceClassEndpoint")
+                        .to("cxf:bean:serviceNoRelayNoServiceClassEndpoint");
+                    from("cxf:bean:serviceExtraRelays")
+                        .to("mock:result");
+                }
+            };
+        }
+    }
+
+}
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/springxml/CXFMultiPartTest.java
similarity index 86%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/CXFMultiPartTest.java
index de5e711c741..a40f4655b8b 100644
--- 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/springxml/CXFMultiPartTest.java
@@ -14,12 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
 
 import javax.xml.namespace.QName;
 import javax.xml.ws.Endpoint;
 import javax.xml.ws.Service;
 
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.multipart.MultiPartInvokeImpl;
 import org.apache.camel.cxf.multipart.MultiPartInvoke;
 import org.apache.camel.cxf.multipart.types.InE;
 import org.apache.camel.cxf.multipart.types.ObjectFactory;
@@ -38,7 +40,9 @@ import org.springframework.context.annotation.ImportResource;
 import org.springframework.test.annotation.DirtiesContext;
 import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
 import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
-
+/*
+ * This test uses xml beans and camel route definition
+ */
 @DirtiesContext
 @CamelSpringBootTest
 @SpringBootTest(classes = {
@@ -61,15 +65,18 @@ public class CXFMultiPartTest {
     public static final QName ROUTE_PORT_NAME = new QName("http://camel.apache.org/cxf/multipart",
                                                           "MultiPartInvokePort");
     protected static Endpoint endpoint;
+    
+    static int backendSerivcePort = CXFTestSupport.getPort1();
+    static int servletPort = CXFTestSupport.getPort2();
 
     @Bean
     public ServletWebServerFactory servletWebServerFactory() {
-        return new UndertowServletWebServerFactory();
+        return new UndertowServletWebServerFactory(servletPort);
     }
     
     public void startService() {
         Object implementor = new MultiPartInvokeImpl();
-        String address = "http://localhost:16231"
+        String address = "http://localhost:" + backendSerivcePort
                          + "/CXFMultiPartTest/SoapContext/SoapPort";
         endpoint = Endpoint.publish(address, implementor);
 
@@ -85,7 +92,8 @@ public class CXFMultiPartTest {
     @Test
     public void testInvokingServiceFromCXFClient() throws Exception {
         startService();
-        String reply = invokeMultiPartService("http://localhost:8080/services/CXFMultiPartTest/CamelContext/RouterPort", "in0", "in1");
+        String reply = invokeMultiPartService("http://localhost:" + servletPort 
+                                              + "/services/CXFMultiPartTest/CamelContext/RouterPort", "in0", "in1");
         assertNotNull(reply, "No response received from service");
         assertEquals("in0 in1", reply);
 
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
similarity index 97%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
index e5a1bfa36e7..9c34b4118f9 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.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.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.SOAPElement;
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
similarity index 83%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
index ab3c41e9c3a..ac4b823488b 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
@@ -14,19 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cxf.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
 
+import org.apache.camel.component.cxf.common.CXFTestSupport;
 import org.apache.camel.component.cxf.security.GreetingService;
 import org.apache.camel.component.cxf.security.jaas.SimpleLoginModule;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ImportResource;
 import org.springframework.test.annotation.DirtiesContext;
 
@@ -46,22 +49,25 @@ import java.util.List;
 @SpringBootTest(classes = {
 		CamelAutoConfiguration.class,
 		WSSUsernameTokenTest.class,
-		SimpleLoginModule.class
-}
+		SimpleLoginModule.class,
+		CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
 )
 @ImportResource({
 		"classpath:routes/soap-security.xml"
 })
 public class WSSUsernameTokenTest {
-	private static final Logger LOG = LoggerFactory.getLogger(WSSUsernameTokenTest.class);
-
+	
 	private static final String BAD_PASSWORD = "123";
 
 	private static final URL WSDL_URL;
+	
+	static int port = CXFTestSupport.getPort1();
 
 	static {
 		try {
-			WSDL_URL = new URL("http://localhost:16232/cxf/ws/greeting-service?wsdl");
+			WSDL_URL = new URL("http://localhost:" + port 
+			                   + "/services/greeting-service?wsdl");
 		} catch (MalformedURLException e) {
 			throw new RuntimeException(e);
 		}
@@ -69,6 +75,11 @@ public class WSSUsernameTokenTest {
 
 	private static final QName SERVICE_NAME = new QName("http://security.cxf.component.camel.apache.org/",
 			"GreetingServiceImplService");
+	
+	@Bean
+	public ServletWebServerFactory servletWebServerFactory() {
+	    return new UndertowServletWebServerFactory(port);
+	}
 
 	private void addWSSUsernameTokenHandler(Service service, final String username, final String password) {
 		// set a handler resolver providing WSSUsernameTokenHandler in the handler chain
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java
new file mode 100644
index 00000000000..dafd4cee995
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java
@@ -0,0 +1,231 @@
+package org.apache.camel.component.cxf.soap.springboot.ssl;
+
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509ExtendedKeyManager;
+
+import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer;
+import org.springframework.boot.web.server.Ssl;
+import org.springframework.boot.web.server.SslConfigurationValidator;
+import org.springframework.boot.web.server.SslStoreProvider;
+import org.springframework.boot.web.server.WebServerException;
+import org.springframework.util.ResourceUtils;
+import org.xnio.Options;
+import org.xnio.Sequence;
+import org.xnio.SslClientAuthMode;
+
+import io.undertow.Undertow;
+
+public class SslBuilderCustomizer implements UndertowBuilderCustomizer {
+    private final int port;
+
+    private final InetAddress address;
+
+    private final Ssl ssl;
+
+    private final SslStoreProvider sslStoreProvider;
+
+    SslBuilderCustomizer(int port, InetAddress address, Ssl ssl, SslStoreProvider sslStoreProvider) {
+            this.port = port;
+            this.address = address;
+            this.ssl = ssl;
+            this.sslStoreProvider = sslStoreProvider;
+    }
+
+    public void customize(Undertow.Builder builder) {
+            try {
+                    SSLContext sslContext = SSLContext.getInstance(this.ssl.getProtocol());
+                    sslContext.init(getKeyManagers(this.ssl, this.sslStoreProvider),
+                                    getTrustManagers(this.ssl, this.sslStoreProvider), null);
+                    builder.addHttpsListener(this.port, getListenAddress(), sslContext);
+                    builder.setSocketOption(Options.SSL_CLIENT_AUTH_MODE, getSslClientAuthMode(this.ssl));
+                    if (this.ssl.getEnabledProtocols() != null) {
+                            builder.setSocketOption(Options.SSL_ENABLED_PROTOCOLS, Sequence.of(this.ssl.getEnabledProtocols()));
+                    }
+                    if (this.ssl.getCiphers() != null) {
+                            builder.setSocketOption(Options.SSL_ENABLED_CIPHER_SUITES, Sequence.of(this.ssl.getCiphers()));
+                    }
+            }
+            catch (NoSuchAlgorithmException | KeyManagementException ex) {
+                    throw new IllegalStateException(ex);
+            }
+    }
+
+    private String getListenAddress() {
+            if (this.address == null) {
+                    return "0.0.0.0";
+            }
+            return this.address.getHostAddress();
+    }
+
+    private SslClientAuthMode getSslClientAuthMode(Ssl ssl) {
+            if (ssl.getClientAuth() == Ssl.ClientAuth.NEED) {
+                    return SslClientAuthMode.REQUIRED;
+            }
+            if (ssl.getClientAuth() == Ssl.ClientAuth.WANT) {
+                    return SslClientAuthMode.REQUESTED;
+            }
+            return SslClientAuthMode.NOT_REQUESTED;
+    }
+
+    private KeyManager[] getKeyManagers(Ssl ssl, SslStoreProvider sslStoreProvider) {
+            try {
+                    KeyStore keyStore = getKeyStore(ssl, sslStoreProvider);
+                    SslConfigurationValidator.validateKeyAlias(keyStore, ssl.getKeyAlias());
+                    KeyManagerFactory keyManagerFactory = KeyManagerFactory
+                                    .getInstance(KeyManagerFactory.getDefaultAlgorithm());
+                    String keyPassword = (sslStoreProvider != null) ? sslStoreProvider.getKeyPassword() : null;
+                    if (keyPassword == null) {
+                            keyPassword = (ssl.getKeyPassword() != null) ? ssl.getKeyPassword() : ssl.getKeyStorePassword();
+                    }
+                    keyManagerFactory.init(keyStore, (keyPassword != null) ? keyPassword.toCharArray() : null);
+                    if (ssl.getKeyAlias() != null) {
+                            return getConfigurableAliasKeyManagers(ssl, keyManagerFactory.getKeyManagers());
+                    }
+                    return keyManagerFactory.getKeyManagers();
+            }
+            catch (Exception ex) {
+                    throw new IllegalStateException(ex);
+            }
+    }
+
+    private KeyManager[] getConfigurableAliasKeyManagers(Ssl ssl, KeyManager[] keyManagers) {
+            for (int i = 0; i < keyManagers.length; i++) {
+                    if (keyManagers[i] instanceof X509ExtendedKeyManager) {
+                            keyManagers[i] = new ConfigurableAliasKeyManager((X509ExtendedKeyManager) keyManagers[i],
+                                            ssl.getKeyAlias());
+                    }
+            }
+            return keyManagers;
+    }
+
+    private KeyStore getKeyStore(Ssl ssl, SslStoreProvider sslStoreProvider) throws Exception {
+            if (sslStoreProvider != null) {
+                    return sslStoreProvider.getKeyStore();
+            }
+            return loadKeyStore(ssl.getKeyStoreType(), ssl.getKeyStoreProvider(), ssl.getKeyStore(),
+                            ssl.getKeyStorePassword());
+    }
+
+    private TrustManager[] getTrustManagers(Ssl ssl, SslStoreProvider sslStoreProvider) {
+            try {
+                    KeyStore store = getTrustStore(ssl, sslStoreProvider);
+                    TrustManagerFactory trustManagerFactory = TrustManagerFactory
+                                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
+                    trustManagerFactory.init(store);
+                    return trustManagerFactory.getTrustManagers();
+            }
+            catch (Exception ex) {
+                    throw new IllegalStateException(ex);
+            }
+    }
+
+    private KeyStore getTrustStore(Ssl ssl, SslStoreProvider sslStoreProvider) throws Exception {
+            if (sslStoreProvider != null) {
+                    return sslStoreProvider.getTrustStore();
+            }
+            return loadTrustStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(), ssl.getTrustStore(),
+                            ssl.getTrustStorePassword());
+    }
+
+    private KeyStore loadKeyStore(String type, String provider, String resource, String password) throws Exception {
+            return loadStore(type, provider, resource, password);
+    }
+
+    private KeyStore loadTrustStore(String type, String provider, String resource, String password) throws Exception {
+            if (resource == null) {
+                    return null;
+            }
+            return loadStore(type, provider, resource, password);
+    }
+
+    private KeyStore loadStore(String type, String provider, String resource, String password) throws Exception {
+            type = (type != null) ? type : "JKS";
+            KeyStore store = (provider != null) ? KeyStore.getInstance(type, provider) : KeyStore.getInstance(type);
+            try {
+                    URL url = ResourceUtils.getURL(resource);
+                    try (InputStream stream = url.openStream()) {
+                            store.load(stream, (password != null) ? password.toCharArray() : null);
+                    }
+                    return store;
+            }
+            catch (Exception ex) {
+                    throw new WebServerException("Could not load key store '" + resource + "'", ex);
+            }
+    }
+
+    /**
+     * {@link X509ExtendedKeyManager} that supports custom alias configuration.
+     */
+    private static class ConfigurableAliasKeyManager extends X509ExtendedKeyManager {
+
+            private final X509ExtendedKeyManager keyManager;
+
+            private final String alias;
+
+            ConfigurableAliasKeyManager(X509ExtendedKeyManager keyManager, String alias) {
+                    this.keyManager = keyManager;
+                    this.alias = alias;
+            }
+
+            @Override
+            public String chooseEngineClientAlias(String[] strings, Principal[] principals, SSLEngine sslEngine) {
+                    return this.keyManager.chooseEngineClientAlias(strings, principals, sslEngine);
+            }
+
+            @Override
+            public String chooseEngineServerAlias(String s, Principal[] principals, SSLEngine sslEngine) {
+                    if (this.alias == null) {
+                            return this.keyManager.chooseEngineServerAlias(s, principals, sslEngine);
+                    }
+                    return this.alias;
+            }
+
+            @Override
+            public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+                    return this.keyManager.chooseClientAlias(keyType, issuers, socket);
+            }
+
+            @Override
+            public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+                    return this.keyManager.chooseServerAlias(keyType, issuers, socket);
+            }
+
+            @Override
+            public X509Certificate[] getCertificateChain(String alias) {
+                    return this.keyManager.getCertificateChain(alias);
+            }
+
+            @Override
+            public String[] getClientAliases(String keyType, Principal[] issuers) {
+                    return this.keyManager.getClientAliases(keyType, issuers);
+            }
+
+            @Override
+            public PrivateKey getPrivateKey(String alias) {
+                    return this.keyManager.getPrivateKey(alias);
+            }
+
+            @Override
+            public String[] getServerAliases(String keyType, Principal[] issuers) {
+                    return this.keyManager.getServerAliases(keyType, issuers);
+            }
+
+    }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java
new file mode 100644
index 00000000000..ccf6666c4c5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java
@@ -0,0 +1,250 @@
+/*
+ * 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
+ *
... 3671 lines suppressed ...


[camel-spring-boot] 01/02: ✅ CXF Simple JAAS Test (#593)

Posted by ff...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f144eed1d1fd4ae52bdab4dcd03b5ea7ba88e1a6
Author: Federico Mariani <34...@users.noreply.github.com>
AuthorDate: Thu Jul 28 07:33:47 2022 +0200

    ✅ CXF Simple JAAS Test (#593)
    
    (cherry picked from commit 421e9cfacded78c26384be75c17edb30e27b16ee)
---
 components-starter/camel-cxf-soap-starter/pom.xml  |   5 +
 .../component/cxf/security/GreetingService.java    |  25 +++++
 .../cxf/security/GreetingServiceImpl.java          |  28 +++++
 .../cxf/security/jaas/SimpleLoginModule.java       | 104 ++++++++++++++++++
 .../soap/springboot/WSSUsernameTokenHandler.java   |  85 ++++++++++++++
 .../cxf/soap/springboot/WSSUsernameTokenTest.java  | 122 +++++++++++++++++++++
 .../src/test/resources/routes/soap-security.xml    |  49 +++++++++
 .../src/test/resources/simple-jaas.conf            |  19 ++++
 .../springboot/MllpMaxConcurrentConsumersTest.java |   2 +-
 .../MllpTcpClientProducerConnectionErrorTest.java  |   3 -
 10 files changed, 438 insertions(+), 4 deletions(-)

diff --git a/components-starter/camel-cxf-soap-starter/pom.xml b/components-starter/camel-cxf-soap-starter/pom.xml
index 614681087ba..11bdee34a66 100644
--- a/components-starter/camel-cxf-soap-starter/pom.xml
+++ b/components-starter/camel-cxf-soap-starter/pom.xml
@@ -45,6 +45,11 @@
       <version>${cxf-version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-ws-security</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-cxf-common</artifactId>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingService.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingService.java
new file mode 100644
index 00000000000..d6312cc7988
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingService.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.security;
+
+import javax.jws.WebService;
+
+@WebService
+public interface GreetingService {
+
+	String greet(String name);
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingServiceImpl.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingServiceImpl.java
new file mode 100644
index 00000000000..7e84b17865a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/GreetingServiceImpl.java
@@ -0,0 +1,28 @@
+/*
+ * 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.security;
+
+import javax.jws.WebService;
+
+@WebService(endpointInterface = "org.apache.camel.component.cxf.security.GreetingService")
+public class GreetingServiceImpl implements GreetingService {
+
+	@Override
+	public String greet(String name) {
+		return "Hello " + name;
+	}
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/jaas/SimpleLoginModule.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/jaas/SimpleLoginModule.java
new file mode 100644
index 00000000000..6d2302d05c8
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/security/jaas/SimpleLoginModule.java
@@ -0,0 +1,104 @@
+/*
+ * 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.security.jaas;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+
+import java.net.URL;
+import java.util.Map;
+
+/**
+ * Simple LoginModule which checks plain username and password.
+ */
+@Component
+public class SimpleLoginModule implements LoginModule {
+	private static final Logger LOG = LoggerFactory.getLogger(SimpleLoginModule.class);
+
+	public static final String USERNAME = "admin";
+	public static final String PASSWORD = "admin";
+
+	private CallbackHandler callbackHandler;
+
+	private boolean succeeded = false;
+
+	static {
+		final URL jaasConfig = SimpleLoginModule.class.getClassLoader().getResource("simple-jaas.conf");
+		if (jaasConfig != null) {
+			// Set jaas configuration file
+			System.setProperty("java.security.auth.login.config", jaasConfig.toString());
+		} else {
+			LOG.debug("JAAS configuration doesn't exist.");
+		}
+	}
+
+	public SimpleLoginModule() {
+	}
+
+	public boolean abort() throws LoginException {
+		return false;
+	}
+
+	public boolean commit() throws LoginException {
+		return succeeded;
+	}
+
+	public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+		this.callbackHandler = callbackHandler;
+		succeeded = false;
+	}
+
+	public boolean login() throws LoginException {
+		succeeded = false;
+		final Callback[] callbacks = new Callback[2];
+		callbacks[0] = new NameCallback("name:");
+		callbacks[1] = new PasswordCallback("password:", false);
+
+		try {
+			callbackHandler.handle(callbacks);
+		} catch (Exception e) {
+			throw new LoginException("Error with callback processing.");
+		}
+
+		final NameCallback nameCallback = (NameCallback) callbacks[0];
+		final PasswordCallback passwordCallback = (PasswordCallback) callbacks[1];
+
+		final String name = nameCallback.getName();
+		final String password = new String(passwordCallback.getPassword());
+
+		if (USERNAME.equals(name) && PASSWORD.equals(password)) {
+			succeeded = true;
+		} else {
+			throw new FailedLoginException("Sorry! No login for you.");
+		}
+		return succeeded;
+	}
+
+	public boolean logout() throws LoginException {
+		return false;
+	}
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
new file mode 100644
index 00000000000..e5a1bfa36e7
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
@@ -0,0 +1,85 @@
+/*
+ * 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.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import java.util.Set;
+
+public class WSSUsernameTokenHandler implements SOAPHandler<SOAPMessageContext> {
+
+	private final String username;
+	private final String password;
+
+	public WSSUsernameTokenHandler(String userName, String password) {
+		this.username = userName;
+		this.password = password;
+	}
+
+	@Override
+	public boolean handleMessage(SOAPMessageContext context) {
+		final Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+		if (isRequest.booleanValue()) {
+			try {
+				final SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();
+				SOAPHeader header = envelope.getHeader();
+				if (header == null) {
+					header = envelope.addHeader();
+				}
+
+				final SOAPElement securityElement = header.addChildElement("Security", "wsse",
+						"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
+
+				final SOAPElement usernameTokenElement = securityElement.addChildElement("UsernameToken", "wsse");
+				usernameTokenElement.addAttribute(new QName("xmlns:wsu"),
+						"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
+
+				final SOAPElement usernameElement = usernameTokenElement.addChildElement("Username", "wsse");
+				usernameElement.addTextNode(username);
+
+				final SOAPElement passwordElement = usernameTokenElement.addChildElement("Password", "wsse");
+				passwordElement.setAttribute("Type",
+						"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0"
+								+ "#PasswordText");
+				passwordElement.addTextNode(password);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return true;
+	}
+
+	@Override
+	public boolean handleFault(SOAPMessageContext context) {
+		return true;
+	}
+
+	@Override
+	public void close(MessageContext context) {
+	}
+
+	@Override
+	public Set<QName> getHeaders() {
+		return null;
+	}
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
new file mode 100644
index 00000000000..ab3c41e9c3a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.component.cxf.security.GreetingService;
+import org.apache.camel.component.cxf.security.jaas.SimpleLoginModule;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.test.annotation.DirtiesContext;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import javax.xml.ws.handler.HandlerResolver;
+import javax.xml.ws.handler.PortInfo;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+		CamelAutoConfiguration.class,
+		WSSUsernameTokenTest.class,
+		SimpleLoginModule.class
+}
+)
+@ImportResource({
+		"classpath:routes/soap-security.xml"
+})
+public class WSSUsernameTokenTest {
+	private static final Logger LOG = LoggerFactory.getLogger(WSSUsernameTokenTest.class);
+
+	private static final String BAD_PASSWORD = "123";
+
+	private static final URL WSDL_URL;
+
+	static {
+		try {
+			WSDL_URL = new URL("http://localhost:16232/cxf/ws/greeting-service?wsdl");
+		} catch (MalformedURLException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static final QName SERVICE_NAME = new QName("http://security.cxf.component.camel.apache.org/",
+			"GreetingServiceImplService");
+
+	private void addWSSUsernameTokenHandler(Service service, final String username, final String password) {
+		// set a handler resolver providing WSSUsernameTokenHandler in the handler chain
+		final HandlerResolver handlerResolver = new HandlerResolver() {
+			@Override
+			public List<Handler> getHandlerChain(PortInfo portInfo) {
+				final ArrayList<Handler> handlerChain = new ArrayList<>();
+				handlerChain.add(new WSSUsernameTokenHandler(username, password));
+				return handlerChain;
+			}
+		};
+		service.setHandlerResolver(handlerResolver);
+	}
+
+	@Test
+	public void testAuthenticationCorrectCredentials() throws Exception {
+		final Service service = Service.create(WSDL_URL, SERVICE_NAME);
+		addWSSUsernameTokenHandler(service, SimpleLoginModule.USERNAME, SimpleLoginModule.PASSWORD);
+		final GreetingService greetingService = service.getPort(GreetingService.class);
+
+		final String reply = greetingService.greet("you");
+		Assertions.assertEquals(reply, "Hello you");
+	}
+
+	@Test
+	public void testAuthenticationIncorrectCredentials() throws Exception {
+		final Service service = Service.create(WSDL_URL, SERVICE_NAME);
+		addWSSUsernameTokenHandler(service, SimpleLoginModule.USERNAME, BAD_PASSWORD);
+		final GreetingService greetingService = service.getPort(GreetingService.class);
+
+		try {
+			greetingService.greet("you");
+			Assertions.fail("Authentication should failed");
+		} catch (Exception e) {
+			Assertions.assertTrue(e.getMessage().contains("Authentication failed"));
+		}
+	}
+
+	@Test
+	public void testAuthenticationMissingCredentials() throws Exception {
+		final Service service = Service.create(WSDL_URL, SERVICE_NAME);
+		final GreetingService greetingService = service.getPort(GreetingService.class);
+
+		try {
+			greetingService.greet("you");
+			Assertions.fail("Authentication should failed");
+		} catch (Exception e) {
+			Assertions.assertTrue(e.getMessage().contains("security error"));
+		}
+	}
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/resources/routes/soap-security.xml b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/soap-security.xml
new file mode 100644
index 00000000000..a125fe67d5c
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/resources/routes/soap-security.xml
@@ -0,0 +1,49 @@
+<?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"
+		xmlns:jaxws="http://cxf.apache.org/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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
+
+	<jaxws:endpoint id="greetingService" address="http://localhost:16232/cxf/ws/greeting-service" implementor="org.apache.camel.component.cxf.security.GreetingServiceImpl">
+
+		<jaxws:inInterceptors>
+			<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
+				<property name="properties">
+					<map>
+						<entry key="action" value="UsernameToken"/>
+						<entry key="passwordType" value="PasswordText"/>
+					</map>
+				</property>
+			</bean>
+			<bean class="org.apache.cxf.interceptor.security.JAASLoginInterceptor">
+				<property name="contextName" value="simple-jaas"/>
+			</bean>
+		</jaxws:inInterceptors>
+
+		<jaxws:properties>
+			<entry key="ws-security.validate.token" value="false"/>
+		</jaxws:properties>
+	</jaxws:endpoint>
+</beans>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/resources/simple-jaas.conf b/components-starter/camel-cxf-soap-starter/src/test/resources/simple-jaas.conf
new file mode 100644
index 00000000000..5c0ae3156d4
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/resources/simple-jaas.conf
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+simple-jaas{
+  org.apache.camel.component.cxf.security.jaas.SimpleLoginModule required;
+};
diff --git a/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpMaxConcurrentConsumersTest.java b/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpMaxConcurrentConsumersTest.java
index 5a29e7c74da..4d7284d0440 100644
--- a/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpMaxConcurrentConsumersTest.java
+++ b/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpMaxConcurrentConsumersTest.java
@@ -47,7 +47,7 @@ import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
 
 
-@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
+@DirtiesContext
 @CamelSpringBootTest
 @SpringBootTest(
     classes = {
diff --git a/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpTcpClientProducerConnectionErrorTest.java b/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpTcpClientProducerConnectionErrorTest.java
index 393f0446142..e5e25f1f6a3 100644
--- a/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpTcpClientProducerConnectionErrorTest.java
+++ b/components-starter/camel-mllp-starter/src/test/java/org/apache/camel/component/mllp/springboot/MllpTcpClientProducerConnectionErrorTest.java
@@ -45,12 +45,9 @@ 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.AvailablePortFinder;
 import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
 
-
-@DirtiesContext
 @CamelSpringBootTest
 @SpringBootTest(
     classes = {