[409549] Wrong branch manager is used in
SynchronizableRepository.handleCommitInfo() 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=409549
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/branch/CDOBranchManagerImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/branch/CDOBranchManagerImpl.java
index 2472a2d..537017b 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/branch/CDOBranchManagerImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/branch/CDOBranchManagerImpl.java
@@ -27,6 +27,7 @@
 import org.eclipse.net4j.util.ref.ReferenceValueMap;
 import org.eclipse.net4j.util.ref.ReferenceValueMap.Soft;
 
+import java.text.MessageFormat;
 import java.util.Map;
 
 /**
@@ -209,7 +210,7 @@
   @Override
   public String toString()
   {
-    return "BranchManager";
+    return MessageFormat.format("BranchManager[loader={0}]", branchLoader);
   }
 
   /**
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
index 316af6f..9fe6667 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
@@ -13,6 +13,7 @@
 package org.eclipse.emf.cdo.internal.common.revision;
 
 import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
 import org.eclipse.emf.cdo.common.id.CDOID;
 import org.eclipse.emf.cdo.common.revision.CDORevision;
 import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
@@ -39,6 +40,8 @@
 
   private static boolean disableGC;
 
+  private CDOBranchManager branchManager;
+
   private String name;
 
   public AbstractCDORevisionCache()
@@ -46,6 +49,34 @@
     setDaemon(true);
   }
 
+  public CDOBranchManager getBranchManager()
+  {
+    return branchManager;
+  }
+
+  public void setBranchManager(CDOBranchManager branchManager)
+  {
+    this.branchManager = branchManager;
+  }
+
+  protected final void checkBranch(CDOBranch branch)
+  {
+    if (branchManager != null)
+    {
+      CDOBranchManager actualBranchManager = branch.getBranchManager();
+      if (actualBranchManager != branchManager)
+      {
+        throw new IllegalArgumentException("Wrong branch manager: " + actualBranchManager + "; expected: "
+            + branchManager);
+      }
+    }
+  }
+
+  public String getName()
+  {
+    return name;
+  }
+
   public void setName(String name)
   {
     this.name = name;
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
index d38cf9b..703fc52 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
@@ -75,6 +75,8 @@
 
   public InternalCDORevision getRevision(CDOID id, CDOBranchPoint branchPoint)
   {
+    checkBranch(branchPoint.getBranch());
+
     RevisionList revisionList = getRevisionList(id, branchPoint.getBranch());
     if (revisionList != null)
     {
@@ -86,7 +88,10 @@
 
   public InternalCDORevision getRevisionByVersion(CDOID id, CDOBranchVersion branchVersion)
   {
-    RevisionList revisionList = getRevisionList(id, branchVersion.getBranch());
+    CDOBranch branch = branchVersion.getBranch();
+    checkBranch(branch);
+
+    RevisionList revisionList = getRevisionList(id, branch);
     if (revisionList != null)
     {
       return revisionList.getRevisionByVersion(branchVersion.getVersion());
@@ -129,8 +134,10 @@
 
   public List<CDORevision> getRevisions(CDOBranchPoint branchPoint)
   {
-    List<CDORevision> result = new ArrayList<CDORevision>();
     CDOBranch branch = branchPoint.getBranch();
+    checkBranch(branch);
+
+    List<CDORevision> result = new ArrayList<CDORevision>();
     synchronized (revisionLists)
     {
       for (Map.Entry<Object, RevisionList> entry : revisionLists.entrySet())
@@ -155,8 +162,11 @@
   {
     CheckUtil.checkArg(revision, "revision");
 
+    CDOBranch branch = revision.getBranch();
+    checkBranch(branch);
+
     CDOID id = revision.getID();
-    Object key = createKey(id, revision.getBranch());
+    Object key = createKey(id, branch);
 
     synchronized (revisionLists)
     {
@@ -174,7 +184,10 @@
 
   public InternalCDORevision removeRevision(CDOID id, CDOBranchVersion branchVersion)
   {
-    Object key = createKey(id, branchVersion.getBranch());
+    CDOBranch branch = branchVersion.getBranch();
+    checkBranch(branch);
+
+    Object key = createKey(id, branch);
     synchronized (revisionLists)
     {
       RevisionList list = revisionLists.get(key);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
index 33bcee9..055bca4 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
@@ -67,6 +67,8 @@
 
   public InternalCDORevision getRevision(CDOID id, CDOBranchPoint branchPoint)
   {
+    checkBranch(branchPoint.getBranch());
+
     synchronized (revisions)
     {
       Reference<InternalCDORevision> ref = revisions.get(id);
@@ -85,6 +87,8 @@
 
   public InternalCDORevision getRevisionByVersion(CDOID id, CDOBranchVersion branchVersion)
   {
+    checkBranch(branchVersion.getBranch());
+
     synchronized (revisions)
     {
       Reference<InternalCDORevision> ref = revisions.get(id);
@@ -145,7 +149,9 @@
 
   public List<CDORevision> getRevisions(CDOBranchPoint branchPoint)
   {
+    checkBranch(branchPoint.getBranch());
     List<CDORevision> result = new ArrayList<CDORevision>();
+
     synchronized (revisions)
     {
       for (Reference<InternalCDORevision> ref : revisions.values())
@@ -164,6 +170,8 @@
   public void addRevision(CDORevision revision)
   {
     CheckUtil.checkArg(revision, "revision");
+    checkBranch(revision.getBranch());
+
     if (!revision.isHistorical())
     {
       Reference<InternalCDORevision> reference = createReference(revision);
@@ -176,6 +184,7 @@
 
   public InternalCDORevision removeRevision(CDOID id, CDOBranchVersion branchVersion)
   {
+    checkBranch(branchVersion.getBranch());
     synchronized (revisions)
     {
       Reference<InternalCDORevision> ref = revisions.get(id);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOCommitInfoUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOCommitInfoUtil.java
index 9b82471..f2d4d3e 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOCommitInfoUtil.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOCommitInfoUtil.java
@@ -12,12 +12,15 @@
 
 import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
 import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
+import org.eclipse.emf.cdo.common.commit.CDOCommitData;
 import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
 import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
 import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
 import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
 import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta;
 import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
+import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
 import org.eclipse.emf.cdo.internal.common.commit.CDOCommitInfoManagerImpl;
 import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
 
@@ -55,6 +58,15 @@
   /**
    * @since 4.2
    */
