diff --git a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridge.java b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridge.java
index fc48b4b00..50a21c81a 100644
--- a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridge.java
+++ b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridge.java
@@ -63,6 +63,10 @@ public class InboundBridge
         getTransaction(); // ensures transaction is initialized
     }
 
+    public Xid getXid() {
+        return xid;
+    }
+
     /**
      * Associate the JTA transaction to the current Thread.
      * Typically used by a server side inbound handler.
diff --git a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeManager.java b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeManager.java
index f7e549e0f..b8d227ee5 100644
--- a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeManager.java
+++ b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeManager.java
@@ -36,6 +36,8 @@ import com.arjuna.wsc.AlreadyRegisteredException;
 import javax.transaction.xa.Xid;
 import javax.transaction.xa.XAException;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -55,6 +57,8 @@ public class InboundBridgeManager
     // maps WS-AT Tx Id to InboundBridge instance.
     private static final ConcurrentMap<String, InboundBridge> inboundBridgeMappings = new ConcurrentHashMap<String, org.jboss.jbossts.txbridge.inbound.InboundBridge>();
 
+    private static final Set<Xid> liveXids = new HashSet<>();
+
     /**
      * Return an InboundBridge instance that maps the current Thread's WS transaction context
      * to a JTA context. Control of the latter is provided by the returned instance.
@@ -105,10 +109,17 @@ public class InboundBridgeManager
         txbridgeLogger.logger.trace("InboundBridgeManager.removeMapping(externalTxId="+externalTxId+")");
 
         if(externalTxId != null) {
-            inboundBridgeMappings.remove(externalTxId);
+            InboundBridge inboundBridge = inboundBridgeMappings.remove(externalTxId);
+            if(inboundBridge != null) {
+                liveXids.remove(inboundBridge.getXid());
+            }
         }
     }
 
+    public static synchronized boolean isLive(Xid xid) {
+        return liveXids.contains(xid);
+    }
+
     /**
      * Create the JTA transaction mapping and support objects for a given WS transaction context.
      *
@@ -135,6 +146,7 @@ public class InboundBridgeManager
         Xid xid = XATxConverter.getXid(new Uid(), false, BridgeDurableParticipant.XARESOURCE_FORMAT_ID);
 
         BridgeDurableParticipant bridgeDurableParticipant = new BridgeDurableParticipant(externalTxId, xid);
+
         // construct the participantId in such as way as we can recognise it at recovery time:
         String participantId = org.jboss.jbossts.txbridge.inbound.BridgeDurableParticipant.TYPE_IDENTIFIER+new Uid().toString();
         transactionManager.enlistForDurableTwoPhase(bridgeDurableParticipant, participantId);
@@ -142,6 +154,8 @@ public class InboundBridgeManager
         BridgeVolatileParticipant bridgeVolatileParticipant = new BridgeVolatileParticipant(externalTxId, xid);
         transactionManager.enlistForVolatileTwoPhase(bridgeVolatileParticipant, new Uid().toString());
 
-        inboundBridgeMappings.put(externalTxId, new InboundBridge(xid));
+        InboundBridge inboundBridge = new InboundBridge(xid);
+        inboundBridgeMappings.put(externalTxId, inboundBridge);
+        liveXids.add(inboundBridge.getXid());
     }
 }
diff --git a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeRecoveryManager.java b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeRecoveryManager.java
index 1ee04f697..653e12e87 100644
--- a/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeRecoveryManager.java
+++ b/txbridge/src/main/java/org/jboss/jbossts/txbridge/inbound/InboundBridgeRecoveryManager.java
@@ -277,11 +277,18 @@ public class InboundBridgeRecoveryManager implements XTSATRecoveryModule, Recove
         txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+")");
 
         if(xid.getFormatId() != BridgeDurableParticipant.XARESOURCE_FORMAT_ID) {
+            txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+") - not ours. Abstaining.");
             return Vote.ABSTAIN; // it's not one of ours, ignore it.
         }
 
         if(!orphanedXAResourcesAreIdentifiable) {
             // recovery system not in stable state yet - we don't yet know if it's orphaned or not.
+            txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+") - recovery incomplete. Leave alone.");
+            return Vote.LEAVE_ALONE;
+        }
+
+        if( InboundBridgeManager.isLive(xid) ) {
+            txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+") - still live. Leave alone.");
             return Vote.LEAVE_ALONE;
         }
 
@@ -289,11 +296,14 @@ public class InboundBridgeRecoveryManager implements XTSATRecoveryModule, Recove
         synchronized(participantsAwaitingRecovery) {
             for(BridgeDurableParticipant participant : participantsAwaitingRecovery) {
                 if(participant.getXid().equals(xid)) {
+                    txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+") - awaiting recovery. Leave alone.");
                     return Vote.LEAVE_ALONE;
                 }
             }
         }
 
+        txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.checkXid("+xid+") - passed to rollback.");
+
         // presumed abort:
         return Vote.ROLLBACK;
     }
