Revert "[$387563] $Generalize the "lock of new objects on commit" feature to the "lock/unlock objects on commit" "

This reverts commit 6dc966a83269a207a5538850648ea23697c682bc.
diff --git a/features/org.eclipse.emf.cdo-feature/feature.xml b/features/org.eclipse.emf.cdo-feature/feature.xml
index 9799634..03d6062 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.6.0.qualifier"
+      version="4.5.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.defs-feature/feature.xml b/features/org.eclipse.emf.cdo.defs-feature/feature.xml
index 2b8f3a2..2d0a3ee 100644
--- a/features/org.eclipse.emf.cdo.defs-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.defs-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.defs"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.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.epp-feature/feature.xml b/features/org.eclipse.emf.cdo.epp-feature/feature.xml
index 709e38f..32f3677 100644
--- a/features/org.eclipse.emf.cdo.epp-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.epp-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.epp"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.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.explorer-feature/feature.xml b/features/org.eclipse.emf.cdo.explorer-feature/feature.xml
index 4b0a638..8482d22 100644
--- a/features/org.eclipse.emf.cdo.explorer-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.explorer-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.explorer"
       label="%featureName"
-      version="4.5.0.qualifier"
+      version="4.4.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg">
 
diff --git a/features/org.eclipse.emf.cdo.sdk-feature/feature.xml b/features/org.eclipse.emf.cdo.sdk-feature/feature.xml
index 7177707..37de3f7 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="4.6.0.qualifier"
+      version="4.5.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/feature.xml b/features/org.eclipse.emf.cdo.server-feature/feature.xml
index afc8747..579b725 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.6.0.qualifier"
+      version="4.5.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.hibernate-feature/feature.xml b/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml
index 9a8ece9..1e15b7a 100644
--- a/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server.hibernate-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server.hibernate"
       label="%featureName"
-      version="4.2.400.qualifier"
+      version="4.2.300.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.tests-feature/feature.xml b/features/org.eclipse.emf.cdo.tests-feature/feature.xml
index c7288c7..ff9e97c 100644
--- a/features/org.eclipse.emf.cdo.tests-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.tests-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.tests"
       label="%featureName"
-      version="4.2.400.qualifier"
+      version="4.2.300.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.net4j-feature/feature.xml b/features/org.eclipse.net4j-feature/feature.xml
index 0891d32..7c97421 100644
--- a/features/org.eclipse.net4j-feature/feature.xml
+++ b/features/org.eclipse.net4j-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.db-feature/feature.xml b/features/org.eclipse.net4j.db-feature/feature.xml
index 15fe440..c65973c 100644
--- a/features/org.eclipse.net4j.db-feature/feature.xml
+++ b/features/org.eclipse.net4j.db-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.db"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.net4j.defs-feature/feature.xml b/features/org.eclipse.net4j.defs-feature/feature.xml
index b907cce..c08b74a 100644
--- a/features/org.eclipse.net4j.defs-feature/feature.xml
+++ b/features/org.eclipse.net4j.defs-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.defs"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.net4j.sdk-feature/feature.xml b/features/org.eclipse.net4j.sdk-feature/feature.xml
index 4ead21b..e538401 100644
--- a/features/org.eclipse.net4j.sdk-feature/feature.xml
+++ b/features/org.eclipse.net4j.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.sdk"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util-feature/feature.xml b/features/org.eclipse.net4j.util-feature/feature.xml
index 090cf7b..db78136 100644
--- a/features/org.eclipse.net4j.util-feature/feature.xml
+++ b/features/org.eclipse.net4j.util-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util.ui-feature/feature.xml b/features/org.eclipse.net4j.util.ui-feature/feature.xml
index 897cc10..2e65446 100644
--- a/features/org.eclipse.net4j.util.ui-feature/feature.xml
+++ b/features/org.eclipse.net4j.util.ui-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util.ui"
       label="%featureName"
-      version="4.6.0.qualifier"
+      version="4.5.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF
index 05e58ab..f9852b9 100644
--- a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.common
-Bundle-Version: 4.6.0.qualifier
+Bundle-Version: 4.5.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -14,21 +14,21 @@
  org.eclipse.emf.ecore.change;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
  org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.common;version="4.6.0",
- org.eclipse.emf.cdo.common.admin;version="4.6.0",
- org.eclipse.emf.cdo.common.branch;version="4.6.0",
- org.eclipse.emf.cdo.common.commit;version="4.6.0",
- org.eclipse.emf.cdo.common.commit.handler;version="4.6.0",
- org.eclipse.emf.cdo.common.id;version="4.6.0",
- org.eclipse.emf.cdo.common.lob;version="4.6.0",
- org.eclipse.emf.cdo.common.lock;version="4.6.0",
- org.eclipse.emf.cdo.common.model;version="4.6.0",
- org.eclipse.emf.cdo.common.protocol;version="4.6.0",
- org.eclipse.emf.cdo.common.revision;version="4.6.0",
- org.eclipse.emf.cdo.common.revision.delta;version="4.6.0",
- org.eclipse.emf.cdo.common.security;version="4.6.0",
- org.eclipse.emf.cdo.common.util;version="4.6.0",
- org.eclipse.emf.cdo.internal.common;version="4.6.0";
+Export-Package: org.eclipse.emf.cdo.common;version="4.5.0",
+ org.eclipse.emf.cdo.common.admin;version="4.5.0",
+ org.eclipse.emf.cdo.common.branch;version="4.5.0",
+ org.eclipse.emf.cdo.common.commit;version="4.5.0",
+ org.eclipse.emf.cdo.common.commit.handler;version="4.5.0",
+ org.eclipse.emf.cdo.common.id;version="4.5.0",
+ org.eclipse.emf.cdo.common.lob;version="4.5.0",
+ org.eclipse.emf.cdo.common.lock;version="4.5.0",
+ org.eclipse.emf.cdo.common.model;version="4.5.0",
+ org.eclipse.emf.cdo.common.protocol;version="4.5.0",
+ org.eclipse.emf.cdo.common.revision;version="4.5.0",
+ org.eclipse.emf.cdo.common.revision.delta;version="4.5.0",
+ org.eclipse.emf.cdo.common.security;version="4.5.0",
+ org.eclipse.emf.cdo.common.util;version="4.5.0",
+ org.eclipse.emf.cdo.internal.common;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -38,11 +38,11 @@
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.server.hibernate",
- org.eclipse.emf.cdo.internal.common.branch;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.branch;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.server.hibernate",
- org.eclipse.emf.cdo.internal.common.bundle;version="4.6.0";x-internal:=true,
- org.eclipse.emf.cdo.internal.common.commit;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.bundle;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.common.commit;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -51,7 +51,7 @@
    org.eclipse.emf.cdo.server.net4j,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.common.id;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.id;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -62,9 +62,9 @@
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.admin,
    org.eclipse.emf.cdo.server.admin",
- org.eclipse.emf.cdo.internal.common.lock;version="4.6.0";x-internal:=true,
- org.eclipse.emf.cdo.internal.common.messages;version="4.6.0";x-internal:=true,
- org.eclipse.emf.cdo.internal.common.model;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.lock;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.common.messages;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.common.model;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -73,7 +73,7 @@
    org.eclipse.emf.cdo.server.net4j,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.common.revision;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.revision;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -82,7 +82,7 @@
    org.eclipse.emf.cdo.server.net4j,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.common.revision.delta;version="4.6.0";
+ org.eclipse.emf.cdo.internal.common.revision.delta;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.common,
    org.eclipse.emf.cdo.common.db,
    org.eclipse.emf.cdo,
@@ -91,12 +91,12 @@
    org.eclipse.emf.cdo.server.net4j,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.spi.common;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.admin;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.branch;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.commit;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.id;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.lock;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.model;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.protocol;version="4.6.0",
- org.eclipse.emf.cdo.spi.common.revision;version="4.6.0"
+ org.eclipse.emf.cdo.spi.common;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.admin;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.branch;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.commit;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.id;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.lock;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.model;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.protocol;version="4.5.0",
+ org.eclipse.emf.cdo.spi.common.revision;version="4.5.0"
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java
index cb0dac0..4d5b8bd 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/lock/InternalCDOLockState.java
@@ -10,10 +10,8 @@
  */
 package org.eclipse.emf.cdo.spi.common.lock;
 
-import org.eclipse.emf.cdo.common.id.CDOID;
 import org.eclipse.emf.cdo.common.lock.CDOLockOwner;
 import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.internal.common.lock.CDOLockStateImpl;
 
 /**
  * If the meaning of this type isn't clear, there really should be more of a description here...
@@ -25,11 +23,6 @@
  */
 public interface InternalCDOLockState extends CDOLockState
 {
-  /**
-   * @since 4.6
-   */
-  public static final CDOLockState UNLOCKED = new CDOLockStateImpl(CDOID.NULL);
-
   public void addReadLockOwner(CDOLockOwner lockOwner);
 
   public boolean removeReadLockOwner(CDOLockOwner lockOwner);
diff --git a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF
index 6d13a12..32eca96 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.cdo.net4j; singleton:=true
-Bundle-Version: 4.1.500.qualifier
+Bundle-Version: 4.1.400.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -10,17 +10,17 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
  org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.500";
+Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.400";
   x-friends:="org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.examples",
- org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.500";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.500";x-internal:=true,
- org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.500";
+ org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.400";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.400";x-internal:=true,
+ org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.400";
   x-friends:="org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.examples",
- org.eclipse.emf.cdo.net4j;version="4.1.500"
+ org.eclipse.emf.cdo.net4j;version="4.1.400"
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
index 3f84e0d..acf0b46 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
@@ -69,24 +69,26 @@
 
   private static long sleepMillisForTesting = 0L;
 
-  private final int commitNumber;
+  private CDOIDProvider idProvider; // CDOTransaction
 
-  private final String commitComment;
+  private int commitNumber;
 
-  private final CDOCommitData commitData;
+  private String commitComment;
 
-  private final Collection<CDOLob<?>> lobs;
+  private boolean releaseLocks;
 
-  private final Collection<CDOLockState> locksOnNewObjects;
+  private CDOCommitData commitData;
 
-  private final Collection<CDOID> idsToUnlock;
+  private Collection<CDOLob<?>> lobs;
 
-  private final int viewID;
+  private Collection<CDOLockState> locksOnNewObjects;
+
+  private int viewID;
 
   /**
    * Is <code>null</code> in {@link CommitDelegationRequest}.
    */
-  private final InternalCDOTransaction transaction;
+  private InternalCDOTransaction transaction;
 
   private boolean clearResourcePathCache;
 
@@ -98,23 +100,20 @@
   public CommitTransactionRequest(CDOClientProtocol protocol, short signalID, InternalCDOCommitContext context)
   {
     super(protocol, signalID);
-    transaction = context.getTransaction();
 
+    transaction = context.getTransaction();
     CommitToken commitToken = transaction.getCommitToken();
     if (commitToken != null)
     {
       commitNumber = commitToken.getCommitNumber();
     }
-    else
-    {
-      commitNumber = 0;
-    }
 
     commitComment = context.getCommitComment();
+    releaseLocks = context.isAutoReleaseLocks();
+    idProvider = context.getTransaction();
     commitData = context.getCommitData();
     lobs = context.getLobs();
     locksOnNewObjects = context.getLocksOnNewObjects();
-    idsToUnlock = context.getIDsToUnlock();
     viewID = context.getViewID();
   }
 
@@ -128,7 +127,7 @@
   @Override
   protected CDOIDProvider getIDProvider()
   {
-    return transaction;
+    return idProvider;
   }
 
   @Override
@@ -151,37 +150,17 @@
     List<CDOIDAndVersion> detachedObjects = commitData.getDetachedObjects();
 
     out.writeLong(getLastUpdateTime());
+    out.writeBoolean(releaseLocks);
     out.writeInt(commitNumber);
     out.writeString(commitComment);
-    out.writeInt(locksOnNewObjects.size());
-    out.writeInt(idsToUnlock.size());
     out.writeInt(newPackageUnits.size());
+    out.writeInt(locksOnNewObjects.size());
     out.writeInt(newObjects.size());
     out.writeInt(changedObjects.size());
     out.writeInt(detachedObjects.size());
 
     if (TRACER.isEnabled())
     {
-      TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$
-    }
-
-    for (CDOLockState lockState : locksOnNewObjects)
-    {
-      out.writeCDOLockState(lockState);
-    }
-
-    if (TRACER.isEnabled())
-    {
-      TRACER.format("Writing {0} unlocks on changed objects", idsToUnlock.size()); //$NON-NLS-1$
-    }
-
-    for (CDOID id : idsToUnlock)
-    {
-      out.writeCDOID(id);
-    }
-
-    if (TRACER.isEnabled())
-    {
       TRACER.format("Writing {0} new package units", newPackageUnits.size()); //$NON-NLS-1$
     }
 
@@ -192,6 +171,16 @@
 
     if (TRACER.isEnabled())
     {
+      TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$
+    }
+
+    for (CDOLockState lockState : locksOnNewObjects)
+    {
+      out.writeCDOLockState(lockState);
+    }
+
+    if (TRACER.isEnabled())
+    {
       TRACER.format("Writing {0} new objects", newObjects.size()); //$NON-NLS-1$
     }
 
@@ -330,7 +319,7 @@
     }
 
     CommitTransactionResult result = new CommitTransactionResult();
-    result.setIDProvider(transaction);
+    result.setIDProvider(idProvider);
     result.setClearResourcePathCache(clearResourcePathCache);
     result.setRollbackReason(in.readByte());
     result.setRollbackMessage(in.readString());
@@ -356,7 +345,7 @@
   protected CommitTransactionResult confirmingResult(CDODataInput in) throws IOException
   {
     CommitTransactionResult result = new CommitTransactionResult();
-    result.setIDProvider(transaction);
+    result.setIDProvider(idProvider);
     result.setClearResourcePathCache(clearResourcePathCache);
     result.setBranchPoint(in.readCDOBranchPoint());
     result.setPreviousTimeStamp(in.readLong());
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF
index be3924e..bdab554 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.server.hibernate;singleton:=true
-Bundle-Version: 4.2.400.qualifier
+Bundle-Version: 4.2.300.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -14,11 +14,11 @@
  org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)",
  org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
  org.eclipse.net4j.db;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.server.hibernate;version="4.2.400",
- org.eclipse.emf.cdo.server.internal.hibernate;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate",
- org.eclipse.emf.cdo.server.internal.hibernate.bundle;version="4.2.400";x-internal:=true,
- org.eclipse.emf.cdo.server.internal.hibernate.info;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate",
- org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;version="4.2.400";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate"
+Export-Package: org.eclipse.emf.cdo.server.hibernate;version="4.2.300",
+ org.eclipse.emf.cdo.server.internal.hibernate;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate",
+ org.eclipse.emf.cdo.server.internal.hibernate.bundle;version="4.2.300";x-internal:=true,
+ org.eclipse.emf.cdo.server.internal.hibernate.info;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate",
+ org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;version="4.2.300";x-friends:="org.eclipse.emf.cdo.server.hibernate.teneo,org.eclipse.emf.cdo.tests.hibernate"
 Import-Package: org.apache.log4j;version="[1.2.0,2.0.0)",
  org.eclipse.emf.teneo;version="[2.0.1,3.0.0)",
  org.eclipse.emf.teneo.annotations.mapper;version="[2.0.1,3.0.0)",
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
index 6692fb2..ee8b86b 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
@@ -125,7 +125,6 @@
   {
   }
 
-  @Deprecated
   public boolean isAutoReleaseLocksEnabled()
   {
     return false;
@@ -161,11 +160,6 @@
     return null;
   }
 