+  public static CDOCommitData createCommitData(List<CDOPackageUnit> newPackageUnits, List<CDOIDAndVersion> newObjects,
+      List<CDORevisionKey> changedObjects, List<CDOIDAndVersion> detachedObjects)
+  {
+    return new CDOCommitDataImpl(newPackageUnits, newObjects, changedObjects, detachedObjects);
+  }
+
+  /**
+   * @since 4.2
+   */
   public static long encodeCount(int count)
   {
     long timeStamp = count;
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java
index 510c43c..e433098 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java
@@ -52,7 +52,6 @@
 import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
 import org.eclipse.emf.cdo.internal.common.bundle.OM;
 import org.eclipse.emf.cdo.internal.common.commit.CDOChangeSetDataImpl;
-import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
 import org.eclipse.emf.cdo.internal.common.commit.FailureCommitInfo;
 import org.eclipse.emf.cdo.internal.common.lock.CDOLockAreaImpl;
 import org.eclipse.emf.cdo.internal.common.lock.CDOLockChangeInfoImpl;
@@ -70,6 +69,7 @@
 import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl;
 import org.eclipse.emf.cdo.internal.common.revision.delta.CDOSetFeatureDeltaImpl;
 import org.eclipse.emf.cdo.internal.common.revision.delta.CDOUnsetFeatureDeltaImpl;
+import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
 import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
 import org.eclipse.emf.cdo.spi.common.lock.InternalCDOLockState;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
@@ -262,7 +262,7 @@
     }
 
     CDOChangeSetData data = readCDOChangeSetData();
-    return new CDOCommitDataImpl(newPackageUnits, data.getNewObjects(), data.getChangedObjects(),
+    return CDOCommitInfoUtil.createCommitData(newPackageUnits, data.getNewObjects(), data.getChangedObjects(),
         data.getDetachedObjects());
   }
 
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
index aee4c9e..59e5035 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionImpl.java
@@ -23,6 +23,7 @@
 import org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol;
 import org.eclipse.emf.cdo.internal.net4j.protocol.CommitTransactionRequest;
 import org.eclipse.emf.cdo.net4j.CDONet4jSession;
+import org.eclipse.emf.cdo.session.CDORepositoryInfo;
 import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
 import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
 import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
@@ -142,6 +143,8 @@
     }
 
     super.doActivate();
+    CDORepositoryInfo repository = getRepositoryInfo();
+    CDOSessionProtocol sessionProtocol = getSessionProtocol();
 
     InternalCDORevisionManager revisionManager = getRevisionManager();
     if (revisionManager == null)
