[573658] ReconnectionSession mechanism does not update some items after a reconnection

https://bugs.eclipse.org/bugs/show_bug.cgi?id=573658
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml
index 12a9dd7..0ddf6a8 100644
--- a/features/org.eclipse.emf.cdo-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo-feature/feature.xml
@@ -13,7 +13,7 @@
 <feature
       id="org.eclipse.emf.cdo"
       label="%featureName"
-      version="4.14.2.qualifier"
+      version="4.15.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo-feature/pom.xml b/features/org.eclipse.emf.cdo-feature/pom.xml
index d0ce231..d89efe9 100644
--- a/features/org.eclipse.emf.cdo-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo</artifactId>
-  <version>4.14.2-SNAPSHOT</version>
+  <version>4.15.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
index 4a8122e..b7fb92e 100644
--- a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.sdk"
       label="%featureName"
-      version="5.7.2.qualifier"
+      version="5.8.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.sdk-feature/pom.xml b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
index e8d008b..23fa30c 100644
--- a/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.sdk-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.sdk</artifactId>
-  <version>5.7.2-SNAPSHOT</version>
+  <version>5.8.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.server-feature/feature.xml b/features/org.eclipse.emf.cdo.server-feature/feature.xml
index bfc36b9..cf0b6c7 100644
--- a/features/org.eclipse.emf.cdo.server-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server"
       label="%featureName"
-      version="4.14.2.qualifier"
+      version="4.15.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.server-feature/pom.xml b/features/org.eclipse.emf.cdo.server-feature/pom.xml
index 581c725..a6a36e8 100644
--- a/features/org.eclipse.emf.cdo.server-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.server-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.server</artifactId>
-  <version>4.14.2-SNAPSHOT</version>
+  <version>4.15.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
index 5d838b7..5f40da1 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server.embedded"
       label="%featureName"
-      version="4.14.2.qualifier"
+      version="4.15.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
index 5921197..c80a2de 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.server.embedded</artifactId>
-  <version>4.14.2-SNAPSHOT</version>
+  <version>4.15.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolVersion.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolVersion.java
index 2be9273..b85480f 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolVersion.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolVersion.java
@@ -19,8 +19,9 @@
 
   static
   {
-    VALUE = 40; // Prevent protocol version constant inlining
+    VALUE = 41; // ReconnectionSession mechanism does not update some items after a reconnection
 
+    // VALUE = 40; // Prevent protocol version constant inlining
     // VALUE = 39; // CDOLockOwner.isDurableView becomes derived
     // VALUE = 38; // CDOBranchTag support
     // VALUE = 37; // SIGNAL_ACKNOWLEDGE_COMPRESSED_STRINGS
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 b1d17fc..3f7b5f5 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
@@ -48,6 +48,7 @@
 
 import org.eclipse.emf.spi.cdo.CDOSessionProtocol;
 import org.eclipse.emf.spi.cdo.CDOSessionProtocol.OpenSessionResult;
+import org.eclipse.emf.spi.cdo.InternalCDORemoteSessionManager;
 
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -188,8 +189,12 @@
       PassiveUpdateMode passiveUpdateMode = options().getPassiveUpdateMode();
       LockNotificationMode lockNotificationMode = options().getLockNotificationMode();
 
+      InternalCDORemoteSessionManager remoteSessionManager = getRemoteSessionManager();
+      boolean subscribed = remoteSessionManager != null ? remoteSessionManager.isSubscribed() : false;
+
       // TODO (CD) The next call is on the CDOClientProtocol; shouldn't it be on the DelegatingSessionProtocol instead?
-      OpenSessionResult result = protocol.openSession(repositoryName, userID, passiveUpdateEnabled, passiveUpdateMode, lockNotificationMode);
+      OpenSessionResult result = protocol.openSession(repositoryName, getSessionID(), userID, passiveUpdateEnabled, passiveUpdateMode, lockNotificationMode,
+          subscribed);
 
       if (result == null)
       {
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
index fd6170d..9be1f65 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
@@ -120,10 +120,17 @@
     return packageURICompressor;
   }
 
-  public OpenSessionResult openSession(String repositoryName, String userID, boolean passiveUpdateEnabled, PassiveUpdateMode passiveUpdateMode,
-      LockNotificationMode lockNotificationMode)
+  public OpenSessionResult openSession(String repositoryName, int sessionID, String userID, boolean passiveUpdateEnabled, PassiveUpdateMode passiveUpdateMode,
+      LockNotificationMode lockNotificationMode, boolean subscribed)
   {
-    return send(new OpenSessionRequest(this, repositoryName, userID, passiveUpdateEnabled, passiveUpdateMode, lockNotificationMode), new Monitor());
+    return send(new OpenSessionRequest(this, repositoryName, sessionID, userID, passiveUpdateEnabled, passiveUpdateMode, lockNotificationMode, subscribed),
+        new Monitor());
+  }
+
+  @Override
+  public void openedSession()
+  {
+    send(new OpenedSessionRequest(this));
   }
 
   @Override
@@ -145,12 +152,6 @@
   }
 
   @Override