-  public CDOID[] getIDsToUnlock()
-  {
-    return null;
-  }
-
   public InternalCDORevision[] getNewObjects()
   {
     return newObjects.toArray(new InternalCDORevision[0]);
@@ -309,10 +303,6 @@
   {
   }
 
-  public void setIDsToUnlock(CDOID[] idsToUnlock)
-  {
-  }
-
   public void setNewObjects(InternalCDORevision[] newObjects)
   {
   }
@@ -337,7 +327,6 @@
   {
   }
 
-  @Deprecated
   public void setAutoReleaseLocksEnabled(boolean on)
   {
   }
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
index 9254099..048d55a 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.server.net4j;singleton:=true
-Bundle-Version: 4.1.400.qualifier
+Bundle-Version: 4.1.300.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -12,6 +12,6 @@
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional,
  org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
  org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.400";x-internal:=true,
- org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.400";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.server.net4j;version="4.1.400"
+Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.300";x-internal:=true,
+ org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.300";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.server.net4j;version="4.1.300"
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
index facc99b..0b38c44 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
@@ -126,44 +126,19 @@
     commitContext.preWrite();
 
     long lastUpdateTime = in.readLong();
+    boolean autoReleaseLocksEnabled = in.readBoolean();
     int commitNumber = in.readInt();
     String commitComment = in.readString();
 
-    CDOLockState[] locksOnNewObjects = new CDOLockState[in.readInt()];
-    CDOID[] idsToUnlock = new CDOID[in.readInt()];
     InternalCDOPackageUnit[] newPackageUnits = new InternalCDOPackageUnit[in.readInt()];
+    CDOLockState[] locksOnNewObjects = new CDOLockState[in.readInt()];
     InternalCDORevision[] newObjects = new InternalCDORevision[in.readInt()];
     InternalCDORevisionDelta[] dirtyObjectDeltas = new InternalCDORevisionDelta[in.readInt()];
     CDOID[] detachedObjects = new CDOID[in.readInt()];
-    monitor.begin(locksOnNewObjects.length + idsToUnlock.length + newPackageUnits.length + newObjects.length
-        + dirtyObjectDeltas.length + detachedObjects.length);
+    monitor.begin(newPackageUnits.length + newObjects.length + dirtyObjectDeltas.length + detachedObjects.length);
 
     try
     {
-      // Locks on new objects
-      if (TRACER.isEnabled())
-      {
-        TRACER.format("Reading {0} locks on new objects", locksOnNewObjects.length); //$NON-NLS-1$
-      }
-
-      for (int i = 0; i < locksOnNewObjects.length; i++)
-      {
-        locksOnNewObjects[i] = in.readCDOLockState();
-        monitor.worked();
-      }
-
-      // Unlocks on changed objects
-      if (TRACER.isEnabled())
-      {
-        TRACER.format("Reading {0} IDs to unlock", idsToUnlock.length); //$NON-NLS-1$
-      }
-
-      for (int i = 0; i < idsToUnlock.length; i++)
-      {
-        idsToUnlock[i] = in.readCDOID();
-        monitor.worked();
-      }
-
       // New package units
       if (TRACER.isEnabled())
       {
@@ -186,6 +161,18 @@
         EMFUtil.safeResolveAll(resourceSet);
       }
 
+      // Locks on new objects
+      if (TRACER.isEnabled())
+      {
+        TRACER.format("Reading {0} locks on new objects", locksOnNewObjects.length); //$NON-NLS-1$
+      }
+
+      for (int i = 0; i < locksOnNewObjects.length; i++)
+      {
+        locksOnNewObjects[i] = in.readCDOLockState();
+        monitor.worked();
+      }
+
       // New objects
       if (TRACER.isEnabled())
       {
@@ -287,6 +274,7 @@
 
       commitContext.setCommitNumber(commitNumber);
       commitContext.setLastUpdateTime(lastUpdateTime);
+      commitContext.setAutoReleaseLocksEnabled(autoReleaseLocksEnabled);
       commitContext.setClearResourcePathCache(clearResourcePathCache);
       commitContext.setUsingEcore(usingEcore);
       commitContext.setUsingEtypes(usingEtypes);
@@ -299,8 +287,6 @@
       commitContext.setDetachedObjectVersions(detachedObjectVersions);
       commitContext.setCommitComment(commitComment);
       commitContext.setLobs(getIndicationStream());
-      commitContext.setLocksOnNewObjects(locksOnNewObjects);
-      commitContext.setIDsToUnlock(idsToUnlock);
     }
     finally
     {
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 3e0cb2e..8a287f1 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.6.0.qualifier
+Bundle-Version: 4.5.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -10,18 +10,18 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 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.6.0";
+Export-Package: org.eclipse.emf.cdo.internal.server;version="4.5.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.hibernate",
- org.eclipse.emf.cdo.internal.server.bundle;version="4.6.0";x-internal:=true,
- org.eclipse.emf.cdo.internal.server.embedded;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.server.mem;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.internal.server.messages;version="4.6.0";x-internal:=true,
- org.eclipse.emf.cdo.internal.server.syncing;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.server;version="4.6.0",
- org.eclipse.emf.cdo.server.embedded;version="4.6.0",
- org.eclipse.emf.cdo.server.mem;version="4.6.0",
- org.eclipse.emf.cdo.spi.server;version="4.6.0"
+ org.eclipse.emf.cdo.internal.server.bundle;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.server.embedded;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.internal.server.mem;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.internal.server.messages;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.server.syncing;version="4.5.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.server;version="4.5.0",
+ org.eclipse.emf.cdo.server.embedded;version="4.5.0",
+ org.eclipse.emf.cdo.server.mem;version="4.5.0",
+ org.eclipse.emf.cdo.spi.server;version="4.5.0"
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java
index bf696c8..a6872ff 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java
@@ -61,6 +61,11 @@
     return getDelegate().getCommitComment();
   }
 
+  public boolean isAutoReleaseLocksEnabled()
+  {
+    return getDelegate().isAutoReleaseLocksEnabled();
+  }
+
   public InternalCDOPackageRegistry getPackageRegistry()
   {
     return getDelegate().getPackageRegistry();
@@ -131,22 +136,11 @@
     return getDelegate().isUsingEtypes();
   }
 
-  @Deprecated
-  public boolean isAutoReleaseLocksEnabled()
-  {
-    return getDelegate().isAutoReleaseLocksEnabled();
-  }
-
   public CDOLockState[] getLocksOnNewObjects()
   {
     return getDelegate().getLocksOnNewObjects();
   }
 
-  public CDOID[] getIDsToUnlock()
-  {
-    return getDelegate().getIDsToUnlock();
-  }
-
   public CDOBranchVersion[] getDetachedObjectVersions()
   {
     return getDelegate().getDetachedObjectVersions();
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 b20e5a3..5163a45 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
@@ -78,7 +78,6 @@
 import org.eclipse.net4j.util.StringUtil;
 import org.eclipse.net4j.util.collection.IndexedList;
 import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
-import org.eclipse.net4j.util.concurrent.RWOLockManager;
 import org.eclipse.net4j.util.concurrent.RWOLockManager.LockState;
 import org.eclipse.net4j.util.io.ExtendedDataInputStream;
 import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
@@ -93,6 +92,7 @@
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -147,6 +147,8 @@
 
   private InternalCDOPackageUnit[] newPackageUnits = new InternalCDOPackageUnit[0];
 
+  private CDOLockState[] locksOnNewObjects = new CDOLockState[0];
+
   private InternalCDORevision[] newObjects = new InternalCDORevision[0];
 
   private InternalCDORevisionDelta[] dirtyObjectDeltas = new InternalCDORevisionDelta[0];
@@ -177,7 +179,7 @@
 
   private List<CDOIDReference> xRefs;
 
-  private final List<LockState<Object, IView>> postCommitLockStates = new ArrayList<LockState<Object, IView>>();
+  private List<LockState<Object, IView>> postCommitLockStates;
 
   private boolean hasChanges;
 
@@ -185,12 +187,10 @@
 
   private boolean ensuringReferentialIntegrity;
 
+  private boolean autoReleaseLocksEnabled;
+
   private ExtendedDataInputStream lobs;
 
-  private CDOLockState[] locksOnNewObjects = new CDOLockState[0];
-
-  private CDOID[] idsToUnlock = new CDOID[0];
-
   private Map<Object, Object> data;
 
   private CommitNotificationInfo commitNotificationInfo = new CommitNotificationInfo();
@@ -238,6 +238,11 @@
     return lastUpdateTime;
   }
 
+  public boolean isAutoReleaseLocksEnabled()
+  {
+    return autoReleaseLocksEnabled;
+  }
+
   public byte getRollbackReason()
   {
     return rollbackReason;
@@ -289,6 +294,11 @@
     return newPackageUnits;
   }
 
+  public CDOLockState[] getLocksOnNewObjects()
+  {
+    return locksOnNewObjects;
+  }
+
   public InternalCDORevision[] getNewObjects()
   {
     return newObjects;
@@ -516,6 +526,11 @@
     this.newPackageUnits = newPackageUnits;
   }
 
+  public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects)
+  {
+    this.locksOnNewObjects = locksOnNewObjects;
+  }
+
   public void setNewObjects(InternalCDORevision[] newObjects)
   {
     this.newObjects = newObjects;
@@ -546,6 +561,11 @@
     this.lastUpdateTime = lastUpdateTime;
   }
 
+  public void setAutoReleaseLocksEnabled(boolean on)
+  {
+    autoReleaseLocksEnabled = on;
+  }
+
   public void setCommitNumber(int commitNumber)
   {
     this.commitNumber = commitNumber;
@@ -566,38 +586,6 @@
     lobs = in;
   }
 
-  @Deprecated
-  public boolean isAutoReleaseLocksEnabled()
-  {
-    return false;
-  }
-
-  @Deprecated
-  public void setAutoReleaseLocksEnabled(boolean on)
-  {
-    // Do nothing.
-  }
-
-  public CDOLockState[] getLocksOnNewObjects()
-  {
-    return locksOnNewObjects;
-  }
-
-  public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects)
-  {
-    this.locksOnNewObjects = locksOnNewObjects;
-  }
-
-  public CDOID[] getIDsToUnlock()
-  {
-    return idsToUnlock;
-  }
-
-  public void setIDsToUnlock(CDOID[] idsToUnlock)
-  {
-    this.idsToUnlock = idsToUnlock;
-  }
-
   public <T> T getData(Object key)
   {
     if (data == null)
@@ -1119,6 +1107,50 @@
     }
   }
 
+  protected synchronized void unlockObjects()
+  {
+    // Unlock objects locked during commit
+    if (!lockedObjects.isEmpty())
+    {
+      lockManager.unlock2(LockType.WRITE, transaction, lockedObjects);
+      lockedObjects.clear();
+    }
+
+    // Release durable locks that have been acquired on detached objects
+    if (detachedObjects.length > 0)
+    {
+      boolean branching = repository.isSupportingBranches();
+      Collection<? extends Object> unlockables;
+      if (branching)
+      {
+        List<CDOIDAndBranch> keys = new ArrayList<CDOIDAndBranch>(detachedObjects.length);
+        for (CDOID id : detachedObjects)
+        {
+          CDOIDAndBranch idAndBranch = CDOIDUtil.createIDAndBranch(id, branch);
+          keys.add(idAndBranch);
+        }
+
+        unlockables = keys;
+      }
+      else
+      {
+        unlockables = Arrays.asList(detachedObjects);
+      }
+
+      // We only need to consider detached objects that have been explicitly locked
+      Collection<Object> detachedObjectsToUnlock = new ArrayList<Object>();
+      for (Object unlockable : unlockables)
+      {
+        if (lockManager.hasLock(LockType.WRITE, transaction, unlockable))
+        {
+          detachedObjectsToUnlock.add(unlockable);
+        }
+      }
+
+      lockManager.unlock2(true, LockType.WRITE, transaction, detachedObjectsToUnlock, false);
+    }
+  }
+
   protected void computeDirtyObjects(OMMonitor monitor)
   {
     try
@@ -1323,7 +1355,7 @@
         }
       }
 
-      releaseImplicitLocks();
+      unlockObjects();
     }
   }
 
@@ -1342,22 +1374,24 @@
       addRevisions(dirtyObjects, monitor.fork());
       reviseDetachedObjects(monitor.fork());
 
-      releaseImplicitLocks();
+      unlockObjects();
       monitor.worked();
 
-      acquireLocksOnNewObjects();
+      applyLocksOnNewObjects();
       monitor.worked();
 
-      autoReleaseExplicitLocks();
-      monitor.worked();
-
-      if (!postCommitLockStates.isEmpty())
+      if (autoReleaseLocksEnabled)
       {
-        // TODO (CD) Does doing this here make sense?
-        // The commit notifications get sent later, from postCommit.
-        sendLockNotifications(postCommitLockStates);
+        postCommitLockStates = lockManager.unlock2(true, transaction);
+        if (!postCommitLockStates.isEmpty())
+        {
+          // TODO (CD) Does doing this here make sense?
+          // The commit notifications get sent later, from postCommit.
+          sendLockNotifications(postCommitLockStates);
+        }
       }
 
+      monitor.worked();
       repository.notifyWriteAccessHandlers(transaction, this, false, monitor.fork());
     }
     catch (Throwable t)
@@ -1370,26 +1404,15 @@
     }
   }
 
-  protected synchronized void releaseImplicitLocks()
-  {
-    // Unlock objects locked during commit
-    if (!lockedObjects.isEmpty())
-    {
-      lockManager.unlock2(LockType.WRITE, transaction, lockedObjects);
-      lockedObjects.clear();
-    }
-  }
-
-  protected void acquireLocksOnNewObjects() throws InterruptedException
+  protected void applyLocksOnNewObjects() throws InterruptedException
   {
     final CDOLockOwner owner = CDOLockUtil.createLockOwner(transaction);
-    final boolean mapIDs = transaction.getRepository().getIDGenerationLocation() == IDGenerationLocation.STORE;
 
     for (CDOLockState lockState : locksOnNewObjects)
     {
       Object target = lockState.getLockedObject();
 
-      if (mapIDs)
+      if (transaction.getRepository().getIDGenerationLocation() == IDGenerationLocation.STORE)
       {
         CDOIDAndBranch idAndBranch = target instanceof CDOIDAndBranch ? (CDOIDAndBranch)target : null;
         CDOID id = idAndBranch != null ? ((CDOIDAndBranch)target).getID() : (CDOID)target;
@@ -1399,60 +1422,13 @@
         target = idAndBranch != null ? CDOIDUtil.createIDAndBranch(newID, idAndBranch.getBranch()) : newID;
       }
 
-      LockState<Object, IView> postCommitLockState = null;
       for (LockType type : LockType.values())
       {
         if (lockState.isLocked(type, owner, false))
         {
-          List<LockState<Object, IView>> lockStates = lockManager.lock2(type, transaction,
-              Collections.singleton(target), 0);
-          postCommitLockState = lockStates.get(0);
+          lockManager.lock2(type, transaction, Collections.singleton(target), 0);
         }
       }
-
-      if (postCommitLockState != null)
-      {
-        postCommitLockStates.add(postCommitLockState);
-      }
-    }
-  }
-
-  protected void autoReleaseExplicitLocks() throws InterruptedException
-  {
-    List<Object> targets = new ArrayList<Object>();
-
-    // Release locks that have been sent from the client.
-    for (CDOID id : idsToUnlock)
-    {
-      Object target = lockManager.getLockKey(id, branch);
-      targets.add(target);
-    }
-
-    // Release durable locks that have been acquired on detached objects.
-    for (CDOID id : detachedObjects)
-    {
-      Object target = lockManager.getLockKey(id, branch);
-      if (lockManager.hasLock(LockType.WRITE, transaction, target))
-      {
-        // We only need to consider detached objects that have been explicitly locked
-        targets.add(target);
-      }
-    }
-
-    try
-    {
-      RWOLockManager.setUnlockAll(true);
-
-      List<LockState<Object, IView>> lockStates = lockManager.unlock2(true, LockType.WRITE, transaction, targets,
-          false);
-      if (lockStates != null)
-      {
-        postCommitLockStates.addAll(lockStates);
-      }
-    }
-    finally
-    {
-      RWOLockManager.setUnlockAll(false);
     }
   }
 
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 2ddb48c..0151075 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
@@ -1022,6 +1022,13 @@
           throw new UnsupportedOperationException();
         }
 
+        public Collection<CDOLockState> getLocksOnNewObjects()
+        {
+          CDOLockState[] locksOnNewObjectsArr = WriteThroughCommitContext.this.getLocksOnNewObjects();
+          Collection<CDOLockState> locksOnNewObjects = Arrays.asList(locksOnNewObjectsArr);
+          return locksOnNewObjects;
+        }
+
         public Collection<CDOLob<?>> getLobs()
         {
           return Collections.emptySet(); // TODO (CD) Did we forget to support this earlier?
@@ -1067,24 +1074,11 @@
           return WriteThroughCommitContext.this.getUserID();
         }
 