@@ -150,11 +153,14 @@
       setRevisionManager(revisionManager);
     }
 
-    revisionManager.setSupportingAudits(getRepositoryInfo().isSupportingAudits());
-    revisionManager.setSupportingBranches(getRepositoryInfo().isSupportingBranches());
-    revisionManager.setRevisionLoader(getSessionProtocol());
-    revisionManager.setRevisionLocker(this);
-    revisionManager.activate();
+    if (!revisionManager.isActive())
+    {
+      revisionManager.setSupportingAudits(repository.isSupportingAudits());
+      revisionManager.setSupportingBranches(repository.isSupportingBranches());
+      revisionManager.setRevisionLoader(sessionProtocol);
+      revisionManager.setRevisionLocker(this);
+      revisionManager.activate();
+    }
 
     InternalCDOBranchManager branchManager = getBranchManager();
     if (branchManager == null)
@@ -163,10 +169,13 @@
       setBranchManager(branchManager);
     }
 
-    branchManager.setRepository(getRepositoryInfo());
-    branchManager.setBranchLoader(getSessionProtocol());
-    branchManager.initMainBranch(isMainBranchLocal(), getRepositoryInfo().getCreationTime());
-    branchManager.activate();
+    if (!branchManager.isActive())
+    {
+      branchManager.setRepository(repository);
+      branchManager.setBranchLoader(sessionProtocol);
+      branchManager.initMainBranch(isMainBranchLocal(), repository.getCreationTime());
+      branchManager.activate();
+    }
 
     InternalCDOCommitInfoManager commitInfoManager = getCommitInfoManager();
     if (commitInfoManager == null)
@@ -175,16 +184,19 @@
       setCommitInfoManager(commitInfoManager);
     }
 
-    commitInfoManager.setRepository(getRepositoryInfo());
-    commitInfoManager.setCommitInfoLoader(getSessionProtocol());
-    commitInfoManager.activate();
+    if (!commitInfoManager.isActive())
+    {
+      commitInfoManager.setRepository(repository);
+      commitInfoManager.setCommitInfoLoader(sessionProtocol);
+      commitInfoManager.activate();
+    }
 
     for (InternalCDOPackageUnit packageUnit : result.getPackageUnits())
     {
       getPackageRegistry().putPackageUnit(packageUnit);
     }
 
-    getRepositoryInfo().getTimeStamp(true);
+    repository.getTimeStamp(true);
   }
 
   private CDOClientProtocol createProtocol()
@@ -206,15 +218,15 @@
    */
   private CDOClientProtocol getClientProtocol()
   {
-    CDOSessionProtocol protocol = getSessionProtocol();
+    CDOSessionProtocol sessionProtocol = getSessionProtocol();
     CDOClientProtocol clientProtocol;
-    if (protocol instanceof DelegatingSessionProtocol)
+    if (sessionProtocol instanceof DelegatingSessionProtocol)
     {
-      clientProtocol = (CDOClientProtocol)((DelegatingSessionProtocol)protocol).getDelegate();
+      clientProtocol = (CDOClientProtocol)((DelegatingSessionProtocol)sessionProtocol).getDelegate();
     }
     else
     {
-      clientProtocol = (CDOClientProtocol)protocol;
+      clientProtocol = (CDOClientProtocol)sessionProtocol;
     }
 
     return clientProtocol;
@@ -258,11 +270,27 @@
   @Override
   protected void doDeactivate() throws Exception
   {
+    CDOSessionProtocol sessionProtocol = getSessionProtocol();
     super.doDeactivate();
 
-    getCommitInfoManager().deactivate();
-    getRevisionManager().deactivate();
-    getBranchManager().deactivate();
+    InternalCDOCommitInfoManager commitInfoManager = getCommitInfoManager();
+    if (commitInfoManager.getCommitInfoLoader() == sessionProtocol)
+    {
+      commitInfoManager.deactivate();
+    }
+
+    InternalCDORevisionManager revisionManager = getRevisionManager();
+    if (revisionManager.getRevisionLoader() == sessionProtocol)
+    {
+      revisionManager.deactivate();
+    }
+
+    InternalCDOBranchManager branchManager = getBranchManager();
+    if (branchManager.getBranchLoader() == sessionProtocol)
+    {
+      branchManager.deactivate();
+    }
+
     getPackageRegistry().deactivate();
   }
 
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
index ac21fd8..4663bf0 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
@@ -41,7 +41,6 @@
 import org.eclipse.emf.cdo.common.security.NoPermissionException;
 import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
 import org.eclipse.emf.cdo.common.util.CDOQueryInfo;
-import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
 import org.eclipse.emf.cdo.internal.common.commit.FailureCommitInfo;
 import org.eclipse.emf.cdo.internal.common.model.CDOPackageRegistryImpl;
 import org.eclipse.emf.cdo.internal.server.bundle.OM;
@@ -50,6 +49,7 @@
 import org.eclipse.emf.cdo.server.IStoreAccessor.QueryXRefsContext;
 import org.eclipse.emf.cdo.server.IView;
 import org.eclipse.emf.cdo.server.StoreThreadLocal;
+import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
 import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
@@ -793,8 +793,8 @@
       }
     };
 
