Index: src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java	(revision 490517)
+++ src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.core;
 
+import org.apache.commons.collections.map.LRUMap;
 import org.apache.jackrabbit.name.AbstractNamespaceResolver;
 import org.apache.jackrabbit.name.NamespaceListener;
 import org.apache.jackrabbit.name.NamespaceResolver;
@@ -28,6 +29,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 
 /**
  * Manager for local session namespace mappings. This class is
@@ -56,6 +58,17 @@
     private final HashMap uriToPrefix = new HashMap();
 
     /**
+     * Simple two-way cache between QNames and prefixed JCR names. Used to
+     * speed up resolution of common names like "jcr:primaryType", etc.
+     * The map instance is only ever used by a single thread as specified
+     * in the Session contract, but the reference may be changed to a new
+     * map instance by {@link #evictAllNames()} being invoked potentially
+     * in a different thread when the namespace mappings change. Thus the
+     * reference is volatile.
+     */
+    private volatile Map cache = new LRUMap();
+
+    /**
      * Creates a local namespace manager with the given underlying
      * namespace registry.
      *
@@ -121,6 +134,8 @@
         // store new mapping
         prefixToURI.put(prefix, uri);
         uriToPrefix.put(uri, prefix);
+
+        evictAllNames();
     }
 
     /**
@@ -163,38 +178,29 @@
      * {@inheritDoc}
      */
     public QName retrieveName(String jcrName) {
-        if (prefixToURI.size() == 0) {
-            return nsReg.retrieveName(jcrName);
-        }
-        return null;
+        return (QName) cache.get(jcrName);
     }
 
     /**
      * {@inheritDoc}
      */
     public String retrieveName(QName name) {
-        if (prefixToURI.size() == 0
-                || !uriToPrefix.containsKey(name.getNamespaceURI())) {
-            return nsReg.retrieveName(name);
-        }
-        return null;
+        return (String) cache.get(name);
     }
 
     /**
      * {@inheritDoc}
      */
     public void cacheName(String jcrName, QName name) {
-        if (prefixToURI.size() == 0
-                || !uriToPrefix.containsKey(name.getNamespaceURI())) {
-            nsReg.cacheName(jcrName, name);
-        }
+        cache.put(jcrName, name);
+        cache.put(name, jcrName);
     }
 
     /**
      * {@inheritDoc}
      */
     public void evictAllNames() {
-        nsReg.evictAllNames();
+        cache = new LRUMap();
     }
 
     //-----------------------------------------------------< NamespaceResolver >
@@ -263,6 +269,8 @@
             // add new local mapping
             prefixToURI.put(uniquePrefix, uri);
             uriToPrefix.put(uri, uniquePrefix);
+
+            evictAllNames();
         }
     }
 
@@ -291,6 +299,8 @@
             prefixToURI.put(uniquePrefix, uri);
             uriToPrefix.put(uri, uniquePrefix);
         }
+
+        evictAllNames();
     }
 
     /**
@@ -304,5 +314,7 @@
             String prefix = (String)uriToPrefix.remove(uri);
             prefixToURI.remove(prefix);
         }
+
+        evictAllNames();
     }
 }
Index: src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java	(revision 490517)
+++ src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java	(working copy)
@@ -21,7 +21,6 @@
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.NameCache;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.util.XMLChar;
 import org.slf4j.Logger;
@@ -44,7 +43,7 @@
  * A <code>NamespaceRegistryImpl</code> ...
  */
 public class NamespaceRegistryImpl extends AbstractNamespaceResolver