-        @Deprecated
         public boolean isAutoReleaseLocks()
         {
           return WriteThroughCommitContext.this.isAutoReleaseLocksEnabled();
         }
 
-        public Collection<CDOLockState> getLocksOnNewObjects()
-        {
-          CDOLockState[] locksOnNewObjectsArray = WriteThroughCommitContext.this.getLocksOnNewObjects();
-          return Arrays.asList(locksOnNewObjectsArray);
-        }
-
-        public Collection<CDOID> getIDsToUnlock()
-        {
-          CDOID[] idsToUnlockArray = WriteThroughCommitContext.this.getIDsToUnlock();
-          return Arrays.asList(idsToUnlockArray);
-        }
-
         public String getCommitComment()
         {
           return WriteThroughCommitContext.this.getCommitComment();
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
index 1d4f132..332a01f 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
@@ -312,6 +312,11 @@
     public long getLastUpdateTime();
 
     /**
+     * @since 3.0
+     */
+    public boolean isAutoReleaseLocksEnabled();
+
+    /**
      * Returns the temporary, transactional package manager associated with the commit operation represented by this
      * <code>CommitContext</code>. In addition to the packages registered with the session this package manager also
      * contains the new packages that are part of this commit operation.
@@ -345,6 +350,14 @@
     public InternalCDOPackageUnit[] getNewPackageUnits();
 
     /**
+     * Returns an array of the locks on the new objects that are part of the commit operation represented by this
+     * <code>CommitContext</code>.
+     *
+     * @since 4.1
+     */
+    public CDOLockState[] getLocksOnNewObjects();
+
+    /**
      * Returns an array of the new objects that are part of the commit operation represented by this
      * <code>CommitContext</code>.
      */
@@ -407,27 +420,6 @@
     public ExtendedDataInputStream getLobs();
 
     /**
-     *
-     * @since 3.0
-     * @deprecated As of 4.5 no longer supported. See {@link #getIDsToUnlock()}.
-     */
-    @Deprecated
-    public boolean isAutoReleaseLocksEnabled();
-
-    /**
-     * Returns an array of the locks on the new objects that are part of the commit operation represented by this
-     * <code>CommitContext</code>.
-     *
-     * @since 4.1
-     */
-    public CDOLockState[] getLocksOnNewObjects();
-
-    /**
-     * @since 4.6
-     */
-    public CDOID[] getIDsToUnlock();
-
-    /**
      * Returns an unmodifiable map from all temporary IDs to their persistent counter parts.
      */
     public Map<CDOID, CDOID> getIDMappings();
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
index fd885b8..786f3af 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
@@ -118,6 +118,11 @@
 
   public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits);
 
+  /**
+   * @since 4.1
+   */
+  public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects);
+
   public void setNewObjects(InternalCDORevision[] newObjects);
 
   public void setDirtyObjectDeltas(InternalCDORevisionDelta[] dirtyObjectDeltas);
@@ -139,23 +144,9 @@
    */
   public void setLastUpdateTime(long lastUpdateTime);
 
-  /**
-   * @deprecated As of 4.5 no longer supported. See {@link #setIDsToUnlock(CDOID[])}.
-   */
-  @Deprecated
   public void setAutoReleaseLocksEnabled(boolean on);
 
   /**
-   * @since 4.1
-   */
-  public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects);
-
-  /**
-   * @since 4.6
-   */
-  public void setIDsToUnlock(CDOID[] idsToUnlock);
-
-  /**
    * @since 4.5
    */
   public void setCommitNumber(int commitNumber);
diff --git a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
index 79959cf..51fdfbf 100644
--- a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.tests;singleton:=true
-Bundle-Version: 4.0.600.qualifier
+Bundle-Version: 4.0.500.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -47,18 +47,18 @@
  interface_;version="4.0.200",
  interface_.impl;version="4.0.200",
  interface_.util;version="4.0.200",
- org.eclipse.emf.cdo.tests;version="4.0.600",
- org.eclipse.emf.cdo.tests.bugzilla;version="4.0.600",
- org.eclipse.emf.cdo.tests.bundle;version="4.0.600";x-internal:=true,
- org.eclipse.emf.cdo.tests.config;version="4.0.600",
- org.eclipse.emf.cdo.tests.config.impl;version="4.0.600",
- org.eclipse.emf.cdo.tests.defs;version="4.0.600",
- org.eclipse.emf.cdo.tests.extra;version="4.0.600",
- org.eclipse.emf.cdo.tests.offline;version="4.0.600",
- org.eclipse.emf.cdo.tests.performance;version="4.0.600",
- org.eclipse.emf.cdo.tests.performance.framework;version="4.0.600",
- org.eclipse.emf.cdo.tests.revisioncache;version="4.0.600",
- org.eclipse.emf.cdo.tests.util;version="4.0.600",
+ org.eclipse.emf.cdo.tests;version="4.0.500",
+ org.eclipse.emf.cdo.tests.bugzilla;version="4.0.500",
+ org.eclipse.emf.cdo.tests.bundle;version="4.0.500";x-internal:=true,
+ org.eclipse.emf.cdo.tests.config;version="4.0.500",
+ org.eclipse.emf.cdo.tests.config.impl;version="4.0.500",
+ org.eclipse.emf.cdo.tests.defs;version="4.0.500",
+ org.eclipse.emf.cdo.tests.extra;version="4.0.500",
+ org.eclipse.emf.cdo.tests.offline;version="4.0.500",
+ org.eclipse.emf.cdo.tests.performance;version="4.0.500",
+ org.eclipse.emf.cdo.tests.performance.framework;version="4.0.500",
+ org.eclipse.emf.cdo.tests.revisioncache;version="4.0.500",
+ org.eclipse.emf.cdo.tests.util;version="4.0.500",
  reference;version="4.0.200",
  reference.impl;version="4.0.200";
   x-friends:="org.eclipse.emf.cdo.dawn.tests,
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java
index 775239a..0746b51 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java
@@ -1255,7 +1255,7 @@
     assertEquals(false, CDOUtil.getCDOObject(category2).cdoWriteLock().isLocked()); // Implicit locks always released
   }
 
-  public void testAutoReleaseExplicitLocks() throws Exception
+  public void testAutoReleaseLocksOnChangedObject() throws Exception
   {
     Company company = getModel1Factory().createCompany();
 
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java
index c484fbc..d5a46ec 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingNotificationsTest.java
@@ -309,10 +309,8 @@
 
     CDOTransaction tx1 = session1.openTransaction();
     tx1.options().setAutoReleaseLocksEnabled(true);
-
     CDOResource res1 = tx1.getOrCreateResource(getResourcePath("r1"));
     res1.getContents().clear();
-
     Company company = getModel1Factory().createCompany();
     res1.getContents().add(company);
     tx1.commit();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java
index 6721079..bdebdba 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java
@@ -63,14 +63,6 @@
 
   private static final char[] PASSWORD2 = "invalid".toCharArray(); //$NON-NLS-1$
 
-  @Override
-  public void setUp() throws Exception
-  {
-    super.setUp();
-    enableConsole();
-
-  }
-
   public void testIsSupportingAudits() throws Exception
   {
     CDOSession session = openSession();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java
deleted file mode 100644
index fad9c66..0000000
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355045_Test.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Esteban Dugueperoux - initial API and implementation
- */
-package org.eclipse.emf.cdo.tests.bugzilla;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.CDOState;
-import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
-import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.session.CDOSession;
-import org.eclipse.emf.cdo.tests.AbstractCDOTest;
-import org.eclipse.emf.cdo.tests.model1.Category;
-import org.eclipse.emf.cdo.tests.model1.Company;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CDOUtil;
-
-import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
-
-import org.junit.Assert;
-
-import java.util.Collections;
-
-/**
- * @author Esteban Dugueperoux
- */
-public class Bugzilla_355045_Test extends AbstractCDOTest
-{
-  private static final String RESOURCE_PATH = "/test1";
-
-  private CDOTransaction transaction;
-
-  private Company company;
-
-  private Category category1;
-
-  @Override
-  public void setUp() throws Exception
-  {
-    super.setUp();
-    CDOSession cdoSession = openSession();
-    cdoSession.options().setLockNotificationMode(LockNotificationMode.ALWAYS);
-    transaction = cdoSession.openTransaction();
-    // cdoTransaction.options().setAutoReleaseLocksEnabled(false);
-    CDOResource cdoResource = transaction.createResource(getResourcePath(RESOURCE_PATH));
-
-    company = getModel1Factory().createCompany();
-    category1 = getModel1Factory().createCategory();
-    company.getCategories().add(category1);
-
-    cdoResource.getContents().add(company);
-    cdoResource.save(Collections.emptyMap());
-  }
-
-  public void testLockOnCommitOfSingleNewObject() throws Exception
-  {
-    Category category2 = getModel1Factory().createCategory();
-    category2.setName("category2");
-    category1.getCategories().add(category2);
-
-    transaction.lockObjects(CDOUtil.getCDOObjects(category2), LockType.WRITE, DEFAULT_TIMEOUT);
-    transaction.options().addAutoReleaseLocksExemptions(true, category2);
-    assertLockStatus(category2, true, false);
-
-    transaction.commit();
-    assertEquals(CDOState.CLEAN, CDOUtil.getCDOObject(category2).cdoState());
-    assertLockStatus(category2, true, false);
-  }
-
-  public void testRecursiveLockOnCommitOfNewObjectsTree() throws Exception
-  {
-    Category category2 = getModel1Factory().createCategory();
-    category2.setName("category2");
-    Category category4 = getModel1Factory().createCategory();
-    category4.setName("category4");
-    Category category5 = getModel1Factory().createCategory();
-    category5.setName("category5");
-    Category category6 = getModel1Factory().createCategory();
-    category6.setName("category6");
-    Category category7 = getModel1Factory().createCategory();
-    category7.setName("category7");
-
-    category2.getCategories().add(category4);
-    category2.getCategories().add(category5);
-    category4.getCategories().add(category6);
-    category5.getCategories().add(category7);
-    category1.getCategories().add(category2);
-
-    Category category3 = getModel1Factory().createCategory();
-    category3.setName("category3");
-    Category category8 = getModel1Factory().createCategory();
-    category8.setName("category8");
-    Category category9 = getModel1Factory().createCategory();
-    category9.setName("category9");
-    Category category10 = getModel1Factory().createCategory();
-    category10.setName("category10");
-    Category category11 = getModel1Factory().createCategory();
-    category11.setName("category11");
-
-    category3.getCategories().add(category8);
-    category3.getCategories().add(category9);
-    category8.getCategories().add(category10);
-    category9.getCategories().add(category11);
-    category1.getCategories().add(category3);
-
-    transaction.lockObjects(CDOUtil.getCDOObjects(category2), LockType.WRITE, DEFAULT_TIMEOUT, true);
-    transaction.options().addAutoReleaseLocksExemptions(true, category2);
-
-    assertLockStatus(category1, false, false);
-    assertLockStatus(category2, true, true);
-    assertLockStatus(category3, false, true);
-
-    transaction.lockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE, DEFAULT_TIMEOUT, true);
-    transaction.options().addAutoReleaseLocksExemptions(true, category3);
-
-    assertLockStatus(category1, false, false);
-    assertLockStatus(category2, true, true);
-    assertLockStatus(category3, true, true);
-
-    transaction.unlockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE);
-
-    assertLockStatus(category1, false, false);
-    assertLockStatus(category2, true, true);
-    assertLockStatus(category3, false, false);
-    assertLockStatus(category8, true, true);
-    assertLockStatus(category9, true, true);
-
-    transaction.commit();
-
-    assertLockStatus(category1, false, false);
-    assertLockStatus(category2, true, true);
-    assertLockStatus(category3, false, false);
-    assertLockStatus(category8, true, true);
-    assertLockStatus(category9, true, true);
-  }
-
-  public void testRecursiveLockOfObjectsTreeContainingASubTreeOfNewObjects() throws Exception
-  {
-    Category category2 = getModel1Factory().createCategory();
-    category2.setName("category2");
-    Category category4 = getModel1Factory().createCategory();
-    category4.setName("category4");
-    Category category5 = getModel1Factory().createCategory();
-    category5.setName("category5");
-    Category category6 = getModel1Factory().createCategory();
-    category6.setName("category6");
-    Category category7 = getModel1Factory().createCategory();
-    category7.setName("category7");
-
-    category2.getCategories().add(category4);
-    category2.getCategories().add(category5);
-    category4.getCategories().add(category6);
-    category5.getCategories().add(category7);
-    category1.getCategories().add(category2);
-
-    Category category3 = getModel1Factory().createCategory();
-    category3.setName("category3");
-    Category category8 = getModel1Factory().createCategory();
-    category8.setName("category8");
-    Category category9 = getModel1Factory().createCategory();
-    category9.setName("category9");
-    Category category10 = getModel1Factory().createCategory();
-    category10.setName("category10");
-    Category category11 = getModel1Factory().createCategory();
-    category11.setName("category11");
-
-    category3.getCategories().add(category8);
-    category3.getCategories().add(category9);
-    category8.getCategories().add(category10);
-    category9.getCategories().add(category11);
-    category1.getCategories().add(category3);
-
-    transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true);
-    transaction.options().addAutoReleaseLocksExemptions(false, category1);
-    assertLockStatus(category1, true, false);
-
-    transaction.commit();
-    assertLockStatus(category1, true, false);
-  }
-
-  private void assertLockStatus(Category category, boolean lockedByMe, boolean recursive)
-  {
-    CDOObject categoryCDOObject = CDOUtil.getCDOObject(category);
-    CDOLockState cdoLockState = categoryCDOObject.cdoLockState();
-    Assert.assertEquals(
-        "new object " + category.getName()
-            + (lockedByMe ? " should be locally locked" : " shouldn't be locally locked"),
-        lockedByMe, cdoLockState.isLocked(LockType.WRITE, transaction, false));
-
-    if (recursive)
-    {
-      for (Category subCategory : category.getCategories())
-      {
-        assertLockStatus(subCategory, lockedByMe, recursive);
-      }
-    }
-  }
-}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java
deleted file mode 100644
index 2a93570..0000000
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Esteban Dugueperoux - initial API and implementation
- */
-package org.eclipse.emf.cdo.tests.bugzilla;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
-import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.session.CDOSession;
-import org.eclipse.emf.cdo.tests.AbstractCDOTest;
-import org.eclipse.emf.cdo.tests.model1.Category;
-import org.eclipse.emf.cdo.tests.model1.Company;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CDOUtil;
-
-import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
-import org.eclipse.net4j.util.io.IOUtil;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Esteban Dugueperoux
- */
-public class Bugzilla_387563_Test extends AbstractCDOTest
-{
-  private CDOTransaction transaction;
-
-  private Company company;
-
-  private Category category1;
-
-  private Category category2;
-
-  private Category category3;
-
-  private Category category4;
-
-  private Category category5;
-
-  @Override
-  protected void doSetUp() throws Exception
-  {
-    super.doSetUp();
-
-    CDOSession session = openSession();
-    session.options().setLockNotificationMode(LockNotificationMode.ALWAYS);
-
-    transaction = session.openTransaction();
-    // transaction.options().setAutoReleaseLocksEnabled(false);
-
-    CDOResource resource = transaction.createResource(getResourcePath("test1"));
-
-    category1 = getModel1Factory().createCategory();
-    category1.setName("category1");
-
-    category2 = getModel1Factory().createCategory();
-    category2.setName("category2");
-
-    category3 = getModel1Factory().createCategory();
-    category3.setName("category3");
-
-    category4 = getModel1Factory().createCategory();
-    category4.setName("category4");
-
-    category5 = getModel1Factory().createCategory();
-    category5.setName("category5");
-
-    Category category6 = getModel1Factory().createCategory();
-    category6.setName("category6");
-
-    Category category7 = getModel1Factory().createCategory();
-    category7.setName("category7");
-
-    Category category8 = getModel1Factory().createCategory();
-    category8.setName("category8");
-
-    Category category9 = getModel1Factory().createCategory();
-    category9.setName("category9");
-
-    Category category10 = getModel1Factory().createCategory();
-    category10.setName("category10");
-
-    Category category11 = getModel1Factory().createCategory();
-    category11.setName("category11");
-
-    category1.getCategories().add(category2);
-    category1.getCategories().add(category3);
-    category2.getCategories().add(category4);
-    category2.getCategories().add(category5);
-    category3.getCategories().add(category8);
-    category3.getCategories().add(category9);
-    category4.getCategories().add(category6);
-    category5.getCategories().add(category7);
-    category8.getCategories().add(category10);
-    category9.getCategories().add(category11);
-
-    company = getModel1Factory().createCompany();
-    company.getCategories().add(category1);
-
-    resource.getContents().add(company);
-
-    log("", Collections.singletonList(category1));
-  }
-
-  public void testPartialLockOnCommit() throws Exception
-  {
-    transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true);
-
-    // Mark all objects to stay locked on commit
-    transaction.options().addAutoReleaseLocksExemptions(true, category1);
-    assertLockStatus(category1, true, true);
-
-    // Mark category2 to be unlocked on commit
-    transaction.options().removeAutoReleaseLocksExemptions(false, category2);
-    assertLockStatus(category1, true, true);
-
-    // Mark category3 and its descendants to be unlocked on commit
-    transaction.options().removeAutoReleaseLocksExemptions(true, category3);
-    assertLockStatus(category1, true, true);
-
-    transaction.commit();
-    assertLockStatus(category1, true, false);
-    assertLockStatus(category2, false, false);
-    assertLockStatus(category3, false, true);
-    assertLockStatus(category4, true, true);
-    assertLockStatus(category5, true, true);
-  }
-
-  public void testPartialUnlockOnCommit() throws Exception
-  {
-    transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true);
-
-    // Mark category1 and its descendants to stay locked on commit
-    transaction.options().addAutoReleaseLocksExemptions(true, category1);
-    assertLockStatus(category1, true, true);
-
-    transaction.unlockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE, true);
-    assertLockStatus(category3, false, true);
-
-    transaction.commit();
-    assertLockStatus(category1, true, false);
-    assertLockStatus(category2, true, true);
-    assertLockStatus(category3, false, true);
-  }
-
-  private static void assertLockStatus(Category category, boolean expected, boolean recursive)
-  {
-    CDOObject cdoObject = CDOUtil.getCDOObject(category);
-    CDOLockState lockState = cdoObject.cdoLockState();
-
-    assertEquals(
-        "new object " + category.getName() + (expected ? " should be locally locked" : " shouldn't be locally locked."),
-        expected, lockState.isLocked(LockType.WRITE, cdoObject.cdoView(), false));
-
-    if (recursive)
-    {
-      for (Category subCategory : category.getCategories())
-      {
-        assertLockStatus(subCategory, expected, recursive);
-      }
-    }
-  }
-
-  private static void log(String indent, List<Category> categories)
-  {
-    for (Category category : categories)
-    {
-      IOUtil.OUT().println(indent + category.getName() + " --> " + CDOUtil.getCDOObject(category).cdoID());
-      log(indent + "   ", category.getCategories());
-    }
-  }
-}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java
deleted file mode 100644
index 31baf15..0000000
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563b_Test.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.tests.bugzilla;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.session.CDOSession;
-import org.eclipse.emf.cdo.tests.AbstractLockingTest;
-import org.eclipse.emf.cdo.tests.model1.Company;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CDOUtil;
-
-/**
- * @author Eike Stepper
- */
-public class Bugzilla_387563b_Test extends AbstractLockingTest
-{
-  public void testNoImplicitLockingOfNewObject() throws Exception
-  {
-    Company company = getModel1Factory().createCompany();
-
-    CDOSession session = openSession();
-    CDOTransaction transaction = session.openTransaction();
-    transaction.options().setAutoReleaseLocksEnabled(true);
-
-    CDOResource resource = transaction.createResource(getResourcePath("test1"));
-    resource.getContents().add(company);
-
-    CDOObject cdoObject = CDOUtil.getCDOObject(company);
-    CDOLockState lockState = cdoObject.cdoLockState();
-    assertNull(lockState.getWriteLockOwner());
-
-    transaction.commit();
-    assertWriteLock(false, company);
-  }
-
-  public void testExplicitLockingOfNewObject() throws Exception
-  {
-    Company company = getModel1Factory().createCompany();
-
-    CDOSession session = openSession();
-    CDOTransaction transaction = session.openTransaction();
-    transaction.options().setAutoReleaseLocksEnabled(true);
-
-    CDOResource resource = transaction.createResource(getResourcePath("test1"));
-    resource.getContents().add(company);
-
-    CDOObject cdoObject = CDOUtil.getCDOObject(company);
-    cdoObject.cdoWriteLock().lock();
-
-    CDOLockState lockState = cdoObject.cdoLockState();
-    assertEquals(transaction, lockState.getWriteLockOwner());
-
-    transaction.commit();
-    assertWriteLock(false, company);
-  }
-
-  public void testExplicitLockingOfNewObjectExemption() throws Exception
-  {
-    Company company = getModel1Factory().createCompany();
-
-    CDOSession session = openSession();
-    CDOTransaction transaction = session.openTransaction();
-    transaction.options().setAutoReleaseLocksEnabled(true);
-    transaction.options().addAutoReleaseLocksExemptions(false, company);
-
-    CDOResource resource = transaction.createResource(getResourcePath("test1"));
-    resource.getContents().add(company);
-
-    CDOObject cdoObject = CDOUtil.getCDOObject(company);
-    cdoObject.cdoWriteLock().lock();
-
-    CDOLockState lockState = cdoObject.cdoLockState();
-    assertEquals(transaction, lockState.getWriteLockOwner());
-
-    transaction.commit();
-    assertWriteLock(true, company);
-  }
-
-  public void testExplicitLockingAndUnlockingOfNewObject() throws Exception
-  {
-    Company company = getModel1Factory().createCompany();
-
-    CDOSession session = openSession();
-    CDOTransaction transaction = session.openTransaction();
-    transaction.options().setAutoReleaseLocksEnabled(true);
-    transaction.options().addAutoReleaseLocksExemptions(false, company);
-
-    CDOResource resource = transaction.createResource(getResourcePath("test1"));
-    resource.getContents().add(company);
-
-    CDOObject cdoObject = CDOUtil.getCDOObject(company);
-    cdoObject.cdoWriteLock().lock();
-
-    CDOLockState lockState = cdoObject.cdoLockState();
-    assertEquals(transaction, lockState.getWriteLockOwner());
-
-    cdoObject.cdoWriteLock().unlock();
-    lockState = cdoObject.cdoLockState();
-    assertNull(lockState.getWriteLockOwner());
-
-    transaction.commit();
-    assertWriteLock(false, company);
-  }
-}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java
index a6fcb01..0957d57 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_466951_Test.java
@@ -28,6 +28,8 @@
 
 import org.eclipse.emf.ecore.util.EcoreUtil;
 
