Index: src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java	(revision 655889)
+++ src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java	(working copy)
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.core.state;
 
 import org.apache.jackrabbit.core.ItemId;
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
 import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;
 import EDU.oswego.cs.dl.util.concurrent.Sync;
 
@@ -29,35 +28,11 @@
 public class DefaultISMLocking implements ISMLocking {
 
     /**
-     * JCR-447: deadlock might occur when this manager is still write-locked and events are dispatched.
-     */
-    private boolean noLockHack = false;
-
-    /**
      * The internal read-write lock.
      */
-    private final ReadWriteLock rwLock = new ReentrantWriterPreferenceReadWriteLock() {
-        /**
-         * Allow reader when there is no active writer, or current thread owns
-         * the write lock (reentrant).
-         */
-        protected boolean allowReader() {
-            return activeWriter_ == null
-                    || activeWriter_ == Thread.currentThread()
-                    || noLockHack;
-        }
-    };
+    private final RWLock rwLock = new RWLock();
 
     /**
-     * enables or disables the write-lock hack.
-     *
-     * @param noLockHack
-     */
-    public void setNoLockHack(boolean noLockHack) {
-        this.noLockHack = noLockHack;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public ReadLock acquireReadLock(ItemId id)
@@ -110,4 +85,16 @@
             readLock.release();
         }
     }
+
+    private static final class RWLock extends ReentrantWriterPreferenceReadWriteLock {
+
+        /**
+         * Allow reader when there is no active writer, or current thread owns
+         * the write lock (reentrant).
+         */
+        protected boolean allowReader() {
+            return activeWriter_ == null
+                    || activeWriter_ == Thread.currentThread();
+        }
+    }
 }
Index: src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java	(revision 655889)
+++ src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java	(working copy)
@@ -216,18 +216,6 @@
     }
 
     /**
-     * enables or disables the write-lock hack. this should only be called by
-     * the {@link XAVersionManager}.
-     *
-     * @param noLockHack
-     */
-    public void setNoLockHack(boolean noLockHack) {
-        if (ismLocking instanceof DefaultISMLocking) {
-            ((DefaultISMLocking) ismLocking).setNoLockHack(noLockHack);
-        }
-    }
-
-    /**
      * Set an update event channel
      *
      * @param eventChannel update event channel
Index: src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(revision 655889)
+++ src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(working copy)
@@ -521,7 +521,6 @@
                 Map vItems = (Map) tx.getAttribute(ITEMS_ATTRIBUTE_NAME);
                 if (!vItems.isEmpty()) {
                     vMgr.acquireWriteLock();
-                    vMgr.getSharedStateMgr().setNoLockHack(true);
                     vmgrLocked = true;
                 }
             }
@@ -568,7 +567,6 @@
 
             private void internalReleaseWriteLock() {
                 if (vmgrLocked) {
-                    vMgr.getSharedStateMgr().setNoLockHack(false);
                     vMgr.releaseWriteLock();
                     vmgrLocked = false;
                 }
