diff --git a/distribution/src/main/release/samples/ws_transaction/README.md b/distribution/src/main/release/samples/ws_transaction/README.md
new file mode 100644
index 0000000..795c144
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/README.md
@@ -0,0 +1,40 @@
+CXF Web Service Transaction Demo
+================================
+This demo shows how to use the JTA->WSAT->JTA bridge in the two differnet web services by using the apache-cxf, spring-boot and narayana.
+
+Buiding and running the demo
+----------------------------
+
+From the base directory of this sample you should use maven to build it
+```
+mvn clean install
+```
+
+And open the console to launch the first web service FirstServiceAT
+```
+cd ws_first
+mvn spring-boot:run
+```
+open another console to launch the second web service SecondServiceAT
+```
+cd ws_second
+mvn spring-boot:run
+```
+
+Now you need to run the demo
+```
+cd client
+mvn test -Ptest
+```
+
+JTA->WSAT bridge in the client side
+================
+It can wrap the local transaction and create a bridge between the JTA and WSAT transaction. 
+From the client side, we use the *JaxWSTxOutboundBridgeHandler* to create a mapping of the JTA and Subordinate WSAT
+also the *EnabledWSTXHandler* to propagate the WSAT transaction in the SOAP message headers.
+
+WSAT->JTA bridge in the server side
+================
+From the server side, we use the *JaxWSSubordinateHeaderContextProcessor* to import the Subordinate WSAT transaction from the outside
+and the *JaxWSHeaderContextProcessor* to resume the WSAT transaction and the *OptionalJaxWSTxInboundBridgeHandler* to create the bridge
+the WSAT and JTA.
diff --git a/distribution/src/main/release/samples/ws_transaction/client/pom.xml b/distribution/src/main/release/samples/ws_transaction/client/pom.xml
new file mode 100644
index 0000000..2ba4ba1
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.cxf.samples</groupId>
+        <artifactId>ws_transaction</artifactId>
+        <version>3.3.2-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>spring-boot-sample-ws-cxf-client</artifactId>
+    <name>Spring Boot CXF Web Client</name>
+    <description>Spring Boot CXF Web Client</description>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.cxf.samples</groupId>
+            <artifactId>spring-boot-sample-ws-cxf-first-service</artifactId>
+	    <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf.samples</groupId>
+            <artifactId>spring-boot-sample-ws-cxf-second-service</artifactId>
+	    <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+		<version>3.1</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/BridgeFromJTATest.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/BridgeFromJTATest.java
new file mode 100644
index 0000000..79049df
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/BridgeFromJTATest.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 sample.ws.service;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.transaction.UserTransaction;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = SampleWsApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT)
+public class  BridgeFromJTATest {
+
+    @Autowired
+    private UserTransaction ut;
+
+    private FirstServiceAT firstClient;
+    private SecondServiceAT secondClient;
+
+
+    @Before
+    public void setUp() throws Exception {
+        firstClient = FirstClient.newInstance();
+        secondClient = SecondClient.newInstance();
+    }
+
+    @After
+    public void teardownTest() throws Exception {
+        rollbackIfActive(ut);
+        try {
+            ut.begin();
+            firstClient.resetCounter();
+            secondClient.resetCounter();
+            ut.commit();
+        } finally {
+            rollbackIfActive(ut);
+        }
+    }
+
+
+    @Test
+    public void testCommit() throws Exception {
+        ut.begin();
+        firstClient.incrementCounter(1);
+        secondClient.incrementCounter(1);
+        ut.commit();
+
+        ut.begin();
+        int counter1 = firstClient.getCounter();
+        int counter2 = secondClient.getCounter();
+        ut.commit();
+
+        Assert.assertEquals(1, counter1);
+        Assert.assertEquals(1, counter2);
+    }
+
+    @Test
+    public void testClientDrivenRollback() throws Exception {
+        ut.begin();
+        firstClient.incrementCounter(1);
+        secondClient.incrementCounter(1);
+        ut.rollback();
+
+        ut.begin();
+        int counter1 = firstClient.getCounter();
+        int counter2 = secondClient.getCounter();
+        ut.commit();
+
+        Assert.assertEquals(0, counter1);
+        Assert.assertEquals(0, counter2);
+    }
+
+
+    /**
+     * Utility method for rolling back a transaction if it is currently active.
+     *
+     * @param ut The User Business Activity to cancel.
+     */
+    private void rollbackIfActive(UserTransaction ut) {
+        try {
+            ut.rollback();
+        } catch (Throwable th2) {
+            // do nothing, not active
+        }
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/FirstClient.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/FirstClient.java
new file mode 100644
index 0000000..557faec
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/FirstClient.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import com.arjuna.mw.wst11.client.EnabledWSTXHandler;
+import org.jboss.jbossts.txbridge.outbound.JaxWSTxOutboundBridgeHandler;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+public class FirstClient {
+    public static FirstServiceAT newInstance() throws Exception {
+        URL wsdlLocation = new URL("http://localhost:8081/Service/FirstServiceAT?wsdl");
+        QName serviceName = new QName("http://service.ws.sample", "FirstServiceATService");
+        QName portName = new QName("http://service.ws.sample", "FirstServiceAT");
+
+        Service service = Service.create(wsdlLocation, serviceName);
+        FirstServiceAT client = service.getPort(portName, FirstServiceAT.class);
+
+        List<Handler> handlerChain = new ArrayList<>();
+        JaxWSTxOutboundBridgeHandler txOutboundBridgeHandler = new JaxWSTxOutboundBridgeHandler();
+        EnabledWSTXHandler wstxHandler = new EnabledWSTXHandler();
+
+        handlerChain.add(txOutboundBridgeHandler);
+        handlerChain.add(wstxHandler);
+
+        ((BindingProvider)client).getBinding().setHandlerChain(handlerChain);
+
+        return client;
+    }
+
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SampleWsApplication.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SampleWsApplication.java
new file mode 100644
index 0000000..8ee5578
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SampleWsApplication.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+
+@SpringBootApplication
+public class SampleWsApplication {
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SecondClient.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SecondClient.java
new file mode 100644
index 0000000..e945431
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/SecondClient.java
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import com.arjuna.mw.wst11.client.EnabledWSTXHandler;
+import org.jboss.jbossts.txbridge.outbound.JaxWSTxOutboundBridgeHandler;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+public class SecondClient {
+    public static SecondServiceAT newInstance() throws Exception {
+        URL wsdlLocation = new URL("http://localhost:8082/Service/SecondServiceAT?wsdl");
+        QName serviceName = new QName("http://service.ws.sample", "SecondServiceATService");
+        QName portName = new QName("http://service.ws.sample", "SecondServiceAT");
+
+        Service service = Service.create(wsdlLocation, serviceName);
+        SecondServiceAT client = service.getPort(portName, SecondServiceAT.class);
+
+
+        List<Handler> handlerChain = new ArrayList<>();
+        JaxWSTxOutboundBridgeHandler txOutboundBridgeHandler = new JaxWSTxOutboundBridgeHandler();
+        EnabledWSTXHandler wstxHandler = new EnabledWSTXHandler();
+
+        handlerChain.add(txOutboundBridgeHandler);
+        handlerChain.add(wstxHandler);
+
+        ((BindingProvider)client).getBinding().setHandlerChain(handlerChain);
+
+        return client;
+    }
+
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/WebServiceConfig.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/WebServiceConfig.java
new file mode 100644
index 0000000..eb4fe76
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/WebServiceConfig.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample.ws.service;
+
+import com.arjuna.webservices11.wsat.sei.CoordinatorPortTypeImpl;
+import com.arjuna.webservices11.wscoor.sei.RegistrationPortTypeImpl;
+import org.apache.cxf.Bus;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.xml.ws.Endpoint;
+
+@Configuration
+public class WebServiceConfig {
+
+    @Autowired
+    private Bus bus;
+
+    @Bean
+    public Endpoint registration() {
+        EndpointImpl endpoint = new EndpointImpl(bus, new RegistrationPortTypeImpl());
+        endpoint.publish("/ws-c11/RegistrationService");
+        return endpoint;
+    }
+
+    @Bean
+    public Endpoint coordinator() {
+        EndpointImpl endpoint = new EndpointImpl(bus, new CoordinatorPortTypeImpl());
+        endpoint.publish("/ws-t11-coordinator/CoordinatorService");
+        return endpoint;
+
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/XTSConfig.java b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/XTSConfig.java
new file mode 100644
index 0000000..5a5aa66
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/java/sample/ws/service/XTSConfig.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import org.jboss.jbossts.XTSService;
+import org.jboss.jbossts.txbridge.outbound.OutboundBridgeRecoveryManager;
+import org.jboss.jbossts.xts.environment.XTSEnvironmentBean;
+import org.jboss.jbossts.xts.environment.XTSPropertyManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+@Configuration
+public class XTSConfig {
+    @Bean(name = "xtsService", initMethod = "start", destroyMethod = "stop")
+    public XTSService xtsService() {
+
+        XTSEnvironmentBean xtsEnvironmentBean = XTSPropertyManager.getXTSEnvironmentBean();
+        //xtsEnvironmentBean.setXtsInitialisations();
+
+        XTSService service = new XTSService();
+        return service;
+    }
+
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    @DependsOn({"xtsService"})
+    public OutboundBridgeRecoveryManager outboundBridgeRecoveryManager() {
+        return new OutboundBridgeRecoveryManager();
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/client/src/test/resources/application.properties b/distribution/src/main/release/samples/ws_transaction/client/src/test/resources/application.properties
new file mode 100644
index 0000000..e7592bf
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/client/src/test/resources/application.properties
@@ -0,0 +1,2 @@
+narayana.log-dir=./target/narayana/
+cxf.path=/
diff --git a/distribution/src/main/release/samples/ws_transaction/pom.xml b/distribution/src/main/release/samples/ws_transaction/pom.xml
new file mode 100644
index 0000000..82f89c0
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/pom.xml
@@ -0,0 +1,141 @@
+<?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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>ws_transaction</artifactId>
+    <name>Spring Boot CXF Web Services Transaction Sample</name>
+    <description>Spring Boot CXF Web Services Transaction Sample</description>
+    <parent>
+        <groupId>org.apache.cxf.samples</groupId>
+        <artifactId>cxf-samples</artifactId>
+        <version>3.3.3-SNAPSHOT</version>
+    </parent>
+    <packaging>pom</packaging>
+    <properties>
+        <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
+	<cxf.version>${project.version}</cxf.version>
+        <narayana.spring.boot.version>2.1.0</narayana.spring.boot.version>
+        <narayana.version>5.9.0.Final</narayana.version>
+        <version.org.jboss.ws>1.0.2.Final</version.org.jboss.ws>
+        <jbossws-cxf.version>5.2.4.Final</jbossws-cxf.version>
+    </properties>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <!-- Import dependency management from Spring Boot -->
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring.boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-features-logging</artifactId>
+            <version>${cxf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
+            <version>${cxf.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>me.snowdrop</groupId>
+            <artifactId>narayana-spring-boot-starter</artifactId>
+            <version>${narayana.spring.boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.narayana.xts</groupId>
+            <artifactId>jbossxts</artifactId>
+            <version>${narayana.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.narayana</groupId>
+            <artifactId>jbosstxbridge</artifactId>
+            <version>${narayana.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.ws</groupId>
+            <artifactId>jbossws-api</artifactId>
+            <version>${version.org.jboss.ws}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.ws.cxf</groupId>
+            <artifactId>jbossws-cxf-client</artifactId>
+            <version>${jbossws-cxf.version}</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web-services</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <modules>
+        <module>ws_first</module>
+        <module>ws_second</module>
+        <module>client</module>
+    </modules>
+    <profiles>
+        <profile>
+            <id>test</id>
+            <properties>
+                <maven.test.skip>false</maven.test.skip>
+            </properties>
+        </profile>
+    </profiles>
+</project>
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/pom.xml b/distribution/src/main/release/samples/ws_transaction/ws_first/pom.xml
new file mode 100644
index 0000000..7d3a050
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.cxf.samples</groupId>
+        <artifactId>ws_transaction</artifactId>
+        <version>3.3.3-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>spring-boot-sample-ws-cxf-first-service</artifactId>
+    <name>Spring Boot CXF First Web Services</name>
+    <description>Spring Boot CXF First Web Services</description>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+		<version>${spring.boot.version}</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+		<version>3.1</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/SampleWsApplication.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/SampleWsApplication.java
new file mode 100644
index 0000000..1abe821
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/SampleWsApplication.java
@@ -0,0 +1,30 @@
+/**
+ * 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 sample.ws;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+//CHECKSTYLE:OFF
+@SpringBootApplication
+public class SampleWsApplication {
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(SampleWsApplication.class, args);
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/WebServiceConfig.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/WebServiceConfig.java
new file mode 100644
index 0000000..dc89a03
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/WebServiceConfig.java
@@ -0,0 +1,55 @@
+/**
+ * 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 sample.ws;
+
+import javax.xml.ws.Endpoint;
+
+import com.arjuna.webservices11.wsat.sei.ParticipantPortTypeImpl;
+import org.apache.cxf.Bus;
+import org.apache.cxf.jaxws.EndpointImpl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import sample.ws.service.FirstServiceATImpl;
+
+@Configuration
+public class WebServiceConfig {
+
+    @Autowired
+    private Bus bus;
+
+    @Autowired
+    private FirstServiceATImpl impl;
+
+    @Bean
+    public Endpoint endpoint() {
+        EndpointImpl endpoint = new EndpointImpl(bus, impl);
+        endpoint.publish("/Service/FirstServiceAT");
+        return endpoint;
+    }
+
+    @Bean
+    public Endpoint participant() {
+        EndpointImpl endpoint = new EndpointImpl(bus, new ParticipantPortTypeImpl());
+        endpoint.publish("/ws-t11-participant/ParticipantService");
+        return endpoint;
+    }
+
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/XTSConfig.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/XTSConfig.java
new file mode 100644
index 0000000..7bde8b8
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/XTSConfig.java
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws;
+
+import org.jboss.jbossts.XTSService;
+import org.jboss.jbossts.txbridge.inbound.InboundBridgeRecoveryManager;
+import org.jboss.jbossts.xts.environment.WSCEnvironmentBean;
+import org.jboss.jbossts.xts.environment.XTSEnvironmentBean;
+import org.jboss.jbossts.xts.environment.XTSPropertyManager;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+@Configuration
+public class XTSConfig {
+    @Value( "${server.port}" )
+    private int port;
+
+    @Bean(name = "xtsService", initMethod = "start", destroyMethod = "stop")
+    public XTSService xtsService() {
+        WSCEnvironmentBean wscEnvironmentBean = XTSPropertyManager.getWSCEnvironmentBean();
+        wscEnvironmentBean.setBindPort11(port);
+
+        XTSService service = new XTSService();
+        return service;
+    }
+
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    @DependsOn({"xtsService"})
+    public InboundBridgeRecoveryManager inboundBridgeRecoveryManager() {
+        return new InboundBridgeRecoveryManager();
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounter.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounter.java
new file mode 100644
index 0000000..a1b8c97
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounter.java
@@ -0,0 +1,65 @@
+/**
+ * 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 sample.ws.service;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+@Entity
+@Table(name = "t_counter")
+public class FirstCounter implements Serializable {
+
+    private int id;
+    private int counter;
+
+    public FirstCounter() {
+    }
+
+    public FirstCounter(int id, int initialCounterValue) {
+        this.id = id;
+        this.counter = initialCounterValue;
+    }
+
+    @Id
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getCounter() {
+        return counter;
+    }
+
+    public void setCounter(int counter) {
+        this.counter = counter;
+    }
+
+    public void incrementCounter(int howMany) {
+        setCounter(getCounter() + howMany);
+    }
+}
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounterRepository.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounterRepository.java
new file mode 100644
index 0000000..24deea4
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstCounterRepository.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+public interface FirstCounterRepository extends CrudRepository<FirstCounter, Integer> {
+
+}
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceAT.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceAT.java
new file mode 100644
index 0000000..74e66ec
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceAT.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample.ws.service;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@WebService(name = "FirstServiceAT", targetNamespace = "http://service.ws.sample/")
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface FirstServiceAT {
+
+    /**
+     * Create a new booking
+     */
+    @WebMethod
+    public void incrementCounter(int numSeats);
+
+    /**
+     * obtain the number of existing bookings
+     *
+     * @return the number of current bookings
+     */
+    @WebMethod
+    public int getCounter();
+
+    /**
+     * Reset the booking count to zero
+     */
+    @WebMethod
+    public void resetCounter();
+
+}
+
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceATImpl.java b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceATImpl.java
new file mode 100644
index 0000000..7de1bd8
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/java/sample/ws/service/FirstServiceATImpl.java
@@ -0,0 +1,88 @@
+/**
+ * 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 sample.ws.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import javax.transaction.Transactional;
+import java.util.Optional;
+import java.util.logging.Logger;
+
+@Service
+@WebService(serviceName = "FirstServiceATService", portName = "FirstServiceAT", name = "FirstServiceAT", targetNamespace = "http://service.ws.sample")
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+@HandlerChain(file = "/wstx_handlers.xml")
+@Transactional(Transactional.TxType.MANDATORY) // default is REQUIRED
+public class FirstServiceATImpl implements FirstServiceAT {
+
+    private static final Integer ENTITY_ID = 1;
+
+    private static final Logger LOG = Logger.getLogger(FirstServiceATImpl.class.getName());
+
+    @Autowired
+    private FirstCounterRepository service;
+
+    /**
+     * Incriment the first counter. This is done by updating the counter within a JTA transaction. The JTA transaction
+     * was automatically bridged from the WS-AT transaction.
+     */
+    @WebMethod
+    public void incrementCounter(int num) {
+
+        LOG.info("[SERVICE] First service invoked to increment the counter by '" + num + "'");
+
+        // invoke the backend business logic:
+        LOG.info("[SERVICE] Using the JPA Entity Manager to update the counter within a JTA transaction");
+
+        FirstCounter counter = lookupCounterEntity();
+        counter.incrementCounter(num);
+        service.save(counter);
+    }
+
+    @WebMethod
+    public int getCounter() {
+        LOG.info("[SERVICE] getCounter() invoked");
+        FirstCounter counter = lookupCounterEntity();
+
+        return counter.getCounter();
+    }
+
+    @WebMethod
+    public void resetCounter() {
+        FirstCounter counter = lookupCounterEntity();
+        counter.setCounter(0);
+        service.save(counter);
+    }
+
+    private FirstCounter lookupCounterEntity() {
+        Optional<FirstCounter> counter = service.findById(ENTITY_ID);
+        if (counter.isPresent()) {
+            return counter.get();
+        } else {
+            FirstCounter first = new FirstCounter(ENTITY_ID, 0);
+            service.save(first);
+            return first;
+        }
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/application.properties b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/application.properties
new file mode 100644
index 0000000..921cc2f
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/application.properties
@@ -0,0 +1,12 @@
+server.port=8081
+
+spring.datasource.url=jdbc:h2:file:./target/first
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.open-in-view=true
+spring.data.jpa.repositories.bootstrap-mode=default
+
+narayana.log-dir=./target/narayana/
+
+cxf.path=/
+
+logging.level.org.hibernate.SQL=debug
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/wstx_handlers.xml b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/wstx_handlers.xml
new file mode 100644
index 0000000..2f565dd
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_first/src/main/resources/wstx_handlers.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
+    <handler-chain>
+        <handler>
+            <handler-name>BridgeHandler</handler-name>
+            <handler-class>org.jboss.jbossts.txbridge.inbound.OptionalJaxWSTxInboundBridgeHandler</handler-class>
+        </handler>
+        <handler>
+            <handler-name>WSTXHandler</handler-name>
+            <handler-class>com.arjuna.mw.wst11.service.JaxWSHeaderContextProcessor</handler-class>
+        </handler>
+        <handler>
+            <handler-name>SubordinateHandler</handler-name>
+            <handler-class>com.arjuna.mw.wst11.service.JaxWSSubordinateHeaderContextProcessor</handler-class>
+        </handler>
+    </handler-chain>
+</handler-chains>
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/pom.xml b/distribution/src/main/release/samples/ws_transaction/ws_second/pom.xml
new file mode 100644
index 0000000..f6b4df1
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.cxf.samples</groupId>
+        <artifactId>ws_transaction</artifactId>
+        <version>3.3.3-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>spring-boot-sample-ws-cxf-second-service</artifactId>
+    <name>Spring Boot CXF Second Web Services</name>
+    <description>Spring Boot CXF Second Web Services</description>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+		<version>${spring.boot.version}</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+		<version>3.1</version>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/SampleWsApplication.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/SampleWsApplication.java
new file mode 100644
index 0000000..1abe821
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/SampleWsApplication.java
@@ -0,0 +1,30 @@
+/**
+ * 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 sample.ws;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+//CHECKSTYLE:OFF
+@SpringBootApplication
+public class SampleWsApplication {
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(SampleWsApplication.class, args);
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/WebServiceConfig.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/WebServiceConfig.java
new file mode 100644
index 0000000..4f7be18
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/WebServiceConfig.java
@@ -0,0 +1,54 @@
+/**
+ * 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 sample.ws;
+
+import javax.xml.ws.Endpoint;
+
+import com.arjuna.webservices11.wsat.sei.ParticipantPortTypeImpl;
+import org.apache.cxf.Bus;
+import org.apache.cxf.jaxws.EndpointImpl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import sample.ws.service.SecondServiceATImpl;
+
+@Configuration
+public class WebServiceConfig {
+
+    @Autowired
+    private Bus bus;
+
+    @Autowired
+    private SecondServiceATImpl impl;
+
+    @Bean
+    public Endpoint endpoint() {
+        EndpointImpl endpoint = new EndpointImpl(bus, impl);
+        endpoint.publish("/Service/SecondServiceAT");
+        return endpoint;
+    }
+
+    @Bean
+    public Endpoint participant() {
+        EndpointImpl endpoint = new EndpointImpl(bus, new ParticipantPortTypeImpl());
+        endpoint.publish("/ws-t11-participant/ParticipantService");
+        return endpoint;
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/XTSConfig.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/XTSConfig.java
new file mode 100644
index 0000000..abd6078
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/XTSConfig.java
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws;
+
+import org.jboss.jbossts.XTSService;
+import org.jboss.jbossts.txbridge.inbound.InboundBridgeRecoveryManager;
+import org.jboss.jbossts.xts.environment.WSCEnvironmentBean;
+import org.jboss.jbossts.xts.environment.XTSEnvironmentBean;
+import org.jboss.jbossts.xts.environment.XTSPropertyManager;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+@Configuration
+public class XTSConfig {
+    @Value( "${server.port}" )
+    private int port;
+
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    public XTSService xtsService() {
+        WSCEnvironmentBean wscEnvironmentBean = XTSPropertyManager.getWSCEnvironmentBean();
+        wscEnvironmentBean.setBindPort11(port);
+
+        XTSService service = new XTSService();
+        return service;
+    }
+
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    @DependsOn({"xtsService"})
+    public InboundBridgeRecoveryManager inboundBridgeRecoveryManager() {
+        return new InboundBridgeRecoveryManager();
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounter.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounter.java
new file mode 100644
index 0000000..3f0ad31
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounter.java
@@ -0,0 +1,65 @@
+/**
+ * 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 sample.ws.service;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+@Entity
+@Table(name = "t_counter")
+public class SecondCounter implements Serializable {
+
+    private int id;
+    private int counter;
+
+    public SecondCounter() {
+    }
+
+    public SecondCounter(int id, int initialCounterValue) {
+        this.id = id;
+        this.counter = initialCounterValue;
+    }
+
+    @Id
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getCounter() {
+        return counter;
+    }
+
+    public void setCounter(int counter) {
+        this.counter = counter;
+    }
+
+    public void incrementCounter(int howMany) {
+        setCounter(getCounter() + howMany);
+    }
+}
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounterRepository.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounterRepository.java
new file mode 100644
index 0000000..cd0c5ad
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondCounterRepository.java
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2019, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package sample.ws.service;
+
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * @author <a href="mailto:zfeng@redhat.com">Zheng Feng</a>
+ */
+public interface SecondCounterRepository extends CrudRepository<SecondCounter, Integer> {
+
+}
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceAT.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceAT.java
new file mode 100644
index 0000000..e81e5e6
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceAT.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample.ws.service;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@WebService(name = "SecondServiceAT", targetNamespace = "http://service.ws.sample/")
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface SecondServiceAT {
+
+    /**
+     * Create a new booking
+     */
+    @WebMethod
+    public void incrementCounter(int numSeats);
+
+    /**
+     * obtain the number of existing bookings
+     *
+     * @return the number of current bookings
+     */
+    @WebMethod
+    public int getCounter();
+
+    /**
+     * Reset the booking count to zero
+     */
+    @WebMethod
+    public void resetCounter();
+
+}
+
+
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceATImpl.java b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceATImpl.java
new file mode 100644
index 0000000..8a2a275
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/java/sample/ws/service/SecondServiceATImpl.java
@@ -0,0 +1,88 @@
+/**
+ * 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 sample.ws.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.jws.HandlerChain;
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import javax.transaction.Transactional;
+import java.util.Optional;
+import java.util.logging.Logger;
+
+@Service
+@WebService(serviceName = "SecondServiceATService", portName = "SecondServiceAT", name = "SecondServiceAT", targetNamespace = "http://service.ws.sample")
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+@HandlerChain(file = "/wstx_handlers.xml")
+@Transactional(Transactional.TxType.MANDATORY) // default is REQUIRED
+public class SecondServiceATImpl implements SecondServiceAT {
+
+    private static final Integer ENTITY_ID = 1;
+
+    private static final Logger LOG = Logger.getLogger(SecondServiceATImpl.class.getName());
+
+    @Autowired
+    private SecondCounterRepository service;
+
+    /**
+     * Incriment the first counter. This is done by updating the counter within a JTA transaction. The JTA transaction
+     * was automatically bridged from the WS-AT transaction.
+     */
+    @WebMethod
+    public void incrementCounter(int num) {
+
+        LOG.info("[SERVICE] Second service invoked to increment the counter by '" + num + "'");
+
+        // invoke the backend business logic:
+        LOG.info("[SERVICE] Using the JPA Entity Manager to update the counter within a JTA transaction");
+
+        SecondCounter counter = lookupCounterEntity();
+        counter.incrementCounter(num);
+        service.save(counter);
+    }
+
+    @WebMethod
+    public int getCounter() {
+        LOG.info("[SERVICE] getCounter() invoked");
+        SecondCounter counter = lookupCounterEntity();
+
+        return counter.getCounter();
+    }
+
+    @WebMethod
+    public void resetCounter() {
+        SecondCounter counter = lookupCounterEntity();
+        counter.setCounter(0);
+        service.save(counter);
+    }
+
+    private SecondCounter lookupCounterEntity() {
+        Optional<SecondCounter> counter = service.findById(ENTITY_ID);
+        if (counter.isPresent()) {
+            return counter.get();
+        } else {
+            SecondCounter second = new SecondCounter(ENTITY_ID, 0);
+            service.save(second);
+            return second;
+        }
+    }
+}
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/application.properties b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/application.properties
new file mode 100644
index 0000000..167cee8
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/application.properties
@@ -0,0 +1,12 @@
+server.port=8082
+
+spring.datasource.url=jdbc:h2:file:./target/second
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.open-in-view=true
+spring.data.jpa.repositories.bootstrap-mode=default
+
+narayana.log-dir=./target/narayana/
+
+cxf.path=/
+
+logging.level.org.hibernate.SQL=debug
diff --git a/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/wstx_handlers.xml b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/wstx_handlers.xml
new file mode 100644
index 0000000..2f565dd
--- /dev/null
+++ b/distribution/src/main/release/samples/ws_transaction/ws_second/src/main/resources/wstx_handlers.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
+    <handler-chain>
+        <handler>
+            <handler-name>BridgeHandler</handler-name>
+            <handler-class>org.jboss.jbossts.txbridge.inbound.OptionalJaxWSTxInboundBridgeHandler</handler-class>
+        </handler>
+        <handler>
+            <handler-name>WSTXHandler</handler-name>
+            <handler-class>com.arjuna.mw.wst11.service.JaxWSHeaderContextProcessor</handler-class>
+        </handler>
+        <handler>
+            <handler-name>SubordinateHandler</handler-name>
+            <handler-class>com.arjuna.mw.wst11.service.JaxWSSubordinateHeaderContextProcessor</handler-class>
+        </handler>
+    </handler-chain>
+</handler-chains>