+import org.junit.Assert;
+
 import java.util.Collections;
 
 /**
@@ -54,78 +56,77 @@
 
     ISignalProtocol<?> protocol = ((org.eclipse.emf.cdo.net4j.CDONet4jSession)session1).options().getNet4jProtocol();
     SignalCounter signalCounter = new SignalCounter(protocol);
+    int nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class);
+    assertEquals(0, nbLockStateRequest);
 
-    try
+    CDOObject companyCDOObject = CDOUtil.getCDOObject(company);
+    CDOLockState lockState = companyCDOObject.cdoLockState();
+    Object expectedLockedObject = companyCDOObject.cdoID();
+    if (session1.getRepositoryInfo().isSupportingBranches())
     {
-      assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class));
-
-      CDOObject companyCDOObject = CDOUtil.getCDOObject(company);
-      CDOLockState lockState = companyCDOObject.cdoLockState();
-      Object expectedLockedObject = companyCDOObject.cdoID();
-      if (session1.getRepositoryInfo().isSupportingBranches())
-      {
-        expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch());
-      }
-
-      assertEquals(expectedLockedObject, lockState.getLockedObject());
-      assertTrue(lockState.getReadLockOwners().isEmpty());
-      assertNull(lockState.getWriteLockOwner());
-      assertNull(lockState.getWriteOptionOwner());
-
-      transaction1.lockObjects(Collections.singleton(companyCDOObject), LockType.WRITE, -1);
-
-      lockState = companyCDOObject.cdoLockState();
-      expectedLockedObject = companyCDOObject.cdoID();
-      if (session1.getRepositoryInfo().isSupportingBranches())
-      {
-        expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch());
-      }
-
-      assertEquals(expectedLockedObject, lockState.getLockedObject());
-      assertTrue(lockState.getReadLockOwners().isEmpty());
-      assertEquals(transaction1, lockState.getWriteLockOwner());
-      assertNull(lockState.getWriteOptionOwner());
-
-      EcoreUtil.delete(company);
-      assertEquals(CDOState.TRANSIENT, companyCDOObject.cdoState());
-      lockState = companyCDOObject.cdoLockState();
-      assertNull(lockState);
-
-      Company company2 = getModel1Factory().createCompany();
-      resource1.getContents().add(company2);
-
-      CDOObject companyCDOObject2 = CDOUtil.getCDOObject(company2);
-      lockState = companyCDOObject2.cdoLockState();
-      expectedLockedObject = companyCDOObject2.cdoID();
-      if (session1.getRepositoryInfo().isSupportingBranches())
-      {
-        expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch());
-      }
-
-      assertEquals(expectedLockedObject, lockState.getLockedObject());
-      assertTrue(lockState.getReadLockOwners().isEmpty());
-      assertNull(lockState.getWriteLockOwner());
-      assertNull(lockState.getWriteOptionOwner());
-      assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class));
-
-      transaction1.commit();
-
-      lockState = companyCDOObject2.cdoLockState();
-      expectedLockedObject = companyCDOObject2.cdoID();
-      if (session1.getRepositoryInfo().isSupportingBranches())
-      {
-        expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch());
-      }
-
-      assertEquals(expectedLockedObject, lockState.getLockedObject());
-      assertTrue(lockState.getReadLockOwners().isEmpty());
-      assertNull(lockState.getWriteLockOwner());
-      assertNull(lockState.getWriteOptionOwner());
-      assertEquals(0, signalCounter.removeCountFor(LockStateRequest.class));
+      expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch());
     }
-    finally
+
+    assertEquals(expectedLockedObject, lockState.getLockedObject());
+    Assert.assertTrue(lockState.getReadLockOwners().isEmpty());
+    assertNull(lockState.getWriteLockOwner());
+    assertNull(lockState.getWriteOptionOwner());
+
+    transaction1.lockObjects(Collections.singleton(companyCDOObject), LockType.WRITE, -1);
+
+    lockState = companyCDOObject.cdoLockState();
+    expectedLockedObject = companyCDOObject.cdoID();
+    if (session1.getRepositoryInfo().isSupportingBranches())
     {
-      signalCounter.dispose();
+      expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject.cdoID(), transaction1.getBranch());
     }
+
+    assertEquals(expectedLockedObject, lockState.getLockedObject());
+    Assert.assertTrue(lockState.getReadLockOwners().isEmpty());
+    assertEquals(transaction1, lockState.getWriteLockOwner());
+    assertNull(lockState.getWriteOptionOwner());
+
+    EcoreUtil.delete(company);
+    assertEquals(CDOState.TRANSIENT, companyCDOObject.cdoState());
+    lockState = companyCDOObject.cdoLockState();
+    assertNull(lockState);
+
+    Company company2 = getModel1Factory().createCompany();
+    resource1.getContents().add(company2);
+
+    CDOObject companyCDOObject2 = CDOUtil.getCDOObject(company2);
+    lockState = companyCDOObject2.cdoLockState();
+    expectedLockedObject = companyCDOObject2.cdoID();
+    if (session1.getRepositoryInfo().isSupportingBranches())
+    {
+      expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch());
+    }
+
+    assertEquals(expectedLockedObject, lockState.getLockedObject());
+    Assert.assertTrue(lockState.getReadLockOwners().isEmpty());
+    assertNull(lockState.getWriteLockOwner());
+    assertNull(lockState.getWriteOptionOwner());
+
+    nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class);
+    assertEquals(0, nbLockStateRequest);
+
+    transaction1.commit();
+
+    lockState = companyCDOObject2.cdoLockState();
+    expectedLockedObject = companyCDOObject2.cdoID();
+    if (session1.getRepositoryInfo().isSupportingBranches())
+    {
+      expectedLockedObject = CDOIDUtil.createIDAndBranch(companyCDOObject2.cdoID(), transaction1.getBranch());
+    }
+
+    assertEquals(expectedLockedObject, lockState.getLockedObject());
+    Assert.assertTrue(lockState.getReadLockOwners().isEmpty());
+    assertNull(lockState.getWriteLockOwner());
+    assertNull(lockState.getWriteOptionOwner());
+
+    nbLockStateRequest = signalCounter.getCountFor(LockStateRequest.class);
+    assertEquals(0, nbLockStateRequest);
+
+    protocol.removeListener(signalCounter);
   }
 }
diff --git a/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF
index 575ed4c..fc258b6 100644
--- a/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.cdo.ui;singleton:=true
-Bundle-Version: 4.5.100.qualifier
+Bundle-Version: 4.5.0.qualifier
 Bundle-Activator: org.eclipse.emf.cdo.internal.ui.bundle.OM$Activator
 Bundle-Vendor: %providerName
 Bundle-ClassPath: .
@@ -27,7 +27,7 @@
  org.eclipse.emf.ecp.edit;bundle-version="[1.5.0,2.0.0)";resolution:=optional,
  org.eclipse.emf.ecp.edit.swt;bundle-version="[1.5.0,2.0.0)";resolution:=optional,
  org.eclipse.emf.ecp.ui.view.swt;bundle-version="[1.5.0,2.0.0)";resolution:=optional
-Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.100";
+Export-Package: org.eclipse.emf.cdo.internal.ui;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -37,7 +37,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.actions;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.actions;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -47,7 +47,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.handlers;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.handlers;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -57,9 +57,9 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.actions.delegates;version="4.5.100";x-internal:=true,
- org.eclipse.emf.cdo.internal.ui.bundle;version="4.5.100";x-internal:=true,
- org.eclipse.emf.cdo.internal.ui.dialogs;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.actions.delegates;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.ui.bundle;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.cdo.internal.ui.dialogs;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -69,7 +69,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.dnd;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.dnd;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -79,7 +79,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.editor;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.editor;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -89,7 +89,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.filters;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.filters;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -99,7 +99,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.history;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.history;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -109,7 +109,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.messages;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.messages;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -119,7 +119,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.perspectives;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.perspectives;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -129,7 +129,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.preferences;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.preferences;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -139,7 +139,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.transfer;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.transfer;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -149,7 +149,7 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.internal.ui.views;version="4.5.100";
+ org.eclipse.emf.cdo.internal.ui.views;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.ui.defs,
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.ui.location,
@@ -159,5 +159,5 @@
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.ui.team,
    org.eclipse.emf.cdo.ui.compare",
- org.eclipse.emf.cdo.ui;version="4.5.100",
- org.eclipse.emf.cdo.ui.widgets;version="4.5.100"
+ org.eclipse.emf.cdo.ui;version="4.5.0",
+ org.eclipse.emf.cdo.ui.widgets;version="4.5.0"
diff --git a/plugins/org.eclipse.emf.cdo.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
index cdd6485..3f9cb46 100644
--- a/plugins/org.eclipse.emf.cdo.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
@@ -411,6 +411,7 @@
                   </iterate>
                </with>
             </visibleWhen>
+
          </command>
          <command
                commandId="org.eclipse.emf.cdo.ui.UnlockObject"
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java
index 9966a07..0af9057 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AbstractLockObjectsAction.java
@@ -30,9 +30,7 @@
 
 /**
  * @author Simon McDuff
- * @deprecated As of 4.6 no longer supported.
  */