-        implements NamespaceRegistry, NameCache, NamespaceEventListener {
+        implements NamespaceRegistry, NamespaceEventListener {
 
     private static Logger log = LoggerFactory.getLogger(NamespaceRegistryImpl.class);
 
@@ -83,8 +82,6 @@
 
     private int lastIndex = 0;
 
-    private final CachingNamespaceResolver resolver;
-
     private final FileSystem nsRegStore;
 
     /**
@@ -102,7 +99,6 @@
             throws RepositoryException {
         super(true); // enable listener support
         this.nsRegStore = nsRegStore;
-        resolver = new CachingNamespaceResolver(this, 1000);
         load();
     }
 
@@ -383,7 +379,7 @@
         }
         return uri;
     }
-    
+
     //----------------------------------------------------< NamespaceRegistry >
     /**
      * {@inheritDoc}
@@ -519,30 +515,6 @@
         return prefix;
     }
 
-    //------------------------------------------------------------< NameCache >
-    /**
-     * {@inheritDoc}
-     */
-    public QName retrieveName(String jcrName) {
-        // just delegate to internal cache
-        return resolver.retrieveName(jcrName);
-    }
-
-    public String retrieveName(QName name) {
-        // just delegate to internal cache
-        return resolver.retrieveName(name);
-    }
-
-    public void cacheName(String jcrName, QName name) {
-        // just delegate to internal cache
-        resolver.cacheName(jcrName, name);
-    }
-
-    public void evictAllNames() {
-        // just delegate to internal cache
-        resolver.evictAllNames();
-    }
-
     //-----------------------------------------------< NamespaceEventListener >
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/CachingNamespaceResolver.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/CachingNamespaceResolver.java	(revision 490517)
+++ src/main/java/org/apache/jackrabbit/core/CachingNamespaceResolver.java	(working copy)
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.jackrabbit.core;
-
-import org.apache.commons.collections.map.LRUMap;
-import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NamespaceListener;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameCache;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-
-import javax.jcr.NamespaceException;
-import java.util.Map;
-
-/**
- * Implements a {@link NamespaceResolver} that caches QName to resolved jcr names
- * and vice versa. The cache is invalidated when a namespace uri to prefix
- * mapping is changed.
- */
-class CachingNamespaceResolver
-        implements NamespaceResolver, NamespaceListener, NameCache {
-
-    /**
-     * The base namespace resolver.
-     */
-    private final AbstractNamespaceResolver base;
-
-    /**
-     * Maps QName instances to resolved jcr name Strings.
-     */
-    private final Map qnameToJCRName;
-
-    /**
-     * Maps resolved jcr name Strings to QName instances.
-     */
-    private final Map jcrNameToQName;
-
-    /**
-     * Creates a new <code>CachingNamespaceResolver</code>.
-     *
-     * @param base      a base namespace resolver with support for listener
-     *                  registration.
-     * @param cacheSize number of mappings this resolver may cache.
-     */
-    public CachingNamespaceResolver(AbstractNamespaceResolver base, int cacheSize) {
-        this.base = base;
-        qnameToJCRName = new LRUMap(cacheSize);
-        jcrNameToQName = new LRUMap(cacheSize);
-        this.base.addListener(this);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public String getURI(String prefix) throws NamespaceException {
-        return base.getURI(prefix);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public String getPrefix(String uri) throws NamespaceException {
-        return base.getPrefix(uri);
-    }
-
-    /**
-     * @deprecated use {@link NameFormat#parse(String, NamespaceResolver)}
-     */
-    public QName getQName(String name)
-            throws IllegalNameException, UnknownPrefixException {
-        return NameFormat.parse(name, this);
-    }
-
-    /**
-     * @deprecated use {@link NameFormat#format(QName, NamespaceResolver)}
-     */
-    public String getJCRName(QName name)
-            throws NoPrefixDeclaredException {
-        return NameFormat.format(name, this);
-    }
-
-    /**
-     * Disposes this <code>CachingNamespaceResolver</code>.
-     */
-    public void dispose() {
-        base.removeListener(this);
-    }
-
-    //------------------------------------------------------------< NameCache >
-
-    /**
-     * @inheritDoc
-     */
-    public synchronized QName retrieveName(String jcrName) {
-        return (QName) jcrNameToQName.get(jcrName);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public synchronized String retrieveName(QName name) {
-        return (String) qnameToJCRName.get(name);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public synchronized void cacheName(String jcrName, QName name) {
-        qnameToJCRName.put(name, jcrName);
-        jcrNameToQName.put(jcrName, name);
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public synchronized void evictAllNames() {
-        qnameToJCRName.clear();
-        jcrNameToQName.clear();
-    }
-
-    //----------------------------------------------------< NamespaceListener >
-
-    /**
-     * @inheritDoc
-     */
-    public void namespaceAdded(String prefix, String uri) {
-        // since it is a new namespace there's no need to flush the
-        // cached mappings
-    }
-
-    /**
-     * @inheritDoc
-     * Invalidates all cached mappings.
-     */
-    public void namespaceRemapped(String oldPrefix, String newPrefix, String uri) {
-        evictAllNames();
-    }
-
-    /**
-     * @inheritDoc
-     * Invalidates all cached mappings.
-     */
-    public void namespaceRemoved(String uri) {
-        evictAllNames();
-    }
-}
