diff --git a/src/org/apache/kandula/initiator/TransactionOutHandler.java b/src/org/apache/kandula/initiator/TransactionOutHandler.java
index c7284f0..337a737 100644
--- a/src/org/apache/kandula/initiator/TransactionOutHandler.java
+++ b/src/org/apache/kandula/initiator/TransactionOutHandler.java
@@ -16,6 +16,16 @@
  */
 package org.apache.kandula.initiator;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
@@ -25,41 +35,91 @@
 import org.apache.kandula.Constants;
 import org.apache.kandula.context.AbstractContext;
 import org.apache.kandula.context.CoordinationContext;
+import org.apache.kandula.faults.AbstractKandulaException;
+import org.apache.kandula.faults.KandulaGeneralException;
+import org.oasis_open.docs.ws_tx.wscoor._2006._06.CoordinationContext_type3;
+import org.xmlsoap.schemas.ws._2004._08.addressing.ReferenceParametersType;
 
 public class TransactionOutHandler extends AbstractHandler {
-	
+
 	/**
 	 * Field log
 	 */
 	private static final Log log = LogFactory.getLog(TransactionOutHandler.class);
-	
+
 	private static ThreadLocal threadInfo = new ThreadLocal();
-	
+
 	private static final long serialVersionUID = 4133392345837905499L;
-	
+
 	public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
-		
+
 		InitiatorContext initiatorTransaction;
 		String wsaAction = msgContext.getWSAAction();
 		if ((wsaAction != Constants.WS_COOR_CREATE_COORDINATIONCONTEXT)
 				&& (wsaAction != Constants.WS_COOR_REGISTER)
 				&& (wsaAction != Constants.WS_AT_COMMIT) && (wsaAction != Constants.WS_AT_ROLLBACK)) {
-			Object context = threadInfo.get();
-			if (context==null)
-			{
-				context = msgContext.getProperty(Constants.TRANSACTION_CONTEXT);
+			Object context = null;
+			try {
+				context = TransactionManager.getTransaction();
+			} catch (AbstractKandulaException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
 			}
-			// We let the message to pass through if no transaction is found in the thread or in msgContext
+			if (context == null) {
+				context = msgContext.getProperty(Constants.Configuration.TRANSACTION_CONTEXT);
+			}
+			// We let the message to pass through if no transaction is found in
+			// the thread or in msgContext
 			if (context != null) {
+				Object registrationID = msgContext
+						.getProperty(Constants.Configuration.PARTICIPANT_IDENTIFIER);
 				AbstractContext txContext = (AbstractContext) context;
 				SOAPHeader soapHeader = msgContext.getEnvelope().getHeader();
 				CoordinationContext coorContext = txContext.getCoordinationContext();
-				soapHeader.addChild(coorContext.toOM());
+	
+				//ws-ba users can set a identifier for the participants
+				if (registrationID != null) {
+					CoordinationContext_type3 context_type32 = null;
+					ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+					try {
+						coorContext.toOM().serialize(byteArrayOutputStream);
+						context_type32 = CoordinationContext_type3.Factory.parse(StAXUtils
+								.createXMLStreamReader(new ByteArrayInputStream(
+										byteArrayOutputStream.toByteArray())));
+						context_type32.setExtraAttributes(null);
+					} catch (Exception e) {
+						throw new AxisFault(e);
+					}
+					ReferenceParametersType referenceParametersType = context_type32
+							.getRegistrationService().getReferenceParameters();
+					OMElement omElement = soapHeader.getOMFactory().createOMElement(
+							Constants.PARTICIPANT_ID_PARAMETER, null);
+					omElement.setText((String) registrationID);
+					referenceParametersType.addExtraElement(omElement);
+					soapHeader.addChild(context_type32.getOMElement(new QName(Constants.WS_COOR,
+							"CoordinationContext"), soapHeader.getOMFactory()));
+				} else {
+					soapHeader.addChild(coorContext.toOM());
+				}
+
 			} else {
-				log.debug("Transaction Handler Engaged. " +
-						"But no transaction information was found in the thread.");
+				log.debug("Transaction Handler Engaged. "
+						+ "But no transaction information was found in the thread.");
 			}
 		}
 		return InvocationResponse.CONTINUE;
 	}
+
+	private static void addParticipantIdentifier(OMElement coorContext, String participantID) {
+		// Opps.. OMSourcedElementImpl.build() is broken
+		coorContext.getFirstOMChild();
+		OMElement registrationEPRElement = coorContext.getFirstChildWithName(new QName(
+				"RegistrationService", Constants.WS_COOR));
+		OMElement refParameters = registrationEPRElement.getFirstChildWithName(new QName(
+				"ReferenceParameters", "http://schemas.xmlsoap.org/ws/2004/08/addressing"));
+		OMElement omElement = registrationEPRElement.getOMFactory().createOMElement(
+				Constants.PARTICIPANT_ID_PARAMETER, null);
+		omElement.setText(participantID);
+		refParameters.addChild(omElement);
+	}
 }