-@Deprecated
 public abstract class AbstractLockObjectsAction extends EditingDomainAction
 {
   private List<InternalCDOObject> objects = new ArrayList<InternalCDOObject>();
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java
deleted file mode 100644
index 794f1cf..0000000
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/AutoReleaseLockExemptionAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Eike Stepper - initial API and implementation
- */
-package org.eclipse.emf.cdo.internal.ui.actions;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.internal.ui.messages.Messages;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.util.CDOUtil;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * @author Eike Stepper
- */
-public class AutoReleaseLockExemptionAction extends EditingDomainAction
-{
-  public static final String ID = "AutoReleaseLockExemption"; //$NON-NLS-1$
-
-  private static final String TITLE = Messages.getString("AutoReleaseLockExemptionAction.1"); //$NON-NLS-1$
-
-  private CDOObject selectedObject;
-
-  public AutoReleaseLockExemptionAction()
-  {
-    super(TITLE);
-    setId(ID);
-  }
-
-  public void selectionChanged(IStructuredSelection selection)
-  {
-    selectedObject = null;
-
-    if (selection != null && selection.size() == 1)
-    {
-      Object element = selection.getFirstElement();
-      if (element instanceof EObject)
-      {
-        EObject object = (EObject)element;
-        selectedObject = CDOUtil.getCDOObject(object);
-      }
-    }
-  }
-
-  public boolean init()
-  {
-    if (selectedObject != null && selectedObject.cdoWriteLock().isLocked())
-    {
-      CDOTransaction transaction = (CDOTransaction)selectedObject.cdoView();
-      setChecked(transaction.options().isAutoReleaseLocksExemption(selectedObject));
-      return true;
-    }
-
-    return false;
-  }
-
-  @Override
-  public void update()
-  {
-    setEnabled(true);
-  }
-
-  @Override
-  protected void doRun(IProgressMonitor progressMonitor) throws Exception
-  {
-    if (selectedObject != null)
-    {
-      CDOTransaction transaction = (CDOTransaction)selectedObject.cdoView();
-      if (transaction.options().isAutoReleaseLocksExemption(selectedObject))
-      {
-        transaction.options().removeAutoReleaseLocksExemptions(false, selectedObject);
-      }
-      else
-      {
-        transaction.options().addAutoReleaseLocksExemptions(false, selectedObject);
-      }
-    }
-
-    update();
-  }
-}
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java
index ff5c911..b425969 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ChangePassiveUpdateAction.java
@@ -24,9 +24,7 @@
  * {@link CDOSession session}.
  *
  * @author Victor Roldan Betancort
- * @deprecated As of 4.6 no longer supported.
  */
-@Deprecated
 public class ChangePassiveUpdateAction extends EditingDomainAction
 {
   public static final String ID = "change-passiveupdate"; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java
index 707ccb2..b2be9b7 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/ReadLockObjectsAction.java
@@ -19,9 +19,7 @@
 
 /**
  * @author Simon McDuff
- * @deprecated As of 4.6 no longer supported.
  */
-@Deprecated
 public class ReadLockObjectsAction extends AbstractLockObjectsAction
 {
   public static final String ID = "readlock-objects"; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java
index 3f418f7..a96f147 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/actions/WriteLockObjectsAction.java
@@ -19,9 +19,7 @@
 
 /**
  * @author Simon McDuff
- * @deprecated As of 4.6 no longer supported.
  */
-@Deprecated
 public class WriteLockObjectsAction extends AbstractLockObjectsAction
 {
   public static final String ID = "writelock-objects"; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java
index 2e6e898..f5977d7 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java
@@ -12,8 +12,12 @@
 package org.eclipse.emf.cdo.internal.ui.editor;
 
 import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.internal.ui.actions.AutoReleaseLockExemptionAction;
+import org.eclipse.emf.cdo.internal.ui.actions.ChangePassiveUpdateAction;
 import org.eclipse.emf.cdo.internal.ui.actions.ImportRootsAction;
+import org.eclipse.emf.cdo.internal.ui.actions.ReadLockObjectsAction;
+import org.eclipse.emf.cdo.internal.ui.actions.WriteLockObjectsAction;
+import org.eclipse.emf.cdo.internal.ui.messages.Messages;
+import org.eclipse.emf.cdo.view.CDOView;
 
 import org.eclipse.emf.common.ui.viewer.IViewerProvider;
 import org.eclipse.emf.edit.domain.EditingDomain;
@@ -72,7 +76,17 @@
   /**
    * @ADDED
    */
-  protected AutoReleaseLockExemptionAction autoReleaseLockExemptionAction;
+  protected ReadLockObjectsAction readLockObjectsAction;
+
+  /**
+   * @ADDED
+   */
+  protected WriteLockObjectsAction writeLockObjectsAction;
+
+  /**
+   * @ADDED
+   */
+  protected ChangePassiveUpdateAction changePassiveUpdateAction;
 
   /**
    * This keeps track of the active editor.
@@ -182,7 +196,12 @@
     loadResourceAction.setId(LOAD_RESOURCE_ID);
 
     importRootsAction = new ImportRootsAction();
-    autoReleaseLockExemptionAction = new AutoReleaseLockExemptionAction();
+    importRootsAction.setId(ImportRootsAction.ID);
+
+    changePassiveUpdateAction = new ChangePassiveUpdateAction();
+
+    readLockObjectsAction = new ReadLockObjectsAction();
+    writeLockObjectsAction = new WriteLockObjectsAction();
 
     validateAction = new ValidateAction();
     controlAction = new ControlAction();
@@ -356,10 +375,18 @@
     ISelection selection = event.getSelection();
     if (selection instanceof IStructuredSelection)
     {
+      if (readLockObjectsAction != null)
+      {
+        readLockObjectsAction.selectionChanged((IStructuredSelection)selection);
+      }
+
+      if (writeLockObjectsAction != null)
+      {
+        writeLockObjectsAction.selectionChanged((IStructuredSelection)selection);
+      }
+
       if (((IStructuredSelection)selection).size() == 1)
       {
-        autoReleaseLockExemptionAction.selectionChanged((IStructuredSelection)selection);
-
         Object object = ((IStructuredSelection)selection).getFirstElement();
 
         EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
@@ -367,13 +394,16 @@
         newChildDescriptors = domain.getNewChildDescriptors(object, null);
         newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
 
-        if (object instanceof CDOResource)
+        if (importRootsAction != null)
         {
-          importRootsAction.setTargetResource((CDOResource)object);
-        }
-        else
-        {
-          importRootsAction.setTargetResource(null);
+          if (object instanceof CDOResource)
+          {
+            importRootsAction.setTargetResource((CDOResource)object);
+          }
+          else
+          {
+            importRootsAction.setTargetResource(null);
+          }
         }
       }
     }
@@ -548,21 +578,37 @@
     refreshViewerAction.setId(REFRESH_VIEWER_ID);
     menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$
 
-    if (autoReleaseLockExemptionAction.init())
-    {
-      menuManager.insertAfter("additions", autoReleaseLockExemptionAction); //$NON-NLS-1$
-      autoReleaseLockExemptionAction.update();
-    }
+    MenuManager lockingSubMenu = new MenuManager(Messages.getString("CDOActionBarContributor_0")); //$NON-NLS-1$
+    lockingSubMenu.add(new Separator("ui-actions")); //$NON-NLS-1$
+
+    lockingSubMenu.insertAfter("ui-actions", writeLockObjectsAction); //$NON-NLS-1$
+    writeLockObjectsAction.update();
+
+    lockingSubMenu.insertAfter("ui-actions", readLockObjectsAction); //$NON-NLS-1$
+    readLockObjectsAction.update();
+
+    menuManager.insertAfter("ui-actions", lockingSubMenu); //$NON-NLS-1$
+
+    menuManager.insertAfter("ui-actions", changePassiveUpdateAction); //$NON-NLS-1$
+    changePassiveUpdateAction.update();
+    changePassiveUpdateAction.setEnabled(true);
 
     super.addGlobalActions(menuManager);
 
     if (loadResourceAction != null)
     {
-      menuManager.insertAfter(loadResourceAction.getId(), importRootsAction);
+      if (importRootsAction != null)
+      {
+        menuManager.insertAfter(loadResourceAction.getId(), importRootsAction);
+      }
     }
     else
     {
-      menuManager.insertBefore("additions-end", importRootsAction); //$NON-NLS-1$
+      if (importRootsAction != null)
+      {
+        menuManager.insertBefore("additions-end", importRootsAction); //$NON-NLS-1$
+      }
+
       menuManager.insertBefore("additions-end", new Separator()); //$NON-NLS-1$
     }
   }
@@ -585,15 +631,28 @@
   @Override
   public void activate()
   {
-    importRootsAction.setActiveWorkbenchPart(activeEditor);
-    Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput();
-    if (input instanceof CDOResource)
+    if (importRootsAction != null)
     {
-      importRootsAction.setTargetResource((CDOResource)input);
+      importRootsAction.setActiveWorkbenchPart(activeEditor);
+      Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput();
+      if (input instanceof CDOResource)
+      {
+        importRootsAction.setTargetResource((CDOResource)input);
+      }
+      else
+      {
+        importRootsAction.setTargetResource(null);
+      }
     }
-    else
+
+    if (changePassiveUpdateAction != null)
     {
-      importRootsAction.setTargetResource(null);
+      Object input = ((CDOEditor)getActiveEditor()).getViewer().getInput();
+      if (input instanceof CDOResource)
+      {
+        CDOView view = ((CDOResource)input).cdoView();
+        changePassiveUpdateAction.setSession(view.getSession());
+      }
     }
 
     super.activate();
@@ -605,8 +664,11 @@
   @Override
   public void deactivate()
   {
-    importRootsAction.setActiveWorkbenchPart(null);
-    importRootsAction.setTargetResource(null);
+    if (importRootsAction != null)
+    {
+      importRootsAction.setActiveWorkbenchPart(null);
+      importRootsAction.setTargetResource(null);
+    }
 
     super.deactivate();
   }
@@ -618,6 +680,9 @@
   public void update()
   {
     super.update();
-    importRootsAction.update();
+    if (importRootsAction != null)
+    {
+      importRootsAction.update();
+    }
   }
 }
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties
index 0c5302e..6f4045e 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/messages/messages.properties
@@ -91,7 +91,6 @@
 CDOWatchListView.8=Reset Changes
 CDOWatchListView.9=Reset all change notifications from the selected subscriptions
 ChangePassiveUpdateAction.1=Passive Updates
-AutoReleaseLockExemptionAction.1=Auto Release Lock Exemption
 ChangePasswordAction_0=Change Password...
 ChangePasswordAction_1=Change the connected user's password
 CloseSessionAction.0=Close
diff --git a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
index 175d5a6..f2978ba 100644
--- a/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.emf.cdo; singleton:=true
-Bundle-Version: 4.6.0.qualifier
+Bundle-Version: 4.5.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -10,29 +10,29 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)";resolution:=optional,
  org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo;version="4.6.0",
- org.eclipse.emf.cdo.eresource;version="4.6.0",
- org.eclipse.emf.cdo.eresource.impl;version="4.6.0",
- org.eclipse.emf.cdo.eresource.util;version="4.6.0",
- org.eclipse.emf.cdo.eresource.validation;version="4.6.0",
- org.eclipse.emf.cdo.etypes;version="4.6.0",
- org.eclipse.emf.cdo.etypes.impl;version="4.6.0",
- org.eclipse.emf.cdo.etypes.util;version="4.6.0",
- org.eclipse.emf.cdo.session;version="4.6.0",
- org.eclipse.emf.cdo.session.remote;version="4.6.0",
- org.eclipse.emf.cdo.transaction;version="4.6.0",
- org.eclipse.emf.cdo.util;version="4.6.0",
- org.eclipse.emf.cdo.view;version="4.6.0",
- org.eclipse.emf.internal.cdo;version="4.6.0",
- org.eclipse.emf.internal.cdo.analyzer;version="4.6.0";
+Export-Package: org.eclipse.emf.cdo;version="4.5.0",
+ org.eclipse.emf.cdo.eresource;version="4.5.0",
+ org.eclipse.emf.cdo.eresource.impl;version="4.5.0",
+ org.eclipse.emf.cdo.eresource.util;version="4.5.0",
+ org.eclipse.emf.cdo.eresource.validation;version="4.5.0",
+ org.eclipse.emf.cdo.etypes;version="4.5.0",
+ org.eclipse.emf.cdo.etypes.impl;version="4.5.0",
+ org.eclipse.emf.cdo.etypes.util;version="4.5.0",
+ org.eclipse.emf.cdo.session;version="4.5.0",
+ org.eclipse.emf.cdo.session.remote;version="4.5.0",
+ org.eclipse.emf.cdo.transaction;version="4.5.0",
+ org.eclipse.emf.cdo.util;version="4.5.0",
+ org.eclipse.emf.cdo.view;version="4.5.0",
+ org.eclipse.emf.internal.cdo;version="4.5.0",
+ org.eclipse.emf.internal.cdo.analyzer;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.bundle;version="4.6.0";x-friends:="org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.messages;version="4.6.0";x-internal:=true,
- org.eclipse.emf.internal.cdo.object;version="4.6.0";
+ org.eclipse.emf.internal.cdo.bundle;version="4.5.0";x-friends:="org.eclipse.emf.cdo.ui",
+ org.eclipse.emf.internal.cdo.messages;version="4.5.0";x-internal:=true,
+ org.eclipse.emf.internal.cdo.object;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -42,14 +42,14 @@
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui,
    org.eclipse.emf.cdo.edit",
- org.eclipse.emf.internal.cdo.query;version="4.6.0";
+ org.eclipse.emf.internal.cdo.query;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.tests.objectivity",
- org.eclipse.emf.internal.cdo.session;version="4.6.0";
+ org.eclipse.emf.internal.cdo.session;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -60,26 +60,26 @@
    org.eclipse.emf.cdo.security.ui,
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.internal.cdo.session.remote;version="4.6.0";
+ org.eclipse.emf.internal.cdo.session.remote;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.transaction;version="4.6.0";
+ org.eclipse.emf.internal.cdo.transaction;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.internal.cdo.util;version="4.6.0";
+ org.eclipse.emf.internal.cdo.util;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
    org.eclipse.emf.cdo.defs,
    org.eclipse.emf.cdo.ui",
- org.eclipse.emf.internal.cdo.view;version="4.6.0";
+ org.eclipse.emf.internal.cdo.view;version="4.5.0";
   x-friends:="org.eclipse.emf.cdo.net4j,
    org.eclipse.emf.cdo.server,
    org.eclipse.emf.cdo.tests,
@@ -88,5 +88,5 @@
    org.eclipse.emf.cdo.ui.ide,
    org.eclipse.emf.cdo.explorer,
    org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.spi.cdo;version="4.6.0"
+ org.eclipse.emf.spi.cdo;version="4.5.0"
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.emf.cdo/plugin.xml b/plugins/org.eclipse.emf.cdo/plugin.xml
index c8289c2..454a816 100644
--- a/plugins/org.eclipse.emf.cdo/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo/plugin.xml
@@ -59,19 +59,19 @@
          id="org.eclipse.emf.cdo.view.properties"
          type="org.eclipse.emf.cdo.view.CDOView"
          namespace="org.eclipse.emf.cdo.view"
-         properties="open,viewID,branchName,branch,timeStamp,lastUpdateTime,rootResourcePermission,readOnly,dirty,durable,sessionID,userID,userAuthenticated,historical,autoReleaseLocks"
+         properties="open,viewID,branchName,branch,timeStamp,lastUpdateTime,readOnly,dirty,durable,sessionID,userID,userAuthenticated,historical"
          class="org.eclipse.emf.internal.cdo.view.ViewProperties$Tester"/>
       <propertyTester
          id="org.eclipse.emf.cdo.object.properties"
          type="org.eclipse.emf.ecore.EObject"
          namespace="org.eclipse.emf.cdo.object"
-         properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,autoReleaseLocksExemption,viewHistorical,uri"
+         properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,viewHistorical,uri"
          class="org.eclipse.emf.internal.cdo.object.ObjectProperties$Tester"/>
       <propertyTester
          id="org.eclipse.emf.cdo.object.properties"
          type="org.eclipse.emf.cdo.CDOElement"
          namespace="org.eclipse.emf.cdo.object"
-         properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,autoReleaseLocksExemption,viewHistorical,uri"
+         properties="isCDO,id,version,branch,state,transactional,readable,writable,writableContainer,container,children,permission,permissionContainer,readLocks,readLocked,readLockedByOthers,writeLock,writeLocked,writeLockedByOthers,writeOption,writeOptioned,writeOptionedByOthers,viewHistorical,uri"
          class="org.eclipse.emf.internal.cdo.object.ObjectProperties$ElementTester"/>
    </extension>
 
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java
index 7bada9a..4905d74 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOCommitContext.java
@@ -1,5 +1,5 @@
 /*
-  * Copyright (c) 2009-2012, 2014 Eike Stepper (Berlin, Germany) and others.
+ * Copyright (c) 2009-2012, 2014 Eike Stepper (Berlin, Germany) and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -55,6 +55,11 @@
   public CDOTransaction getTransaction();
 
   /**
+   * @since 4.1
+   */
+  public boolean isAutoReleaseLocks();
+
+  /**
    * @since 4.0
    */
   public boolean isPartialCommit();
@@ -75,6 +80,11 @@
   public List<CDOPackageUnit> getNewPackageUnits();
 
   /**
+   * @since 4.1
+   */
+  public Collection<CDOLockState> getLocksOnNewObjects();
+
+  /**
    * Returns a map of the new {@link CDOObject objects} that are to be committed with this commit context.
    */
   public Map<CDOID, CDOObject> getNewObjects();
@@ -98,21 +108,4 @@
    * @since 4.0
    */
   public Collection<CDOLob<?>> getLobs();
-
-  /**
-   * @since 4.1
-   * @deprecated As of 4.5 no longer supported. See {@link #getIDsToUnlock()}.
-   */
-  @Deprecated
-  public boolean isAutoReleaseLocks();
-
-  /**
-   * @since 4.1
-   */
-  public Collection<CDOLockState> getLocksOnNewObjects();
-
-  /**
-   * @since 4.6
-   */
-  public Collection<CDOID> getIDsToUnlock();
 }
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
index 2ed5ff4..95d4460 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOTransaction.java
@@ -292,93 +292,24 @@
     public void setStaleReferenceCleaner(CDOStaleReferenceCleaner staleReferenceCleaner);
 
     /**
-     * Returns <code>true</code> if locks in this transaction will be released when {@link CDOTransaction#commit()} or
-     * {@link CDOTransaction#rollback()} are called, <code>false</code> otherwise.
+     * Returns true if locks in this view will be removes when {@link CDOTransaction#commit()} or
+     * {@link CDOTransaction#rollback()} is called.
      * <p>
-     * The default value is <code>true</code>.
-     *
-     * @see #getAutoReleaseLocksExemptions()
+     * Default value is true.
      */
     public boolean isAutoReleaseLocksEnabled();
 
     /**
-     * Specifies whether locks in this transaction will be released when {@link CDOTransaction#commit()} or
-     * {@link CDOTransaction#rollback()} are called.
+     * Specifies whether locks in this view will be removed when {@link CDOTransaction#commit()} or
+     * {@link CDOTransaction#rollback()} is called.
      * <p>
-     * If set to <code>false</code> all locks will be kept when {@link CDOTransaction#commit()} or
-     * {@link CDOTransaction#rollback()} are called.
+     * If false all locks are kept.
      * <p>
-     * The default value is <code>true</code>.
-     *
-     * @see #getAutoReleaseLocksExemptions()
+     * Default value is true.
      */
     public void setAutoReleaseLocksEnabled(boolean on);
 
     /**
-     * Returns the set of {@link EObject objects} that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option.
-     * <p>
-     * That means:
-     * <p>
-     * <ul>
-     * <li> If {@link #isAutoReleaseLocksEnabled()} returns <code>true</code>, the locks on the objects in this set are <b>not</b> released
-     *      when {@link CDOTransaction#commit()} or {@link CDOTransaction#rollback()} are called.
-     * <li> If {@link #isAutoReleaseLocksEnabled()} returns <code>false</code>, the locks on the objects in this set <b>are</b> released nevertheless
-     *      when {@link CDOTransaction#commit()} or {@link CDOTransaction#rollback()} are called.
-     * </ul>
-     * <p>
-     * The returned set is unmodifiable. To modify the set use the {@link #clearAutoReleaseLocksExemptions() clearAutoReleaseLocksExemptions()},
-     * {@link #addAutoReleaseLocksExemptions(boolean, EObject...) addAutoReleaseLocksExemption()},
-     * and {@link #removeAutoReleaseLocksExemptions(boolean, EObject...) removeAutoReleaseLocksExemption()} methods.
-     * <p>
-     * <b>Implementation note</b>: This set stores weak references to the contained objects.
-     *
-     * @see #clearAutoReleaseLocksExemptions()
-     * @see #addAutoReleaseLocksExemptions(boolean, EObject...)
-     * @see #removeAutoReleaseLocksExemptions(boolean, EObject...)
-     * @since 4.6
-     */
-    public Set<? extends EObject> getAutoReleaseLocksExemptions();
-
-    /**
-     * Returns <code>true</code> if the given object is treated as an exemption to the {@link #isAutoReleaseLocksEnabled()} option,
-     * <code>false</code> otherwise.
-     *
-     * @see #getAutoReleaseLocksExemptions()
-     * @since 4.6
-     */
-    public boolean isAutoReleaseLocksExemption(EObject object);
-
-    /**
-     * Clears the set of {@link EObject objects} that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option.
-     *
-     * @see #getAutoReleaseLocksExemptions()
-     * @see #addAutoReleaseLocksExemptions(boolean, EObject...)
-     * @see #removeAutoReleaseLocksExemptions(boolean, EObject...)
-     * @since 4.6
-     */
-    public void clearAutoReleaseLocksExemptions();
-
-    /**
-     * Adds the given {@link EObject object} to the set of objects that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option.
-     *
-     * @see #getAutoReleaseLocksExemptions()
-     * @see #clearAutoReleaseLocksExemptions()
-     * @see #removeAutoReleaseLocksExemptions(boolean, EObject...)
-     * @since 4.6
-     */
-    public void addAutoReleaseLocksExemptions(boolean recursive, EObject... objects);
-
-    /**
-     * Removes the given {@link EObject object} from the set of objects that are to be treated as exemptions to the {@link #isAutoReleaseLocksEnabled()} option.
-     *
-     * @see #getAutoReleaseLocksExemptions()
-     * @see #clearAutoReleaseLocksExemptions()
-     * @see #addAutoReleaseLocksExemptions(boolean, EObject...)
-     * @since 4.6
-     */
-    public void removeAutoReleaseLocksExemptions(boolean recursive, EObject... objects);
-
-    /**
      * Returns the number of milliseconds to wait for the transaction update when {@link CDOTransaction#commit()} is called.
      * <p>
      * Default value is 10000.
@@ -436,8 +367,7 @@
 
     /**
      * An {@link IOptionsEvent options event} fired from transaction {@link CDOTransaction#options() options} when the
-     * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks enabled} or
-     * {@link Options#getAutoReleaseLocksExemptions() auto release locks exemptions} options have changed.
+     * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks} option has changed.
      *
      * @author Eike Stepper
      * @since 3.0
@@ -446,31 +376,6 @@
      */
     public interface AutoReleaseLocksEvent extends IOptionsEvent
     {
-      /**
-       * An {@link AutoReleaseLocksEvent auto release locks options event} fired from transaction {@link CDOTransaction#options() options} when the
-       * {@link Options#setAutoReleaseLocksEnabled(boolean) auto release locks enabled} option has changed.
-       *
-       * @author Eike Stepper
-       * @since 4.6
-       * @noextend This interface is not intended to be extended by clients.
-       * @noimplement This interface is not intended to be implemented by clients.
-       */
-      public interface AutoReleaseLocksEnabledEvent extends AutoReleaseLocksEvent
-      {
-      }
-
-      /**
-       * An {@link AutoReleaseLocksEvent auto release locks options event} fired from transaction {@link CDOTransaction#options() options} when the
-       * {@link Options#getAutoReleaseLocksExemptions() auto release locks exemptions} option has changed.
-       *
-       * @author Eike Stepper
-       * @since 4.6
-       * @noextend This interface is not intended to be extended by clients.
-       * @noimplement This interface is not intended to be implemented by clients.
-       */
-      public interface AutoReleaseLocksExemptionsEvent extends AutoReleaseLocksEvent
-      {
-      }
     }
 
     /**
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
index c6ec39b..41cd6b1 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
@@ -88,10 +88,8 @@
 import org.eclipse.emf.spi.cdo.InternalCDOObject;
 import org.eclipse.emf.spi.cdo.InternalCDOView;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.Lock;
 
@@ -594,20 +592,6 @@
   }
 
   /**
-   * @since 4.6
-   */
-  public static List<? extends CDOObject> getCDOObjects(EObject... objects)
-  {
-    List<CDOObject> result = new ArrayList<CDOObject>();
-    for (EObject object : objects)
-    {
-      result.add(getCDOObject(object));
-    }
-
-    return result;
-  }
-
-  /**
    * @since 4.4
    */
   public static boolean isCDOObject(EObject object)
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java
index ff9c2cf..2a6dc0f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java
@@ -1635,7 +1635,7 @@
    * @author Eike Stepper
    * @since 4.1
    */
-  private final class CDOStoreEcoreEMap extends EcoreEMap<Object, Object> implements InternalCDOLoadable
+  private final class CDOStoreEcoreEMap extends EcoreEMap<Object, Object>implements InternalCDOLoadable
   {
     private static final long serialVersionUID = 1L;
 
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java
index 2cd24d3..9f726b2 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/ObjectProperties.java
@@ -19,7 +19,6 @@
 import org.eclipse.emf.cdo.common.lock.CDOLockState;
 import org.eclipse.emf.cdo.common.revision.CDORevision;
 import org.eclipse.emf.cdo.common.security.CDOPermission;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
 import org.eclipse.emf.cdo.util.CDOUtil;
 import org.eclipse.emf.cdo.view.CDOView;
 
@@ -520,28 +519,6 @@
       }
     });
 
-    add(new Property<EObject>("autoReleaseLocksExemption")//$NON-NLS-1$
-    {
-      @Override
-      protected Object eval(EObject object)
-      {
-        CDOObject cdoObject = getCDOObject(object);
-        if (cdoObject == null)
-        {
-          return false;
-        }
-
-        CDOView view = cdoObject.cdoView();
-        if (view instanceof CDOTransaction)
-        {
-          CDOTransaction transaction = (CDOTransaction)view;
-          return transaction.options().isAutoReleaseLocksExemption(cdoObject);
-        }
-
-        return false;
-      }
-    });
-
     add(new Property<EObject>("viewHistorical") //$NON-NLS-1$
     {
       @Override
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 8c475d9..c80de5c 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
@@ -96,8 +96,6 @@
 import org.eclipse.emf.cdo.transaction.CDOSavepoint;
 import org.eclipse.emf.cdo.transaction.CDOStaleReferenceCleaner;
 import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.transaction.CDOTransaction.Options.AutoReleaseLocksEvent.AutoReleaseLocksEnabledEvent;
-import org.eclipse.emf.cdo.transaction.CDOTransaction.Options.AutoReleaseLocksEvent.AutoReleaseLocksExemptionsEvent;
 import org.eclipse.emf.cdo.transaction.CDOTransactionConflictEvent;
 import org.eclipse.emf.cdo.transaction.CDOTransactionFinishedEvent;
 import org.eclipse.emf.cdo.transaction.CDOTransactionHandler;
@@ -148,7 +146,6 @@
 
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
@@ -179,6 +176,7 @@
 import java.io.OutputStream;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -189,7 +187,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.WeakHashMap;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -3643,6 +3640,8 @@
 
     private CDOCommitData commitData;
 
+    private Collection<CDOLockState> locksOnNewObjects;
+
     private Map<CDOID, CDOObject> newObjects;
 
     private Map<CDOID, CDOObject> detachedObjects;
@@ -3653,10 +3652,6 @@
 
     private Map<ByteArrayWrapper, CDOLob<?>> lobs = new HashMap<ByteArrayWrapper, CDOLob<?>>();
 
-    private List<CDOLockState> locksOnNewObjects = new ArrayList<CDOLockState>();
-
-    private List<CDOID> idsToUnlock = new ArrayList<CDOID>();
-
     public CDOCommitContextImpl(InternalCDOTransaction transaction)
     {
       this.transaction = transaction;
@@ -3665,8 +3660,6 @@
 
     private void calculateCommitData()
     {
-      OptionsImpl options = (OptionsImpl)transaction.options();
-
       List<CDOPackageUnit> newPackageUnits = analyzeNewPackages();
 
       newObjects = filterCommittables(transaction.getNewObjects());
@@ -3674,15 +3667,6 @@
       for (CDOObject newObject : newObjects.values())
       {
         revisions.add(newObject.cdoRevision());
-
-        CDOLockState lockState = getLockState(newObject);
-        if (lockState != null)
-        {
-          if (!options.isEffectiveAutoReleaseLock(newObject))
-          {
-            locksOnNewObjects.add(lockState);
-          }
-        }
       }
 
       revisionDeltas = filterCommittables(transaction.getRevisionDeltas());
@@ -3716,16 +3700,8 @@
 
       dirtyObjects = filterCommittables(transaction.getDirtyObjects());
 
-      for (CDOObject lockedObject : getLockStates().keySet())
-      {
-        if (!FSMUtil.isTransient(lockedObject))
-        {
-          if (options.isEffectiveAutoReleaseLock(lockedObject))
-          {
-            idsToUnlock.add(lockedObject.cdoID());
-          }
-        }
-      }
+      CDOLockState[] locksOnNewObjectsArray = getLockStates(newObjects.keySet(), false);
+      locksOnNewObjects = Arrays.asList(locksOnNewObjectsArray);
 
       commitData = CDOCommitInfoUtil.createCommitData(newPackageUnits, revisions, deltas, detached);
     }
@@ -3781,6 +3757,11 @@
       return isPartialCommit;
     }
 
+    public boolean isAutoReleaseLocks()
+    {
+      return transaction.options().isAutoReleaseLocksEnabled();
+    }
+
     public String getCommitComment()
     {
       return transaction.getCommitComment();
@@ -3806,6 +3787,11 @@
       return commitData.getNewPackageUnits();
     }
 
+    public Collection<CDOLockState> getLocksOnNewObjects()
+    {
+      return locksOnNewObjects;
+    }
+
     public Map<CDOID, CDOObject> getDetachedObjects()
     {
       return detachedObjects;
@@ -3821,22 +3807,6 @@
       return lobs.values();
     }
 
-    @Deprecated
-    public boolean isAutoReleaseLocks()
-    {
-      return transaction.options().isAutoReleaseLocksEnabled();
-    }
-
-    public Collection<CDOLockState> getLocksOnNewObjects()
-    {
-      return locksOnNewObjects;
-    }
-
-    public List<CDOID> getIDsToUnlock()
-    {
-      return idsToUnlock;
-    }
-
     public void preCommit()
     {
       if (isDirty())
@@ -4021,26 +3991,10 @@
           fireEvent(new FinishedEvent(idMappings), listeners);
         }
 
-        Map<CDOObject, CDOLockState> lockStates = getLockStates();
-        if (!lockStates.isEmpty())
+        CDOLockState[] newLockStates = result.getNewLockStates();
+        if (newLockStates != null)
         {
-          List<CDOLockState> objectsToUnlock = new ArrayList<CDOLockState>();
-
-          for (Map.Entry<CDOObject, CDOLockState> entry : lockStates.entrySet())
-          {
-            CDOObject object = entry.getKey();
-            if (options().isEffectiveAutoReleaseLock(object))
-            {
-              InternalCDOLockState lockState = (InternalCDOLockState)entry.getValue();
-              lockState.updateFrom(InternalCDOLockState.UNLOCKED);
-
-              objectsToUnlock.add(lockState);
-            }
-          }
-
-          CDOLockState[] newLockStates = objectsToUnlock.toArray(new CDOLockState[objectsToUnlock.size()]);
-          notifyOtherViewsAboutLockChanges(CDOLockChangeInfo.Operation.UNLOCK, null, result.getTimeStamp(),
-              newLockStates);
+          updateAndNotifyLockStates(CDOLockChangeInfo.Operation.UNLOCK, null, result.getTimeStamp(), newLockStates);
         }
       }
       catch (RuntimeException ex)
@@ -4221,14 +4175,12 @@
   {
     private CDOUndoDetector undoDetector = DEFAULT_UNDO_DETECTOR;
 
-    private final List<CDOConflictResolver> conflictResolvers = new ArrayList<CDOConflictResolver>();
+    private List<CDOConflictResolver> conflictResolvers = new ArrayList<CDOConflictResolver>();
 
     private CDOStaleReferenceCleaner staleReferenceCleaner = CDOStaleReferenceCleaner.DEFAULT;
 
     private boolean autoReleaseLocksEnabled = true;
 
-    private final Map<EObject, Boolean> autoReleaseLocksExemptions = new WeakHashMap<EObject, Boolean>();
-
     private long commitInfoTimeout = DEFAULT_COMMIT_INFO_TIMEOUT;
 
     public OptionsImpl()
@@ -4462,7 +4414,7 @@
           if (autoReleaseLocksEnabled != on)
           {
             autoReleaseLocksEnabled = on;
-            event = new AutoReleaseLocksEnabledEventImpl();
+            event = new AutoReleaseLocksEventImpl();
           }
         }
         finally
@@ -4474,157 +4426,6 @@
       fireEvent(event);
     }
 
-    public Set<? extends EObject> getAutoReleaseLocksExemptions()
-    {
-      synchronized (getViewMonitor())
-      {
-        lockView();
-
-        try
-        {
-          return new HashSet<EObject>(autoReleaseLocksExemptions.keySet());
-        }
-        finally
-        {
-          unlockView();
-        }
-      }
-    }
-
-    public boolean isAutoReleaseLocksExemption(EObject object)
-    {
-      synchronized (getViewMonitor())
-      {
-        lockView();
-
-        try
-        {
-          return autoReleaseLocksExemptions.get(CDOUtil.getCDOObject(object)) == Boolean.TRUE;
-        }
-        finally
-        {
-          unlockView();
-        }
-      }
-    }
-
-    public void clearAutoReleaseLocksExemptions()
-    {
-      checkActive();
-
-      IEvent event = null;
-      synchronized (getViewMonitor())
-      {
-        lockView();
-
-        try
-        {
-          if (!autoReleaseLocksExemptions.isEmpty())
-          {
-            autoReleaseLocksExemptions.clear();
-            event = new AutoReleaseLocksExemptionsEventImpl();
-          }
-        }
-        finally
-        {
-          unlockView();
-        }
-      }
-
-      fireEvent(event);
-    }
-
-    public void addAutoReleaseLocksExemptions(boolean recursive, EObject... objects)
-    {
-      checkActive();
-
-      IEvent event = null;
-      synchronized (getViewMonitor())
-      {
-        lockView();
-
-        try
-        {
-          for (EObject object : objects)
-          {
-            if (autoReleaseLocksExemptions.put(CDOUtil.getCDOObject(object), Boolean.TRUE) == null)
-            {
-              event = new AutoReleaseLocksExemptionsEventImpl();
-            }
-
-            if (recursive)
-            {
-              for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
-              {
-                EObject child = it.next();
-                if (autoReleaseLocksExemptions.put(CDOUtil.getCDOObject(child), Boolean.TRUE) == null && event == null)
-                {
-                  event = new AutoReleaseLocksExemptionsEventImpl();
-                }
-              }
-            }
-          }
-        }
-        finally
-        {
-          unlockView();
-        }
-      }
-
-      fireEvent(event);
-    }
-
-    public void removeAutoReleaseLocksExemptions(boolean recursive, EObject... objects)
-    {
-      checkActive();
-
-      IEvent event = null;
-      synchronized (getViewMonitor())
-      {
-        lockView();
-
-        try
-        {
-          for (EObject object : objects)
-          {
-            if (autoReleaseLocksExemptions.remove(CDOUtil.getCDOObject(object)) != null)
-            {
-              event = new AutoReleaseLocksExemptionsEventImpl();
-            }
-
-            if (recursive)
-            {
-              for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
-              {
-                EObject child = it.next();
-                if (autoReleaseLocksExemptions.remove(CDOUtil.getCDOObject(child)) != null && event == null)
-                {
-                  event = new AutoReleaseLocksExemptionsEventImpl();
-                }
-              }
-            }
-          }
-        }
-        finally
-        {
-          unlockView();
-        }
-      }
-
-      fireEvent(event);
-    }
-
-    public boolean isEffectiveAutoReleaseLock(CDOObject newObject)
-    {
-      boolean effectiveAutoReleaseLock = autoReleaseLocksEnabled;
-      if (autoReleaseLocksExemptions.containsKey(newObject))
-      {
-        effectiveAutoReleaseLock = !effectiveAutoReleaseLock;
-      }
-
-      return effectiveAutoReleaseLock;
-    }
-
     public long getCommitInfoTimeout()
     {
       return commitInfoTimeout;
@@ -4698,25 +4499,11 @@
     /**
      * @author Eike Stepper
      */
-    private final class AutoReleaseLocksEnabledEventImpl extends OptionsEvent implements AutoReleaseLocksEnabledEvent
+    private final class AutoReleaseLocksEventImpl extends OptionsEvent implements AutoReleaseLocksEvent
     {
       private static final long serialVersionUID = 1L;
 
-      public AutoReleaseLocksEnabledEventImpl()
-      {
-        super(OptionsImpl.this);
-      }
-    }
-
-    /**
-     * @author Eike Stepper
-     */
-    private final class AutoReleaseLocksExemptionsEventImpl extends OptionsEvent
-        implements AutoReleaseLocksExemptionsEvent
-    {
-      private static final long serialVersionUID = 1L;
-
-      public AutoReleaseLocksExemptionsEventImpl()
+      public AutoReleaseLocksEventImpl()
       {
         super(OptionsImpl.this);
       }
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java
index 3f29900..eb1fe86 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOUndoDetectorImpl.java
@@ -94,7 +94,7 @@
   }
 
   /**
-   * @deprecated As of 4.5 {@link #detectUndo(CDOTransaction, CDORevision, CDORevision, CDOFeatureDelta)} is called.
+   * @deprecated As of CDO 4.5 {@link #detectUndo(CDOTransaction, CDORevision, CDORevision, CDOFeatureDelta)} is called.
    */
   @Deprecated
   protected boolean detectUndoContainer(InternalCDORevision cleanRevision, InternalCDORevision currentRevision)
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java
index 0f1dd2f..e475279 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOXACommitContextImpl.java
@@ -119,6 +119,11 @@
     return delegateCommitContext.getTransaction();
   }
 
+  public boolean isAutoReleaseLocks()
+  {
+    return delegateCommitContext.isAutoReleaseLocks();
+  }
+
   public boolean isPartialCommit()
   {
     return delegateCommitContext.isPartialCommit();
@@ -154,6 +159,11 @@
     return delegateCommitContext.getNewPackageUnits();
   }
 
+  public Collection<CDOLockState> getLocksOnNewObjects()
+  {
+    return delegateCommitContext.getLocksOnNewObjects();
+  }
+
   public Map<CDOID, CDOObject> getDetachedObjects()
   {
     return delegateCommitContext.getDetachedObjects();
@@ -169,22 +179,6 @@
     return delegateCommitContext.getLobs();
   }
 
-  @Deprecated
-  public boolean isAutoReleaseLocks()
-  {
-    return delegateCommitContext.isAutoReleaseLocks();
-  }
-
-  public Collection<CDOLockState> getLocksOnNewObjects()
-  {
-    return delegateCommitContext.getLocksOnNewObjects();
-  }
-
-  public Collection<CDOID> getIDsToUnlock()
-  {
-    return delegateCommitContext.getIDsToUnlock();
-  }
-
   public Object call() throws Exception
   {
     state.handle(this, progressMonitor);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
index 814dcf4..694efef 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
@@ -99,7 +99,6 @@
 
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -122,7 +121,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -363,16 +361,6 @@
           {
             CDOLockState lockState = createUpdatedLockStateForNewObject(object, lockType, true);
             locksOnNewObjects.add(lockState);
-
-            if (recursive)
-            {
-              for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
-              {
-                CDOObject child = CDOUtil.getCDOObject(it.next());
-                lockState = createUpdatedLockStateForNewObject(child, lockType, true);
-                locksOnNewObjects.add(lockState);
-              }
-            }
           }
           else
           {
@@ -441,13 +429,8 @@
           }
         }
 
-        int locksOnNewObjectsCount = locksOnNewObjects.size();
-        if (locksOnNewObjectsCount != 0)
-        {
-          CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjectsCount]);
-          // updateLockStates(locksOnNewObjectsArray);
-          updateAndNotifyLockStates(Operation.LOCK, lockType, getTimeStamp(), locksOnNewObjectsArray);
-        }
+        CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]);
+        updateLockStates(locksOnNewObjectsArray);
 
         if (result != null)
         {
@@ -526,8 +509,7 @@
   /**
    * Notifies other views of lock changes performed in this view
    */
-  protected void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp,
-      CDOLockState[] lockStates)
+  private void notifyOtherViewsAboutLockChanges(Operation op, LockType type, long timestamp, CDOLockState[] lockStates)
   {
     if (lockStates.length > 0)
     {
@@ -655,16 +637,6 @@
             {
               CDOLockState lockState = createUpdatedLockStateForNewObject(object, lockType, false);
               locksOnNewObjects.add(lockState);
-
-              if (recursive)
-              {
-                for (TreeIterator<EObject> it = object.eAllContents(); it.hasNext();)
-                {
-                  CDOObject child = CDOUtil.getCDOObject(it.next());
-                  lockState = createUpdatedLockStateForNewObject(child, lockType, false);
-                  locksOnNewObjects.add(lockState);
-                }
-              }
             }
             else
             {
@@ -1012,69 +984,83 @@
 
       try
       {
-        List<CDOLockState> result = new ArrayList<CDOLockState>();
-        List<CDOLockState> lockStatesToUpdate = new ArrayList<CDOLockState>();
-        Set<CDOID> missingIDs = new LinkedHashSet<CDOID>();
+        List<CDOID> missing = new LinkedList<CDOID>();
+        List<CDOLockState> lockStates = new LinkedList<CDOLockState>();
+        List<CDOLockState> locksOnNewObjects = new ArrayList<CDOLockState>(ids.size());
 
         for (CDOID id : ids)
         {
+          CDOLockState lockState = null;
           InternalCDOObject object = getObject(id, false);
           if (object != null)
           {
-            CDOLockState lockState = lockStates.get(object);
-            if (lockState != null)
-            {
-              result.add(lockState);
-              continue;
-            }
-
-            if (loadOnDemand && FSMUtil.isNew(object))
-            {
-              Object lockTarget = getLockTarget(this, id);
-              CDOLockState newLockState = CDOLockUtil.createLockState(lockTarget);
-
-              result.add(newLockState);
-              lockStatesToUpdate.add(newLockState);
-              continue;
-            }
+            lockState = this.lockStates.get(object);
           }
 
-          missingIDs.add(id);
+          if (lockState != null)
+          {
+            lockStates.add(lockState);
+          }
+          else if (loadOnDemand && object != null && FSMUtil.isNew(object))
+          {
+            Object lockedObject = getLockTarget(object); // CDOID or CDOIDAndBranch
+            CDOLockState defaultLockState = CDOLockUtil.createLockState(lockedObject);
+            locksOnNewObjects.add(defaultLockState);
+            lockStates.add(defaultLockState);
+          }
+          else
+          {
+            missing.add(id);
+          }
         }
 
-        if (loadOnDemand && (!missingIDs.isEmpty() || ids.isEmpty()))
+        if (loadOnDemand && (missing.size() > 0 || ids.isEmpty()))
         {
           CDOSessionProtocol sessionProtocol = session.getSessionProtocol();
-          CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missingIDs, CDOLockState.DEPTH_NONE);
-
+          CDOLockState[] loadedLockStates = sessionProtocol.getLockStates(viewID, missing, CDOLockState.DEPTH_NONE);
+          List<CDOLockState> newLockStateForCache = new ArrayList<CDOLockState>(
+              loadedLockStates.length + missing.size());
           for (CDOLockState loadedLockState : loadedLockStates)
           {
-            result.add(loadedLockState);
-            lockStatesToUpdate.add(loadedLockState);
+            lockStates.add(loadedLockState);
+            newLockStateForCache.add(loadedLockState);
 
-            CDOID id = CDOIDUtil.getCDOID(loadedLockState.getLockedObject());
-            if (id != null)
+            CDOID cdoID = CDOIDUtil.getCDOID(loadedLockState.getLockedObject());
+            if (cdoID != null)
             {
-              missingIDs.remove(id);
+              missing.remove(cdoID);
             }
           }
 
-          for (CDOID missingID : missingIDs)
+          for (CDOID missingLockStateForCDOID : missing)
           {
-            Object lockTarget = getLockTarget(this, missingID);
-            CDOLockState defaultLockState = CDOLockUtil.createLockState(lockTarget);
+            Object target;
 
-            result.add(defaultLockState);
-            lockStatesToUpdate.add(defaultLockState);
+            InternalCDOObject object = getObject(missingLockStateForCDOID, false);
+            if (object != null)
+            {
+              target = getLockTarget(object); // CDOID or CDOIDAndBranch
+            }
+            else
+            {
+              target = missingLockStateForCDOID;
+            }
+
+            CDOLockState defaultLockState = CDOLockUtil.createLockState(target);
+            lockStates.add(defaultLockState);
+            newLockStateForCache.add(defaultLockState);
+          }
+
+          if (options().isLockNotificationEnabled())
+          {
+            updateLockStates(newLockStateForCache.toArray(new CDOLockState[newLockStateForCache.size()]));
           }
         }
 
-        if (!lockStatesToUpdate.isEmpty())
-        {
-          updateLockStates(lockStatesToUpdate.toArray(new CDOLockState[lockStatesToUpdate.size()]));
-        }
+        CDOLockState[] locksOnNewObjectsArray = locksOnNewObjects.toArray(new CDOLockState[locksOnNewObjects.size()]);
+        updateLockStates(locksOnNewObjectsArray);
 
-        return result.toArray(new CDOLockState[result.size()]);
+        return lockStates.toArray(new CDOLockState[lockStates.size()]);
       }
       finally
       {
@@ -1093,11 +1079,6 @@
     return lockStates.get(object);
   }
 
-  protected Map<CDOObject, CDOLockState> getLockStates()
-  {
-    return lockStates;
-  }
-
   private CDOBranchPoint getBranchPointForID(CDOID id)
   {
     // If this view's timestamp is something other than UNSPECIFIED_DATE,
@@ -1841,12 +1822,8 @@
     }
 
     CDOID id = object.cdoID();
-    return getLockTarget(view, id);
-  }
-
-  protected static Object getLockTarget(CDOView view, CDOID id)
-  {
-    if (view.getSession().getRepositoryInfo().isSupportingBranches())
+    boolean branching = view.getSession().getRepositoryInfo().isSupportingBranches();
+    if (branching)
     {
       return CDOIDUtil.createIDAndBranch(id, view.getBranch());
     }
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
index 738e562..70d0dc1 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/ViewProperties.java
@@ -13,7 +13,6 @@
 
 import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
 import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
 import org.eclipse.emf.cdo.view.CDOView;
 
 import org.eclipse.net4j.util.StringUtil;
@@ -58,13 +57,13 @@
     });
 
     add(new Property<CDOView>("branchName") //$NON-NLS-1$
-    {
+        {
       @Override
       protected Object eval(CDOView view)
       {
         return view.getBranch().getName();
       }
-    });
+        });
 
     add(new Property<CDOView>("branch", //$NON-NLS-1$
         "Branch", "The branch of this view.", CATEGORY_VIEW)
@@ -167,27 +166,13 @@
     });
 
     add(new Property<CDOView>("historical") //$NON-NLS-1$
-    {
+        {
       @Override
       protected Object eval(CDOView view)
       {
         return view.getTimeStamp() != CDOBranchPoint.UNSPECIFIED_DATE;
       }
-    });
-
-    add(new Property<CDOView>("autoReleaseLocks") //$NON-NLS-1$
-    {
-      @Override
-      protected Object eval(CDOView view)
-      {
-        if (view instanceof CDOTransaction)
-        {
-          return ((CDOTransaction)view).options().isAutoReleaseLocksEnabled();
-        }
-
-        return false;
-      }
-    });
+        });
   }
 
   public static void main(String[] args)