-    return new CDOCommitDataImpl(newPackageUnitsCollection, newObjectsCollection, changedObjectsCollection,
-        detachedObjectsCollection);
+    return CDOCommitInfoUtil.createCommitData(newPackageUnitsCollection, newObjectsCollection,
+        changedObjectsCollection, detachedObjectsCollection);
   }
 
   protected void adjustForCommit()
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/RepositorySynchronizer.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/RepositorySynchronizer.java
index 8034f40..0abf61f 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/RepositorySynchronizer.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/RepositorySynchronizer.java
@@ -228,10 +228,7 @@
 
     if (remoteSession != null)
     {
-      remoteSession.removeListener(remoteSessionListener);
-      remoteSession.getBranchManager().removeListener(remoteSessionListener);
-      remoteSession.close();
-      remoteSession = null;
+      closeRemoteSession();
     }
 
     super.doDeactivate();
@@ -266,18 +263,21 @@
     if (remoteSession != null)
     {
       CDOSession element = remoteSession;
-
-      remoteSession.getBranchManager().removeListener(remoteSessionListener);
-      remoteSession.removeListener(remoteSessionListener);
-      remoteSession.close();
-      remoteSession = null;
-
+      closeRemoteSession();
       fireEvent(new SingleDeltaContainerEvent<CDOSession>(this, element, IContainerDelta.Kind.REMOVED));
     }
 
     reconnect();
   }
 
