Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemCacheImpl.java
===================================================================
--- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemCacheImpl.java	(revision 916289)
+++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemCacheImpl.java	(working copy)
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.jcr2spi;
 
 import java.io.PrintStream;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.jcr.Item;
@@ -35,11 +36,12 @@
 
     private static Logger log = LoggerFactory.getLogger(ItemCacheImpl.class);
 
-    private final Map<ItemState, Item> cache;
+    private final Map<ItemState, Item> lruCache;
+    private final Map<ItemState, Item> hashCache = new HashMap<ItemState, Item>();
 
     @SuppressWarnings("unchecked")
     ItemCacheImpl(int maxSize) {
-        cache = new LRUMap(maxSize);
+        lruCache = new LRUMap(maxSize);
     }
 
     //----------------------------------------------------------< ItemCache >---
@@ -47,14 +49,18 @@
      * @see ItemCache#getItem(ItemState)
      */
     public Item getItem(ItemState state) {
-        return cache.get(state);
+        Item item = hashCache.get(state);
+        return item == null
+            ? lruCache.get(state)
+            : item;
     }
 
     /**
      * @see ItemCache#clear()
      */
     public void clear() {
-        cache.clear();
+        lruCache.clear();
+        hashCache.clear();
     }
 
     //----------------------------------------------< ItemLifeCycleListener >---
@@ -116,11 +122,19 @@
      * @param item the item to cache
      */
     private synchronized void cacheItem(ItemState state, Item item) {
+        Map<ItemState, Item> cache = lruCache;
+        try {
+            if (item.isNode() ? item.getDepth() <= 1 : item.getDepth() <= 2) {
+                cache = hashCache;
+            }
+        }
+        catch (RepositoryException e) { /* ignore */ }
+
         if (cache.containsKey(state)) {
-            log.warn("overwriting cached item " + state);
+            log.warn("overwriting cached item {}", state);
         }
         if (log.isDebugEnabled()) {
-            log.debug("caching item " + state);
+            log.debug("caching item {}", state);
         }
         cache.put(state, item);
     }
@@ -132,9 +146,10 @@
      */
     private synchronized void evictItem(ItemState itemState) {
         if (log.isDebugEnabled()) {
-            log.debug("removing item " + itemState + " from cache");
+            log.debug("removing item {} from cache", itemState);
         }
-        cache.remove(itemState);
+        lruCache.remove(itemState);
+        hashCache.remove(itemState);
     }
 
     //-----------------------------------------------------------< Dumpable >---
@@ -142,6 +157,14 @@
      * @see Dumpable#dump(PrintStream)
      */
     public void dump(PrintStream ps) {
+        ps.println("Hash Cache");
+        dump(hashCache, ps);
+
+        ps.println("LRU Cache");
+        dump(lruCache, ps);
+    }
+
+    private static void dump(Map<ItemState, Item> cache, PrintStream ps) {
         for (Map.Entry<ItemState, Item> entry : cache.entrySet()) {
             ItemState state = entry.getKey();
             Item item = entry.getValue();