diff --git a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
index 55a3c2d..a1071bf 100644
--- a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.net4j.util;singleton:=true
-Bundle-Version: 3.7.0.qualifier
+Bundle-Version: 3.6.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -15,34 +15,34 @@
  org.osgi.framework;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.service.log;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.util.tracker;version="[1.3.0,2.0.0)";resolution:=optional
-Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.7.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
- org.eclipse.net4j.internal.util.container;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs",
- org.eclipse.net4j.internal.util.factory;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs",
- org.eclipse.net4j.internal.util.om;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs",
- org.eclipse.net4j.internal.util.om.pref;version="3.7.0";x-friends:="org.eclipse.net4j.util.defs",
- org.eclipse.net4j.internal.util.table;version="3.7.0";x-internal:=true,
- org.eclipse.net4j.internal.util.test;version="3.7.0";x-friends:="org.eclipse.net4j.tests",
- org.eclipse.net4j.util;version="3.7.0",
- org.eclipse.net4j.util.cache;version="3.7.0",
- org.eclipse.net4j.util.collection;version="3.7.0",
- org.eclipse.net4j.util.concurrent;version="3.7.0",
- org.eclipse.net4j.util.confirmation;version="3.7.0",
- org.eclipse.net4j.util.container;version="3.7.0",
- org.eclipse.net4j.util.container.delegate;version="3.7.0",
- org.eclipse.net4j.util.event;version="3.7.0",
- org.eclipse.net4j.util.factory;version="3.7.0",
- org.eclipse.net4j.util.fsm;version="3.7.0",
- org.eclipse.net4j.util.io;version="3.7.0",
- org.eclipse.net4j.util.lifecycle;version="3.7.0",
- org.eclipse.net4j.util.om;version="3.7.0",
- org.eclipse.net4j.util.om.log;version="3.7.0",
- org.eclipse.net4j.util.om.monitor;version="3.7.0",
- org.eclipse.net4j.util.om.pref;version="3.7.0",
- org.eclipse.net4j.util.om.trace;version="3.7.0",
- org.eclipse.net4j.util.options;version="3.7.0",
- org.eclipse.net4j.util.properties;version="3.7.0",
- org.eclipse.net4j.util.ref;version="3.7.0",
- org.eclipse.net4j.util.registry;version="3.7.0",
- org.eclipse.net4j.util.security;version="3.7.0",
- org.eclipse.net4j.util.transaction;version="3.7.0"
+Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.6.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
+ org.eclipse.net4j.internal.util.container;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs",
+ org.eclipse.net4j.internal.util.factory;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs",
+ org.eclipse.net4j.internal.util.om;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs",
+ org.eclipse.net4j.internal.util.om.pref;version="3.6.0";x-friends:="org.eclipse.net4j.util.defs",
+ org.eclipse.net4j.internal.util.table;version="3.6.0";x-internal:=true,
+ org.eclipse.net4j.internal.util.test;version="3.6.0";x-friends:="org.eclipse.net4j.tests",
+ org.eclipse.net4j.util;version="3.6.0",
+ org.eclipse.net4j.util.cache;version="3.6.0",
+ org.eclipse.net4j.util.collection;version="3.6.0",
+ org.eclipse.net4j.util.concurrent;version="3.6.0",
+ org.eclipse.net4j.util.confirmation;version="3.6.0",
+ org.eclipse.net4j.util.container;version="3.6.0",
+ org.eclipse.net4j.util.container.delegate;version="3.6.0",
+ org.eclipse.net4j.util.event;version="3.6.0",
+ org.eclipse.net4j.util.factory;version="3.6.0",
+ org.eclipse.net4j.util.fsm;version="3.6.0",
+ org.eclipse.net4j.util.io;version="3.6.0",
+ org.eclipse.net4j.util.lifecycle;version="3.6.0",
+ org.eclipse.net4j.util.om;version="3.6.0",
+ org.eclipse.net4j.util.om.log;version="3.6.0",
+ org.eclipse.net4j.util.om.monitor;version="3.6.0",
+ org.eclipse.net4j.util.om.pref;version="3.6.0",
+ org.eclipse.net4j.util.om.trace;version="3.6.0",
+ org.eclipse.net4j.util.options;version="3.6.0",
+ org.eclipse.net4j.util.properties;version="3.6.0",
+ org.eclipse.net4j.util.ref;version="3.6.0",
+ org.eclipse.net4j.util.registry;version="3.6.0",
+ org.eclipse.net4j.util.security;version="3.6.0",
+ org.eclipse.net4j.util.transaction;version="3.6.0"
 Eclipse-BuddyPolicy: registered
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java
index 7e9e087..6a3ff3a 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/collection/HashBag.java
@@ -57,20 +57,6 @@
     return counter.getValue();
   }
 