+  private void closeRemoteSession()
+  {
+    remoteSession.removeListener(remoteSessionListener);
+    remoteSession.getBranchManager().removeListener(remoteSessionListener);
+    remoteSession.close();
+    remoteSession = null;
+  }
+
   private void reconnect()
   {
     clearQueue();
@@ -391,6 +391,7 @@
         try
         {
           CDOSessionConfiguration masterConfiguration = remoteSessionConfigurationFactory.createSessionConfiguration();
+          masterConfiguration.setBranchManager(localRepository.getBranchManager());
           masterConfiguration.setPassiveUpdateMode(PassiveUpdateMode.ADDITIONS);
           masterConfiguration.setLockNotificationMode(LockNotificationMode.ALWAYS);
 
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
index 45015bd..df2d3a2 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java
@@ -38,7 +38,7 @@
 import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
 import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
 import org.eclipse.emf.cdo.common.util.CDOException;
-import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
+import org.eclipse.emf.cdo.internal.common.revision.AbstractCDORevisionCache;
 import org.eclipse.emf.cdo.internal.server.Repository;
 import org.eclipse.emf.cdo.internal.server.TransactionCommitContext;
 import org.eclipse.emf.cdo.server.IStoreAccessor;
@@ -48,6 +48,7 @@
 import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch;
 import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
 import org.eclipse.emf.cdo.spi.common.commit.CDOChangeKindCache;
+import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
 import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
 import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
@@ -443,7 +444,7 @@
       List<CDORevisionKey> changedObjects = changeSet.getChangedObjects();
       List<CDOIDAndVersion> detachedObjects = changeSet.getDetachedObjects();
 
-      CDOCommitData data = new CDOCommitDataImpl(newPackages, newObjects, changedObjects, detachedObjects);
+      CDOCommitData data = CDOCommitInfoUtil.createCommitData(newPackages, newObjects, changedObjects, detachedObjects);
 
       String comment = "<replicate raw commits>"; //$NON-NLS-1$
       CDOCommitInfo commitInfo = manager.createCommitInfo(branch, toCommitTime, fromCommitTime, SYSTEM_USER_ID,
@@ -518,6 +519,13 @@
   {
     super.doActivate();
 
+    InternalCDORevisionCache cache = getRevisionManager().getCache();
+    if (cache instanceof AbstractCDORevisionCache)
+    {
+      // Enable branch checks to ensure that no branches from the replicator session are used
+      ((AbstractCDORevisionCache)cache).setBranchManager(getBranchManager());
+    }
+
     InternalStore store = getStore();
     if (!store.isFirstStart())
     {
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/StoreAccessorBase.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/StoreAccessorBase.java
index 39d4c65..1689f2b 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/StoreAccessorBase.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/StoreAccessorBase.java
@@ -31,11 +31,11 @@
 import org.eclipse.emf.cdo.common.revision.delta.CDOSetFeatureDelta;
 import org.eclipse.emf.cdo.common.revision.delta.CDOUnsetFeatureDelta;
 import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
-import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
 import org.eclipse.emf.cdo.internal.server.bundle.OM;
 import org.eclipse.emf.cdo.server.ISession;
 import org.eclipse.emf.cdo.server.IStoreAccessor;
 import org.eclipse.emf.cdo.server.ITransaction;
+import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
 import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
 import org.eclipse.emf.cdo.spi.common.revision.CDOFeatureDeltaVisitorImpl;
@@ -317,7 +317,7 @@
       storeAccessor.handleRevisions(null, null, timeStamp, true, new CDORevisionHandler.Filtered.Undetached(this));
 
       List<CDOIDAndVersion> detachedObjects = detachCounter.getDetachedObjects();
-      return new CDOCommitDataImpl(newPackageUnits, newObjects, changedObjects, detachedObjects);
+      return CDOCommitInfoUtil.createCommitData(newPackageUnits, newObjects, changedObjects, detachedObjects);
     }
 
     /**
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/util/TestSessionConfiguration.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/util/TestSessionConfiguration.java
index 8f3b3d0..7a6c707 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/util/TestSessionConfiguration.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/util/TestSessionConfiguration.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
 import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
+import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
 import org.eclipse.emf.cdo.common.id.CDOIDGenerator;
 import org.eclipse.emf.cdo.session.CDOSession;
 import org.eclipse.emf.cdo.session.CDOSessionConfiguration;
@@ -125,4 +126,14 @@
   {
     throw new UnsupportedOperationException();
   }
+
+  public CDOBranchManager getBranchManager()
+  {
+    throw new UnsupportedOperationException();
+  }
+
+  public void setBranchManager(CDOBranchManager branchManager)
+  {
+    throw new UnsupportedOperationException();
+  }
 }
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionConfiguration.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionConfiguration.java
index ee7e781..f6c1c8d 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionConfiguration.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/session/CDOSessionConfiguration.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
 import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
+import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
 import org.eclipse.emf.cdo.common.id.CDOIDGenerator;
 import org.eclipse.emf.cdo.view.CDOFetchRuleManager;
 
@@ -124,6 +125,16 @@
   public void setFetchRuleManager(CDOFetchRuleManager fetchRuleManager);
 
   /**
+   * @since 4.2
+   */
+  public CDOBranchManager getBranchManager();
+
+  /**
+   * @since 4.2
+   */
+  public void setBranchManager(CDOBranchManager branchManager);
+
+  /**
    * Returns the authenticator of this configuration, never <code>null</code>.
    *
    * @deprecated As of 4.2 use {@link #getCredentialsProvider()} and {@link #setCredentialsProvider(IPasswordCredentialsProvider)}, respectively
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index 6ea7839..a08f36c 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -66,11 +66,11 @@
 import org.eclipse.emf.cdo.eresource.EresourceFactory;
 import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl;
 import org.eclipse.emf.cdo.eresource.impl.CDOResourceNodeImpl;
-import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl;
 import org.eclipse.emf.cdo.internal.common.commit.FailureCommitInfo;
 import org.eclipse.emf.cdo.internal.common.revision.CDOListWithElementProxiesImpl;
 import org.eclipse.emf.cdo.session.CDORepositoryInfo;
 import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
+import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil;
 import org.eclipse.emf.cdo.spi.common.commit.CDORevisionAvailabilityInfo;
 import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager;
 import org.eclipse.emf.cdo.spi.common.lock.InternalCDOLockState;
@@ -2738,7 +2738,7 @@
       CDOLockState[] locksOnNewObjectsArray = getLockStates(newObjects.keySet(), false);
       locksOnNewObjects = Arrays.asList(locksOnNewObjectsArray);
 
-      commitData = new CDOCommitDataImpl(newPackageUnits, revisions, deltas, detached);
+      commitData = CDOCommitInfoUtil.createCommitData(newPackageUnits, revisions, deltas, detached);
     }
 
     private <T> Map<CDOID, T> filterCommittables(Map<CDOID, T> map)