-  public void openedSession()
-  {
-    send(new OpenedSessionRequest(this));
-  }
-
-  @Override
   public EPackage[] loadPackages(CDOPackageUnit packageUnit)
   {
     return send(new LoadPackagesRequest(this, (InternalCDOPackageUnit)packageUnit));
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
index 16c63c0..c76ac60 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
@@ -34,6 +34,8 @@
 
   private String repositoryName;
 
+  private int sessionID;
+
   private String userID;
 
   private boolean passiveUpdateEnabled;
@@ -42,15 +44,19 @@
 
   private LockNotificationMode lockNotificationMode;
 
-  public OpenSessionRequest(CDOClientProtocol protocol, String repositoryName, String userID, boolean passiveUpdateEnabled, PassiveUpdateMode passiveUpdateMode,
-      LockNotificationMode lockNotificationMode)
+  private boolean subscribed;
+
+  public OpenSessionRequest(CDOClientProtocol protocol, String repositoryName, int sessionID, String userID, boolean passiveUpdateEnabled,
+      PassiveUpdateMode passiveUpdateMode, LockNotificationMode lockNotificationMode, boolean subscribed)
   {
     super(protocol, CDOProtocolConstants.SIGNAL_OPEN_SESSION);
     this.repositoryName = repositoryName;
+    this.sessionID = sessionID;
     this.userID = userID;
     this.passiveUpdateEnabled = passiveUpdateEnabled;
     this.passiveUpdateMode = passiveUpdateMode;
     this.lockNotificationMode = lockNotificationMode;
+    this.subscribed = subscribed;
   }
 
   @Override
@@ -65,6 +71,13 @@
 
     if (TRACER.isEnabled())
     {
+      TRACER.format("Writing sessionID: {0}", sessionID); //$NON-NLS-1$
+    }
+
+    out.writeXInt(sessionID);
+
+    if (TRACER.isEnabled())
+    {
       TRACER.format("Writing userID: {0}", userID); //$NON-NLS-1$
     }
 
@@ -90,6 +103,13 @@
     }
 
     out.writeEnum(lockNotificationMode);
+
+    if (TRACER.isEnabled())
+    {
+      TRACER.format("Writing subscribed: {0}", subscribed); //$NON-NLS-1$
+    }
+
+    out.writeBoolean(subscribed);
   }
 
   @Override
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
index b17a665..8c5f19f 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
@@ -42,6 +42,8 @@
 
   private String repositoryName;
 
+  private int sessionID;
+
   private String userID;
 
   private boolean passiveUpdateEnabled;
@@ -50,6 +52,8 @@
 
   private LockNotificationMode lockNotificationMode;
 
+  private boolean subscribed;
+
   private InternalRepository repository;
 
   private InternalSession session;
@@ -92,6 +96,12 @@
       TRACER.format("Read repositoryName: {0}", repositoryName); //$NON-NLS-1$
     }
 
+    sessionID = in.readXInt();
+    if (TRACER.isEnabled())
+    {
+      TRACER.format("Read sessionID: {0}", sessionID); //$NON-NLS-1$
+    }
+
     userID = in.readString();
     if (TRACER.isEnabled())
     {
@@ -115,6 +125,13 @@
     {
       TRACER.format("Read lockNotificationMode: {0}", lockNotificationMode); //$NON-NLS-1$
     }
+
+    subscribed = in.readBoolean();
+    if (TRACER.isEnabled())
+    {
+      TRACER.format("Read subscribed: {0}", subscribed); //$NON-NLS-1$
+    }
+
   }
 
   @Override