-  /**
-   * @since 3.7
-   */
-  public int removeCounterFor(T o)
-  {
-    Counter counter = map.remove(o);
-    if (counter == null)
-    {
-      return 0;
-    }
-
-    return counter.getValue();
-  }
-
   public boolean add(T o)
   {
     return add(o, 1);
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java
index 565ba79..437445d 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java
@@ -40,8 +40,6 @@
 {
   private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_CONCURRENCY, RWOLockManager.class);
 
-  private static final ThreadLocal<Boolean> UNLOCK_ALL = new ThreadLocal<Boolean>();
-
   private final List<LockState<OBJECT, CONTEXT>> EMPTY_RESULT = Collections.emptyList();
 
   private final Map<OBJECT, LockState<OBJECT, CONTEXT>> objectToLockStateMap = createObjectToLocksMap();
@@ -108,7 +106,7 @@
     lock(type, context, Collections.singleton(objectToLock), timeout);
   }
 
-  public void unlock(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock)
+  public synchronized void unlock(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock)
   {
     unlock2(type, context, objectsToUnlock);
   }
@@ -116,18 +114,6 @@
   public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(CONTEXT context,
       Collection<? extends OBJECT> objectsToUnlock)
   {
-    return unlock2(LockType.values(), context, objectsToUnlock);
-  }
-
-  public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(LockType type, CONTEXT context,
-      Collection<? extends OBJECT> objectsToUnlock)
-  {
-    return unlock2(new LockType[] { type }, context, objectsToUnlock);
-  }
-
-  private List<LockState<OBJECT, CONTEXT>> unlock2(LockType[] types, CONTEXT context,
-      Collection<? extends OBJECT> objectsToUnlock)
-  {
     if (objectsToUnlock.isEmpty())
     {
       return EMPTY_RESULT;
@@ -135,34 +121,76 @@
 
     if (TRACER.isEnabled())
     {
-      TRACER.format("Unlock: {0} --> {1}", context, objectsToUnlock); //$NON-NLS-1$
+      TRACER.format("Unlock : {0} --> {1}", objectsToUnlock, context); //$NON-NLS-1$
     }
 
-    Set<LockState<OBJECT, CONTEXT>> result = new HashSet<LockState<OBJECT, CONTEXT>>();
+    Set<LockState<OBJECT, CONTEXT>> lockStates = new HashSet<LockState<OBJECT, CONTEXT>>();
 
-    for (OBJECT o : objectsToUnlock)
+    Iterator<? extends OBJECT> it = objectsToUnlock.iterator();
+    while (it.hasNext())
     {
+      OBJECT o = it.next();
       LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o);
-      if (lockState != null)
-      {
-        for (LockType type : types)
-        {
-          while (lockState.canUnlock(type, context))
-          {
-            lockState.unlock(type, context);
-            result.add(lockState);
 
-            if (UNLOCK_ALL.get() != Boolean.TRUE)
-            {
-              break;
-            }
-          }
+      if (lockState == null)
+      {
+        continue;
+      }
+
+      for (LockType lockType : LockType.values())
+      {
+        while (lockState.canUnlock(lockType, context))
+        {
+          lockState.unlock(lockType, context);
+          lockStates.add(lockState);
         }
       }
     }
 
-    for (LockState<OBJECT, CONTEXT> lockState : result)
+    for (LockState<OBJECT, CONTEXT> lockState : lockStates)
     {
+      removeLockStateForContext(context, lockState);
+
+      if (lockState.hasNoLocks())
+      {
+        objectToLockStateMap.remove(lockState.getLockedObject());
+      }
+    }
+
+    notifyAll();
+
+    return new LinkedList<RWOLockManager.LockState<OBJECT, CONTEXT>>(lockStates);
+  }
+
+  public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(LockType type, CONTEXT context,
+      Collection<? extends OBJECT> objectsToUnlock)
+  {
+    if (objectsToUnlock.isEmpty())
+    {
+      return EMPTY_RESULT;
+    }
+
+    if (TRACER.isEnabled())
+    {
+      TRACER.format("Unlock", objectsToUnlock, context); //$NON-NLS-1$
+    }
+
+    List<LockState<OBJECT, CONTEXT>> lockStates = new LinkedList<LockState<OBJECT, CONTEXT>>();
+
+    Iterator<? extends OBJECT> it = objectsToUnlock.iterator();
+    while (it.hasNext())
+    {
+      OBJECT o = it.next();
+      LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o);
+      if (lockState != null && lockState.canUnlock(type, context))
+      {
+        lockStates.add(lockState);
+      }
+    }
+
+    for (LockState<OBJECT, CONTEXT> lockState : lockStates)
+    {
+      lockState.unlock(type, context);
       if (!lockState.hasLocks(context))
       {
         removeLockStateForContext(context, lockState);
@@ -176,7 +204,7 @@
 
     notifyAll();
 
-    return new LinkedList<RWOLockManager.LockState<OBJECT, CONTEXT>>(result);
+    return lockStates;
   }
 
   public synchronized void unlock(CONTEXT context)
@@ -201,11 +229,11 @@
 
     for (LockState<OBJECT, CONTEXT> lockState : lockStates)
     {
-      for (LockType type : LockType.values())
+      for (LockType lockType : LockType.values())
       {
-        while (lockState.hasLock(type, context, false))
+        while (lockState.hasLock(lockType, context, false))
         {
-          lockState.unlock(type, context);
+          lockState.unlock(lockType, context);
         }
       }
 
@@ -414,22 +442,6 @@
 
       wait(waitTime);
     }
-
-  }
-
-  /**
-   * @since 3.7
-   */
-  public static void setUnlockAll(boolean on)
-  {
-    if (on)
-    {
-      UNLOCK_ALL.set(Boolean.TRUE);
-    }
-    else
-    {
-      UNLOCK_ALL.remove();
-    }
   }
 
   /**
@@ -470,7 +482,8 @@
       return lockedObject;
     }
 
-    public boolean hasLock(LockType type, CONTEXT view, boolean byOthers)
+    public boolean hasLock(org.eclipse.net4j.util.concurrent.IRWLockManager.LockType type, CONTEXT view,
+        boolean byOthers)
     {
       CheckUtil.checkArg(view, "view");
 
@@ -504,7 +517,7 @@
       return false;
     }
 
-    public boolean hasLock(LockType type)
+    public boolean hasLock(org.eclipse.net4j.util.concurrent.IRWLockManager.LockType type)
     {
       switch (type)
       {
@@ -521,49 +534,6 @@
       return false;
     }
 
-    public Set<CONTEXT> getReadLockOwners()
-    {
-      return Collections.unmodifiableSet(readLockOwners);
-    }
-
-    public CONTEXT getWriteLockOwner()
-    {
-      return writeLockOwner;
-    }
-
-    public CONTEXT getWriteOptionOwner()
-    {
-      return writeOptionOwner;
-    }
-
-    @Override
-    public int hashCode()
-    {
-      return lockedObject.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-      if (this == obj)
-      {
-        return true;
-      }
-
-      if (obj == null)
-      {
-        return false;
-      }
-
-      if (!(obj instanceof LockState))
-      {
-        return false;
-      }
-
-      LockState<?, ?> other = (LockState<?, ?>)obj;
-      return lockedObject.equals(other.lockedObject);
-    }
-
     @Override
     public String toString()
     {
@@ -838,5 +808,20 @@
     {
       writeOptionOwner = null;
     }
+
+    public Set<CONTEXT> getReadLockOwners()
+    {
+      return Collections.unmodifiableSet(readLockOwners);
+    }
+
+    public CONTEXT getWriteLockOwner()
+    {
+      return writeLockOwner;
+    }
+
+    public CONTEXT getWriteOptionOwner()
+    {
+      return writeOptionOwner;
+    }
   }
 }
diff --git a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
index 4f83a32..67e3c0d 100644
--- a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.net4j;singleton:=true
-Bundle-Version: 4.6.0.qualifier
+Bundle-Version: 4.5.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -11,7 +11,7 @@
 Bundle-ClassPath: .
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional,
  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport
-Export-Package: org.eclipse.internal.net4j;version="4.6.0";
+Export-Package: org.eclipse.internal.net4j;version="4.5.0";
   x-friends:="org.eclipse.net4j.http.server,
    org.eclipse.net4j.jvm,
    org.eclipse.net4j.tcp,
@@ -20,7 +20,7 @@
    org.eclipse.net4j.http.tests,
    org.eclipse.net4j.tests,
    org.eclipse.net4j.defs",
- org.eclipse.internal.net4j.buffer;version="4.6.0";
+ org.eclipse.internal.net4j.buffer;version="4.5.0";
   x-friends:="org.eclipse.net4j.http.server,
    org.eclipse.net4j.jvm,
    org.eclipse.net4j.tcp,
@@ -29,17 +29,17 @@
    org.eclipse.net4j.http.tests,
    org.eclipse.net4j.tests,
    org.eclipse.net4j.defs",
- org.eclipse.internal.net4j.bundle;version="4.6.0";x-internal:=true,
- org.eclipse.net4j;version="4.6.0",
- org.eclipse.net4j.acceptor;version="4.6.0",
- org.eclipse.net4j.buffer;version="4.6.0",
- org.eclipse.net4j.channel;version="4.6.0",
- org.eclipse.net4j.connector;version="4.6.0",
- org.eclipse.net4j.protocol;version="4.6.0",
- org.eclipse.net4j.signal;version="4.6.0",
- org.eclipse.net4j.signal.confirmation;version="4.6.0",
- org.eclipse.net4j.signal.heartbeat;version="4.6.0",
- org.eclipse.net4j.signal.security;version="4.6.0",
- org.eclipse.net4j.signal.wrapping;version="4.6.0",
- org.eclipse.spi.net4j;version="4.6.0"
+ org.eclipse.internal.net4j.bundle;version="4.5.0";x-internal:=true,
+ org.eclipse.net4j;version="4.5.0",
+ org.eclipse.net4j.acceptor;version="4.5.0",
+ org.eclipse.net4j.buffer;version="4.5.0",
+ org.eclipse.net4j.channel;version="4.5.0",
+ org.eclipse.net4j.connector;version="4.5.0",
+ org.eclipse.net4j.protocol;version="4.5.0",
+ org.eclipse.net4j.signal;version="4.5.0",
+ org.eclipse.net4j.signal.confirmation;version="4.5.0",
+ org.eclipse.net4j.signal.heartbeat;version="4.5.0",
+ org.eclipse.net4j.signal.security;version="4.5.0",
+ org.eclipse.net4j.signal.wrapping;version="4.5.0",
+ org.eclipse.spi.net4j;version="4.5.0"
 Eclipse-BuddyPolicy: registered
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java
index be525cb..7a5f654 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalCounter.java
@@ -25,11 +25,8 @@
 {
   private HashBag<Class<? extends Signal>> signals = new HashBag<Class<? extends Signal>>();
 
-  private final ISignalProtocol<?> protocol;
-
   public SignalCounter()
   {
-    protocol = null;
   }
 
   /**
@@ -37,11 +34,14 @@
    */
   public SignalCounter(ISignalProtocol<?> protocol)
   {
-    this.protocol = protocol;
+    protocol.addListener(this);
+  }
 
-    if (protocol != null)
+  public int getCountFor(Class<? extends Signal> signal)
+  {
+    synchronized (signals)
     {
-      protocol.addListener(this);
+      return signals.getCounterFor(signal);
     }
   }
 
@@ -58,25 +58,6 @@
     }
   }
 
-  public int getCountFor(Class<? extends Signal> signal)
-  {
-    synchronized (signals)
-    {
-      return signals.getCounterFor(signal);
-    }
-  }
-
-  /**
-   * @since 4.6
-   */
-  public int removeCountFor(Class<? extends Signal> signal)
-  {
-    synchronized (signals)
-    {
-      return signals.removeCounterFor(signal);
-    }
-  }
-
   public void clearCounts()
   {
     synchronized (signals)
@@ -96,15 +77,4 @@
       }
     }
   }
-
-  /**
-   * @since 4.6
-   */
-  public void dispose()
-  {
-    if (protocol != null)
-    {
-      protocol.removeListener(this);
-    }
-  }
 }