Index: src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java	(revision 475723)
+++ src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java	(working copy)
@@ -222,7 +222,7 @@
      * {@inheritDoc}
      */
     public boolean hasItem(NodeId id) {
-        aquireReadLock();
+        acquireReadLock();
         try {
             return stateMgr.hasItemState(id);
         } finally {
@@ -239,8 +239,8 @@
         if (id.equals(getHistoryRootId())) {
             return null;
         }
+        acquireReadLock();
         try {
-            aquireReadLock();
             synchronized (versionItems) {
                 InternalVersionItem item = (InternalVersionItem) versionItems.get(id);
                 if (item == null) {
@@ -356,7 +356,7 @@
      * @param items items updated
      */
     public void itemsUpdated(Collection items) {
-        aquireReadLock();
+        acquireReadLock();
         try {
             synchronized (versionItems) {
                 Iterator iter = items.iterator();
@@ -396,9 +396,12 @@
      */
     protected void itemDiscarded(InternalVersionItem item) {
         // evict removed item from cache
-        aquireReadLock();
-        versionItems.remove(item.getId());
-        releaseReadLock();
+        acquireReadLock();
+        try {
+            versionItems.remove(item.getId());
+        } finally {
+            releaseReadLock();
+        }
     }
 
     /**
@@ -407,7 +410,7 @@
      * @return <code>true</code> if the references could be set.
      */
     public boolean setNodeReferences(NodeReferences references) {
-        aquireWriteLock();
+        acquireWriteLock();
         try {
             // filter out version storage intern ones
             NodeReferences refs = new NodeReferences(references.getId());
@@ -435,16 +438,15 @@
      * {@inheritDoc}
      */
     protected List getItemReferences(InternalVersionItem item) {
-        aquireReadLock();
+        acquireReadLock();
         try {
             NodeReferences refs = pMgr.load(new NodeReferencesId(item.getId()));
             return refs.getReferences();
         } catch (ItemStateException e) {
-            // ignore
+            return Collections.EMPTY_LIST;
         } finally {
             releaseReadLock();
         }
-        return Collections.EMPTY_LIST;
     }
 
     /**
@@ -484,9 +486,12 @@
      */
     public void stateDestroyed(ItemState destroyed) {
         // evict removed item from cache
-        aquireReadLock();
-        versionItems.remove(destroyed.getId());
-        releaseReadLock();
+        acquireReadLock();
+        try {
+            versionItems.remove(destroyed.getId());
+        } finally {
+            releaseReadLock();
+        }
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java	(revision 475723)
+++ src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java	(working copy)
@@ -72,6 +72,7 @@
                     return activeWriter_ == null
                         || activeWriter_ == Thread.currentThread();
                 }
+
             };
 
     //-------------------------------------------------------< VersionManager >
@@ -118,7 +119,7 @@
     /**
      * aquires the write lock on this version manager.
      */
-    protected void aquireWriteLock() {
+    protected void acquireWriteLock() {
         while (true) {
             try {
                 rwLock.writeLock().acquire();
@@ -139,7 +140,7 @@
     /**
      * aquires the read lock on this version manager.
      */
-    protected void aquireReadLock() {
+    protected void acquireReadLock() {
         while (true) {
             try {
                 rwLock.readLock().acquire();
@@ -158,12 +159,90 @@
     }
 
     /**
+     * Helper for managing write operations.
+     */
+    private class WriteOperation {
+
+        /**
+         * Flag for successful completion of the write operation.
+         */
+        private boolean success = false;
+
+        /**
+         * Saves the pending operations in the {@link StateManager}.
+         *
+         * @throws ItemStateException if the pending state is invalid
+         * @throws RepositoryException if the pending state could not be persisted
+         */
+        public void save() throws ItemStateException, RepositoryException {
+            stateMgr.update();
+            success = true;
+        }
+
+        /**
+         * Closes the write operation. The pending operations are cancelled
+         * if they could not be properly saved. Finally the write lock is
+         * released.
+         */
+        public void close() {
+            try {
+                if (!success) {
+                    // update operation failed, cancel all modifications
+                    stateMgr.cancel();
+                }
+            } finally {
+                releaseWriteLock();
+            }
+        }
+    }
+
+    /**
+     * Starts a write operation by acquiring the write lock and setting the
+     * item state manager to the "edit" state. If something goes wrong, the
+     * write lock is released and an exception is thrown.
+     * <p>
+     * The pattern for using this method and the returned helper instance is:
+     * <pre>
+     *     WriteOperation operation = startWriteOperation();
+     *     try {
+     *         ...
+     *         operation.save(); // if everything is OK
+     *         ...
+     *     } catch (...) {
+     *         ...
+     *     } finally {
+     *         operation.close();
+     *     }
+     * </pre>
+     *
+     * @return write operation helper
+     * @throws RepositoryException if the write operation could not be started
+     */
+    private WriteOperation startWriteOperation() throws RepositoryException {
+        boolean success = false;
+        acquireWriteLock();
+        try {
+            stateMgr.edit();
+            success = true;
+            return new WriteOperation();
+        } catch (IllegalStateException e) {
+            throw new RepositoryException("Unable to start edit operation.", e);
+        } finally {
+            if (!success) {
+                releaseWriteLock();
+            }
+        }
+
+    }
+
+    /**
      * {@inheritDoc}
      */
     public VersionHistory getVersionHistory(Session session, NodeState node)
             throws RepositoryException {
-        aquireReadLock();
+        acquireReadLock();
         try {
+
             NodeId vhId = getVersionHistoryId(node);
             if (vhId == null) {
                 return null;
@@ -217,18 +296,8 @@
      */
     InternalVersionHistory createVersionHistory(NodeState node)
             throws RepositoryException {
-
-        aquireWriteLock();
+        WriteOperation operation = startWriteOperation();
         try {
-            stateMgr.edit();
-        } catch (IllegalStateException e) {
-            releaseWriteLock();
-            throw new RepositoryException("Unable to start edit operation", e);
-        }
-
-        boolean succeeded = false;
-
-        try {
             // create deep path
             String uuid = node.getNodeId().getUUID().toString();
             NodeStateEx root = historyRoot;
@@ -251,20 +320,13 @@
                     this, root, new NodeId(UUID.randomUUID()), historyNodeName, node);
 
             // end update
-            stateMgr.update();
-            succeeded = true;
-
+            operation.save();
             log.info("Created new version history " + hist.getId() + " for " + node + ".");
             return hist;
-
         } catch (ItemStateException e) {
             throw new RepositoryException(e);
         } finally {
-            if (!succeeded) {
-                // update operation failed, cancel all modifications
-                stateMgr.cancel();
-            }
-            releaseWriteLock();
+            operation.close();
         }
     }
 
@@ -306,10 +368,10 @@
      */
     protected InternalVersion checkin(InternalVersionHistoryImpl history, NodeImpl node)
             throws RepositoryException {
+        WriteOperation operation = startWriteOperation();
+        try {
+            String versionName;
 
-        aquireReadLock();
-        String versionName;
-        try {
             // 1. search a predecessor, suitable for generating the new name
             Value[] values = node.getProperty(QName.JCR_PREDECESSORS).getValues();
             InternalVersion best = null;
@@ -335,35 +397,16 @@
                 versionName += ".1";
             }
 
-            stateMgr.edit();
-        } catch (IllegalStateException e) {
-            releaseReadLock();
-            throw new RepositoryException("Unable to start edit operation.");
-        }
-
-        boolean succeeded = false;
-
-        try {
-            aquireWriteLock();
-            releaseReadLock();
-
             InternalVersionImpl v = history.checkin(new QName("", versionName), node);
-            stateMgr.update();
-            succeeded = true;
-
+            operation.save();
             return v;
         } catch (ItemStateException e) {
-            throw new RepositoryException(e);
+            throw new RepositoryException("Checkin failed", e);
         } finally {
-            if (!succeeded) {
-                // update operation failed, cancel all modifications
-                stateMgr.cancel();
-            }
-            releaseWriteLock();
+            operation.close();
         }
     }
 
-
     /**
      * Removes the specified version from the history
      *
@@ -375,27 +418,14 @@
      */
     protected void removeVersion(InternalVersionHistoryImpl history, QName name)
             throws VersionException, RepositoryException {
-
-        aquireWriteLock();
+        WriteOperation operation = startWriteOperation();
         try {
-            stateMgr.edit();
-        } catch (IllegalStateException e) {
-            releaseWriteLock();
-            throw new VersionException("Unable to start edit operation", e);
-        }
-        boolean succeeded = false;
-        try {
             history.removeVersion(name);
-            stateMgr.update();
-            succeeded = true;
+            operation.save();
         } catch (ItemStateException e) {
             log.error("Error while storing: " + e.toString());
         } finally {
-            if (!succeeded) {
-                // update operation failed, cancel all modifications
-                stateMgr.cancel();
-            }
-            releaseWriteLock();
+            operation.close();
         }
     }
 
@@ -412,30 +442,17 @@
                                               QName version, QName label,
                                               boolean move)
             throws RepositoryException {
-
-        aquireWriteLock();
+        WriteOperation operation = startWriteOperation();
         try {
-            stateMgr.edit();
-        } catch (IllegalStateException e) {
-            releaseWriteLock();
-            throw new VersionException("Unable to start edit operation", e);
-        }
-        InternalVersion v = null;
-        boolean success = false;
-        try {
-            v = history.setVersionLabel(version, label, move);
-            stateMgr.update();
-            success = true;
+            InternalVersion v = history.setVersionLabel(version, label, move);
+            operation.save();
+            return v;
         } catch (ItemStateException e) {
             log.error("Error while storing: " + e.toString());
+            return null;
         } finally {
-            if (!success) {
-                // update operation failed, cancel all modifications
-                stateMgr.cancel();
-            }
-            releaseWriteLock();
+            operation.close();
         }
-        return v;
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java	(revision 475723)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java	(working copy)
@@ -129,8 +129,8 @@
      * {@inheritDoc}
      */
     public InternalVersion[] getSuccessors() {
+        vMgr.acquireReadLock();
         try {
-            vMgr.aquireReadLock();
             InternalValue[] values = node.getPropertyValues(QName.JCR_SUCCESSORS);
             if (values != null) {
                 InternalVersion[] versions = new InternalVersion[values.length];
Index: src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(revision 475723)
+++ src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(working copy)
@@ -462,7 +462,7 @@
      * Delegate the call to our XA item state manager.
      */
     public void prepare(TransactionContext tx) throws TransactionException {
-        vMgr.aquireWriteLock();
+        vMgr.acquireWriteLock();
         vMgr.getSharedStateMgr().setNoLockHack(true);
         vmgrLocked = true;
         ((XAItemStateManager) stateMgr).prepare(tx);
@@ -524,18 +524,16 @@
      */
     private InternalVersionHistoryImpl makeLocalCopy(InternalVersionHistoryImpl history)
             throws RepositoryException {
-
-        NodeState state;
-        aquireReadLock();
+        acquireReadLock();
         try {
-            state = (NodeState) stateMgr.getItemState(history.getId());
+            NodeState state = (NodeState) stateMgr.getItemState(history.getId());
+            NodeStateEx stateEx = new NodeStateEx(stateMgr, ntReg, state, null);
+            return new InternalVersionHistoryImpl(this, stateEx);
         } catch (ItemStateException e) {
             throw new RepositoryException("Unable to make local copy", e);
         } finally {
             releaseReadLock();
         }
-        NodeStateEx stateEx = new NodeStateEx(stateMgr, ntReg, state, null);
-        return new InternalVersionHistoryImpl(this, stateEx);
     }
 
     /**