@@ -137,7 +154,7 @@
       try
       {
         InternalSessionManager sessionManager = repository.getSessionManager();
-        session = sessionManager.openSession(protocol);
+        session = sessionManager.openSession(protocol, sessionID);
       }
       catch (NotAuthenticatedException ex)
       {
@@ -166,6 +183,7 @@
       session.setPassiveUpdateEnabled(passiveUpdateEnabled);
       session.setPassiveUpdateMode(passiveUpdateMode);
       session.setLockNotificationMode(lockNotificationMode);
+      session.setSubscribed(subscribed);
 
       protocol.setInfraStructure(session);
       if (TRACER.isEnabled())
diff --git a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
index 299d819..4422841 100644
--- a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.server;singleton:=true
-Bundle-Version: 4.13.1.qualifier
+Bundle-Version: 4.14.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -10,17 +10,17 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ClassPath: .
 Require-Bundle: org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.internal.server;version="4.13.1";
+Export-Package: org.eclipse.emf.cdo.internal.server;version="4.14.0";
   x-friends:="org.eclipse.emf.cdo.server.db,
    org.eclipse.emf.cdo.server.net4j,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.workspace,
    org.eclipse.emf.cdo.server.embedded",
- org.eclipse.emf.cdo.internal.server.bundle;version="4.13.1";x-internal:=true,
- org.eclipse.emf.cdo.internal.server.mem;version="4.13.1";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.server.messages;version="4.13.1";x-internal:=true,
- org.eclipse.emf.cdo.internal.server.syncing;version="4.13.1";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.server;version="4.13.1",
- org.eclipse.emf.cdo.server.mem;version="4.13.1",
- org.eclipse.emf.cdo.spi.server;version="4.13.1"
+ org.eclipse.emf.cdo.internal.server.bundle;version="4.14.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.server.mem;version="4.14.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.internal.server.messages;version="4.14.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.server.syncing;version="4.14.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.server;version="4.14.0",
+ org.eclipse.emf.cdo.server.mem;version="4.14.0",
+ org.eclipse.emf.cdo.spi.server;version="4.14.0"
 Automatic-Module-Name: org.eclipse.emf.cdo.server
diff --git a/plugins/org.eclipse.emf.cdo.server/pom.xml b/plugins/org.eclipse.emf.cdo.server/pom.xml
index 9f5e334..e5ad58a 100644
--- a/plugins/org.eclipse.emf.cdo.server/pom.xml
+++ b/plugins/org.eclipse.emf.cdo.server/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.emf.cdo.server</artifactId>
-  <version>4.13.1-SNAPSHOT</version>
+  <version>4.14.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
index 440bebf..f2f3f29 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java
@@ -258,10 +258,34 @@
   @Override
   public InternalSession openSession(ISessionProtocol sessionProtocol)
   {
-    int id = lastSessionID.incrementAndGet();
-    if (TRACER.isEnabled())
+    return openSession(sessionProtocol, 0);
+  }
+
+  /**
+   * @since 2.0
+   */
+  @Override
+  public InternalSession openSession(ISessionProtocol sessionProtocol, int sessionID)
+  {
+    int id;
+
+    if (sessionID == 0)
     {
-      TRACER.trace("Opening session " + id); //$NON-NLS-1$
+      id = lastSessionID.incrementAndGet();
+
+      if (TRACER.isEnabled())
+      {
+        TRACER.trace("Opening session " + id); //$NON-NLS-1$
+      }
+    }
+    else
+    {
+      id = sessionID;
+
+      if (TRACER.isEnabled())
+      {
+        TRACER.trace("Reopening session " + id); //$NON-NLS-1$
+      }
     }
 
     String userID = authenticateUser(sessionProtocol);
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalSessionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalSessionManager.java
index 7b3d646..4d7af12 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalSessionManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalSessionManager.java
@@ -119,6 +119,12 @@
    */
   public InternalSession openSession(ISessionProtocol sessionProtocol);
 
+  /**
+   * @return Never <code>null</code>
+   * @since 4.14
+   */
+  public InternalSession openSession(ISessionProtocol protocol, int sessionID);
+
   public void sessionClosed(InternalSession session);
 
   /**
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java
index a343ba2..5a895ef 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ReconnectingSessionTest.java
@@ -17,6 +17,9 @@
 import org.eclipse.emf.cdo.net4j.CDOSessionRecoveryEvent;
 import org.eclipse.emf.cdo.net4j.ReconnectingCDOSessionConfiguration;
 import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.session.remote.CDORemoteSession;
+import org.eclipse.emf.cdo.session.remote.CDORemoteSessionManager;
+import org.eclipse.emf.cdo.session.remote.CDORemoteSessionMessage;
 import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
 import org.eclipse.emf.cdo.tests.config.ISessionConfig;
 import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
@@ -38,6 +41,9 @@
 
 import org.eclipse.emf.spi.cdo.InternalCDOView;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
 /**
@@ -67,7 +73,7 @@
 
     ITCPAcceptor acceptor = null;
     CDONet4jSession reconnectingSession = null;
-
+    CDOTransaction durableTransaction = null;
     try
     {
       IManagedContainer serverContainer = getServerContainer();
@@ -84,6 +90,7 @@
       configuration.setHeartBeatEnabled(true);
 
       reconnectingSession = (CDONet4jSession)openSession(configuration);
+
       dumpEvents(reconnectingSession);
 
       final CountDownLatch recoveryStarted = new CountDownLatch(1);
@@ -109,6 +116,9 @@
         }
       });
 
+      RemoteMessageListener remoteMessageListener = new RemoteMessageListener();
+      reconnectingSession.getRemoteSessionManager().addListener(remoteMessageListener);
+
       CDOView viewWithLockNotifications = reconnectingSession.openView();
       viewWithLockNotifications.options().setLockNotificationEnabled(true);
 
@@ -126,6 +136,16 @@
       commitAndSync(transaction, view);
       assertEquals(2, resource2.getContents().size());
 
+      sendMessageToAllSessions("message1", session1);
+      remoteMessageListener.assertReceivedMessages(Arrays.asList("message1"));
+
+      durableTransaction = reconnectingSession.openTransaction();
+      durableTransaction.enableDurableLocking();
+      durableTransaction.options().setAutoReleaseLocksEnabled(false);
+      CDOResource lockRes = durableTransaction.createResource(getResourcePath("durableLockTest"));
+      durableTransaction.commit();
+      lockRes.cdoWriteLock().lock(1000);
+
       IOUtil.OUT().println();
       IOUtil.OUT().println("Deactivating acceptor...");
       LifecycleUtil.deactivate(acceptor);
@@ -144,15 +164,69 @@
       assertEquals(3, resource2.getContents().size());
 
       checkLockNotifications(resource1, resReconn);
+
+      sendMessageToAllSessions("message2", session1);
+      remoteMessageListener.assertReceivedMessages(Arrays.asList("message1", "message2"));
+
+      durableTransaction.refreshLockStates(null);
+      assertFalse(lockRes.cdoWriteLock().isLockedByOthers());
+      assertTrue(lockRes.cdoWriteLock().isLocked());
     }
     finally
-
     {
+      if (durableTransaction != null)
+      {
+        durableTransaction.disableDurableLocking(true);
+      }
+
       LifecycleUtil.deactivate(reconnectingSession);
       LifecycleUtil.deactivate(acceptor);
     }
   }
 
+  private void sendMessageToAllSessions(String type, CDOSession session) throws InterruptedException
+  {
+    CDORemoteSession[] remoteSessions = session.getRemoteSessionManager().getRemoteSessions();
+    for (CDORemoteSession remoteSession : remoteSessions)
+    {
+      remoteSession.sendMessage(new CDORemoteSessionMessage(type));
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class RemoteMessageListener extends CDORemoteSessionManager.EventAdapter
+  {
+    private List<String> received = new ArrayList<>();
+
+    public RemoteMessageListener()
+    {
+    }
+
+    @Override
+    protected void onMessageReceived(final CDORemoteSession remoteSession, final CDORemoteSessionMessage message)
+    {
+      received.add(message.getType());
+    }
+
+    public void assertReceivedMessages(final List<String> expected) throws InterruptedException
+    {
+      long timeout = System.currentTimeMillis() + 2000;
+      while (System.currentTimeMillis() < timeout)
+      {
+        if (expected.equals(received))
+        {
+          break;
+        }
+
+        Thread.sleep(20);
+      }
+
+      assertEquals(expected, received);
+    }
+  }
+
   private void checkLockNotifications(CDOResource resource1, CDOResource resReconn) throws Exception
   {
     CDOView viewReconn = resReconn.cdoView();