Index: src/main/java/org/apache/jackrabbit/core/ItemManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/ItemManager.java	(revision 1292734)
+++ src/main/java/org/apache/jackrabbit/core/ItemManager.java	(working copy)
@@ -144,8 +144,8 @@
     void dispose() {
         synchronized (itemCache) {
             itemCache.clear();
+            shareableNodesCache.clear();
         }
-        shareableNodesCache.clear();
     }
 
     NodeDefinitionImpl getDefinition(NodeState state)
@@ -927,13 +927,12 @@
                 }
             }
             ItemId id = data.getId();
-            if (itemCache.containsKey(id)) {
-                log.warn("overwriting cached item " + id);
-            }
             if (log.isDebugEnabled()) {
                 log.debug("caching item " + id);
             }
-            itemCache.put(id, data);
+            if (itemCache.put(id, data) != null) {
+                log.warn("overwriting cached item with id " + id);
+            }
         }
     }
 
@@ -966,12 +965,13 @@
         }
         synchronized (itemCache) {
             if (data.isNode()) {
-                shareableNodesCache.evict((AbstractNodeData) data);
-            }
-            ItemData cached = itemCache.get(data.getId());
-            if (cached == data) {
-                itemCache.remove(data.getId());
+                AbstractNodeData nd = (AbstractNodeData) data;
+                if (nd.getPrimaryParentId() != null) {
+                    shareableNodesCache.evict(nd);
+                    return;
+                }
             }
+            itemCache.remove(data.getId());
         }
     }
 
@@ -1030,10 +1030,8 @@
         if (log.isDebugEnabled()) {
             log.debug("destroyed item " + id);
         }
-        synchronized (itemCache) {
-            // remove instance from cache
-            evictItems(id);
-        }
+        // remove instance from cache
+        evictItems(id);
     }
 
     //--------------------------------------------------------------< Object >
@@ -1209,6 +1207,7 @@
          * @param id node id
          * @return node or <code>null</code>
          */
+        @SuppressWarnings("unchecked")
         public AbstractNodeData retrieveFirst(NodeId id) {
             ReferenceMap map = (ReferenceMap) cache.get(id);
             if (map != null) {
@@ -1277,7 +1276,7 @@
          *
          * @param id node id to evict
          */
-        public synchronized void evictAll(NodeId id) {
+        public void evictAll(NodeId id) {
             cache.remove(id);
         }
     }
