Index: src/test/java/org/apache/jackrabbit/init/NodeTestData.java
===================================================================
--- src/test/java/org/apache/jackrabbit/init/NodeTestData.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/init/NodeTestData.java	(working copy)
@@ -39,19 +39,19 @@
     /** The encoding for the test resource */
     private static final String ENCODING = "UTF-8";
 
-    /** Resolved QName for nt:resource */
+    /** Resolved Name for nt:resource */
     private String ntResource;
 
-    /** Resolved QName for jcr:encoding */
+    /** Resolved Name for jcr:encoding */
     private String jcrEncoding;
 
-    /** Resolved QName for jcr:mimeType */
+    /** Resolved Name for jcr:mimeType */
     private String jcrMimeType;
 
-    /** Resolved QName for jcr:data */
+    /** Resolved Name for jcr:data */
     private String jcrData;
 
-    /** Resolved QName for jcr:lastModified */
+    /** Resolved Name for jcr:lastModified */
     private String jcrLastModified;
 
     /**
Index: src/test/java/org/apache/jackrabbit/init/ExportDocViewTestData.java
===================================================================
--- src/test/java/org/apache/jackrabbit/init/ExportDocViewTestData.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/init/ExportDocViewTestData.java	(working copy)
@@ -43,29 +43,29 @@
      */
     private static final String ENCODING = "UTF-8";
     /**
-     * Resolved QName for jcr:encoding
+     * Resolved Name for jcr:encoding
      */
     private String jcrEncoding;
     /**
-     * Resolved QName for jcr:mimeType
+     * Resolved Name for jcr:mimeType
      */
     private String jcrMimeType;
     /**
-     * Resolved QName for jcr:lastModified
+     * Resolved Name for jcr:lastModified
      */
     private String jcrLastModified;
 
 
     /**
-     * Resolved QName for nt:unstructured
+     * Resolved Name for nt:unstructured
      */
     private String ntUnstructured;
     /**
-     * Resolved QName for jcr:xmltext
+     * Resolved Name for jcr:xmltext
      */
     private String xmlText;
     /**
-     * Resolved QName for jcr:xmlcharacters
+     * Resolved Name for jcr:xmlcharacters
      */
     private String xmlCharacters;
 
Index: src/test/java/org/apache/jackrabbit/core/state/ChangeLogTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/state/ChangeLogTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/state/ChangeLogTest.java	(working copy)
@@ -17,10 +17,11 @@
 package org.apache.jackrabbit.core.state;
 
 import org.apache.jackrabbit.test.AbstractJCRTest;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.spi.NameFactory;
 
 import java.util.Iterator;
 
@@ -30,13 +31,20 @@
  */
 public class ChangeLogTest extends AbstractJCRTest {
 
+    private NameFactory factory;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        factory = NameFactoryImpl.getInstance();
+    }
+
     /**
      * Add an item state and then delete it. Make sure there is no
      * entry in either the added nor the removed states
      */
     public void testAddDelete() throws Exception {
         PropertyId id = new PropertyId(
-                new NodeId(UUID.randomUUID()), new QName("", "a"));
+                new NodeId(UUID.randomUUID()), factory.create("", "a"));
         ItemState state = new PropertyState(id, ItemState.STATUS_NEW, false);
 
         ChangeLog log = new ChangeLog();
@@ -56,7 +64,7 @@
      */
     public void testAddModify() throws Exception {
         PropertyId id = new PropertyId(
-                new NodeId(UUID.randomUUID()), new QName("", "a"));
+                new NodeId(UUID.randomUUID()), factory.create("", "a"));
         ItemState state = new PropertyState(id, ItemState.STATUS_NEW, false);
 
         ChangeLog log = new ChangeLog();
@@ -78,7 +86,7 @@
         ItemState[] states = new ItemState[10];
         for (int i = 0; i < states.length; i++) {
             PropertyId id = new PropertyId(
-                    new NodeId(UUID.randomUUID()), new QName("", "a" + i));
+                    new NodeId(UUID.randomUUID()), factory.create("", "a" + i));
             states[i] = new PropertyState(id, ItemState.STATUS_NEW, false);
         }
 
Index: src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java	(working copy)
@@ -21,7 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 
 public class VersionIteratorImplTest extends TestCase {
@@ -48,11 +48,11 @@
 
         public Calendar getCreated() {return null;}
         public InternalFrozenNode getFrozenNode() {return null;}
-        public QName[] getLabels() {return null;}
-        public QName getName() {return null;}
+        public Name[] getLabels() {return null;}
+        public Name getName() {return null;}
         public InternalVersion[] getPredecessors() {return null;}
         public InternalVersionHistory getVersionHistory() {return null;}
-        public boolean hasLabel(QName label) {return false;}
+        public boolean hasLabel(Name label) {return false;}
         public boolean isMoreRecent(InternalVersion v) {return false;}
         public boolean isRootVersion() {return false;}
         public InternalVersionItem getParent() {return null;}
Index: src/test/java/org/apache/jackrabbit/core/NamespaceRegistryImplTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/NamespaceRegistryImplTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/NamespaceRegistryImplTest.java	(working copy)
@@ -20,7 +20,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import junit.framework.TestCase;
 
@@ -96,7 +96,7 @@
             fail("safeRegisterNamespace() fails to reregister a namespace");
         }
         try {
-            registry.safeRegisterNamespace(QName.NS_XML_PREFIX, URI3);
+            registry.safeRegisterNamespace(Name.NS_XML_PREFIX, URI3);
         } catch (NamespaceException e) {
             fail("safeRegisterNamespace() fails to handle a reserved prefix");
         }
Index: src/test/java/org/apache/jackrabbit/core/nodetype/xml/SimpleNamespaceRegistry.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/nodetype/xml/SimpleNamespaceRegistry.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/nodetype/xml/SimpleNamespaceRegistry.java	(working copy)
@@ -20,7 +20,7 @@
 
 import javax.jcr.NamespaceRegistry;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Simple utility implementation of the NamespaceRegistry interface.
@@ -38,11 +38,11 @@
      * Creates a simple namespace registry.
      */
     public SimpleNamespaceRegistry() {
-        registerNamespace(QName.NS_JCR_PREFIX, QName.NS_JCR_URI);
-        registerNamespace(QName.NS_MIX_PREFIX, QName.NS_MIX_URI);
-        registerNamespace(QName.NS_NT_PREFIX, QName.NS_NT_URI);
-        registerNamespace(QName.NS_REP_PREFIX, QName.NS_REP_URI);
-        registerNamespace(QName.NS_EMPTY_PREFIX, QName.NS_EMPTY_PREFIX);
+        registerNamespace(Name.NS_JCR_PREFIX, Name.NS_JCR_URI);
+        registerNamespace(Name.NS_MIX_PREFIX, Name.NS_MIX_URI);
+        registerNamespace(Name.NS_NT_PREFIX, Name.NS_NT_URI);
+        registerNamespace(Name.NS_REP_PREFIX, Name.NS_REP_URI);
+        registerNamespace(Name.NS_EMPTY_PREFIX, Name.NS_EMPTY_PREFIX);
     }
 
     /** {@inheritDoc} */
Index: src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/nodetype/xml/TestAll.java	(working copy)
@@ -26,8 +26,12 @@
 import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
 import org.apache.jackrabbit.core.nodetype.PropDef;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import javax.jcr.NamespaceException;
 import javax.jcr.NamespaceRegistry;
@@ -61,6 +65,8 @@
     private static final String TEST_NS_CND_NODETYPES =
         "test_ns_cnd_nodetypes.cnd";
 
+    private static final NameFactory FACTORY = NameFactoryImpl.getInstance();
+
     /** Test node types definitions. */
     private NodeTypeDef[] types;
 
@@ -90,7 +96,7 @@
      * @return node type definition
      */
     private NodeTypeDef getNodeType(String name) {
-        QName qname = new QName(TEST_NAMESPACE, name);
+        Name qname = FACTORY.create(TEST_NAMESPACE, name);
         for (int i = 0; i < types.length; i++) {
             if (qname.equals(types[i].getName())) {
                 return types[i];
@@ -112,9 +118,9 @@
      * @return property definition
      */
     private PropDef getProperty(String typeName, String propertyName) {
-        QName name;
+        Name name;
         if (propertyName != null) {
-            name = new QName(TEST_NAMESPACE, propertyName);
+            name = FACTORY.create(TEST_NAMESPACE, propertyName);
         } else {
             name = PropDef.ANY_NAME;
         }
@@ -141,7 +147,8 @@
     private String getDefaultValue(PropDef def, int index) {
         try {
             InternalValue[] values = def.getDefaultValues();
-            NamespaceResolver resolver = new AdditionalNamespaceResolver(registry);
+            NamespaceResolver nsResolver = new AdditionalNamespaceResolver(registry);
+            NamePathResolver resolver = new DefaultNamePathResolver(nsResolver);
             return values[index].toJCRValue(resolver).getString();
         } catch (RepositoryException e) {
             throw new AssertionFailedError(e.getMessage());
@@ -158,7 +165,7 @@
      * @return child node definition
      */
     private NodeDef getChildNode(String typeName, String nodeName) {
-        QName name = new QName(TEST_NAMESPACE, nodeName);
+        Name name = FACTORY.create(TEST_NAMESPACE, nodeName);
 
         NodeTypeDef def = getNodeType(typeName);
         NodeDef[] defs = def.getChildNodeDefs();
@@ -215,7 +222,7 @@
     public void testItemNodeType() {
         NodeTypeDef def = getNodeType("itemNodeType");
         assertEquals("itemNodeType primaryItemName",
-                new QName(TEST_NAMESPACE, "emptyItem"),
+                FACTORY.create(TEST_NAMESPACE, "emptyItem"),
                 def.getPrimaryItemName());
         assertEquals("itemNodeType propertyDefs",
                 10, def.getPropertyDefs().length);
@@ -537,7 +544,7 @@
     public void testDefaultTypeNode() {
         NodeDef def = getChildNode("childNodeType", "defaultTypeNode");
         assertEquals("defaultTypeNode defaultPrimaryType",
-                new QName(TEST_NAMESPACE, "testType"),
+                FACTORY.create(TEST_NAMESPACE, "testType"),
                 def.getDefaultPrimaryType());
     }
 
@@ -546,12 +553,12 @@
         NodeDef def = getChildNode("childNodeType", "requiredTypeNode");
         assertEquals("requiredTypeNode requiredPrimaryTypes",
                 2, def.getRequiredPrimaryTypes().length);
-        QName[] types = def.getRequiredPrimaryTypes();
+        Name[] types = def.getRequiredPrimaryTypes();
         Arrays.sort(types);
         assertEquals("requiredTypeNode requiredPrimaryTypes[0]",
-                new QName(TEST_NAMESPACE, "baseType"), types[0]);
+                FACTORY.create(TEST_NAMESPACE, "baseType"), types[0]);
         assertEquals("requiredTypeNode requiredPrimaryTypes[1]",
-                new QName(TEST_NAMESPACE, "testType"), types[1]);
+                FACTORY.create(TEST_NAMESPACE, "testType"), types[1]);
     }
 
     /**
Index: src/test/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefTest.java	(working copy)
@@ -25,8 +25,12 @@
 import org.apache.jackrabbit.core.nodetype.PropDefImpl;
 import org.apache.jackrabbit.core.nodetype.ValueConstraint;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.util.name.NamespaceMapping;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.namespace.NamespaceMapping;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
 
 import javax.jcr.PropertyType;
 import javax.jcr.version.OnParentVersionAction;
@@ -40,21 +44,22 @@
     private static final String TEST_FILE = "cnd-reader-test-input.cnd";
     private static final String NS_PREFIX = "ex";
     private static final String NS_URI = "http://example.org/jackrabbit/example";
+    private static final NameFactory FACTORY = NameFactoryImpl.getInstance();
 
-    private static final QName NODE_TYPE_NAME = new QName(NS_URI, "NodeType");
-    private static final QName PARENT_NODE_TYPE_1 = new QName(NS_URI, "ParentNodeType1");
-    private static final QName PARENT_NODE_TYPE_2 = new QName(NS_URI, "ParentNodeType2");
-    private static final QName[] SUPERTYPES = new QName[]{PARENT_NODE_TYPE_1, PARENT_NODE_TYPE_2};
+    private static final Name NODE_TYPE_NAME = FACTORY.create(NS_URI, "NodeType");
+    private static final Name PARENT_NODE_TYPE_1 = FACTORY.create(NS_URI, "ParentNodeType1");
+    private static final Name PARENT_NODE_TYPE_2 = FACTORY.create(NS_URI, "ParentNodeType2");
+    private static final Name[] SUPERTYPES = new Name[]{PARENT_NODE_TYPE_1, PARENT_NODE_TYPE_2};
 
-    private static final QName PROPERTY_NAME = new QName(NS_URI, "property");
+    private static final Name PROPERTY_NAME = FACTORY.create(NS_URI, "property");
     private static final long DEFAULT_VALUE_1 = 1;
     private static final long DEFAULT_VALUE_2 = 2;
     private static final String VALUE_CONSTRAINT = "[1,10]";
 
-    private static final QName CHILD_NODE_NAME = new QName(NS_URI, "node");
-    private static final QName REQUIRED_NODE_TYPE_1 = new QName(NS_URI, "RequiredNodeType1");
-    private static final QName REQUIRED_NODE_TYPE_2 = new QName(NS_URI, "RequiredNodeType2");
-    private static final QName[] REQUIRED_NODE_TYPES = new QName[]{REQUIRED_NODE_TYPE_1, REQUIRED_NODE_TYPE_2};
+    private static final Name CHILD_NODE_NAME = FACTORY.create(NS_URI, "node");
+    private static final Name REQUIRED_NODE_TYPE_1 = FACTORY.create(NS_URI, "RequiredNodeType1");
+    private static final Name REQUIRED_NODE_TYPE_2 = FACTORY.create(NS_URI, "RequiredNodeType2");
+    private static final Name[] REQUIRED_NODE_TYPES = new Name[]{REQUIRED_NODE_TYPE_1, REQUIRED_NODE_TYPE_2};
 
     private NodeTypeDef modelNodeTypeDef;
 
@@ -63,7 +68,9 @@
         namespaceMapping.setMapping(NS_PREFIX, NS_URI);
         InternalValue dv1 = InternalValue.create(DEFAULT_VALUE_1);
         InternalValue dv2 = InternalValue.create(DEFAULT_VALUE_2);
-        ValueConstraint vc = ValueConstraint.create(PropertyType.LONG, VALUE_CONSTRAINT, namespaceMapping);
+
+        NamePathResolver resolver = new DefaultNamePathResolver(namespaceMapping);
+        ValueConstraint vc = ValueConstraint.create(PropertyType.LONG, VALUE_CONSTRAINT, resolver);
         InternalValue[] defaultValues = new InternalValue[]{dv1, dv2};
         ValueConstraint[] valueConstraints = new ValueConstraint[]{vc};
 
@@ -109,6 +116,7 @@
             new CompactNodeTypeDefReader(reader, TEST_FILE);
         List ntdList = cndReader.getNodeTypeDefs();
         NamespaceMapping nsm = cndReader.getNamespaceMapping();
+        NamePathResolver resolver = new DefaultNamePathResolver(nsm);
         NodeTypeDef ntd = (NodeTypeDef)ntdList.get(0);
 
         // Test CND Reader by comparing imported NTD with model NTD.
@@ -119,7 +127,7 @@
 
         // Put imported node type def back into CND form with CND writer
         StringWriter sw = new StringWriter();
-        CompactNodeTypeDefWriter.write(ntdList, nsm, sw);
+        CompactNodeTypeDefWriter.write(ntdList, nsm, resolver, sw);
 
         // Rerun the reader on the product of the writer
         cndReader = new CompactNodeTypeDefReader(new StringReader(sw.toString()), TEST_FILE);
Index: src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/nodetype/CyclicNodeTypeRegistrationTest.java	(working copy)
@@ -16,8 +16,11 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -54,6 +57,11 @@
     private Collection ntDefCollection;
 
     /**
+     * The name factory
+     */
+    private NameFactory nameFactory;
+
+    /**
      * Sets up the fixture for the test cases.
      */
     protected void setUp() throws Exception {
@@ -62,6 +70,7 @@
 
         session = helper.getReadOnlySession();
         manager = session.getWorkspace().getNodeTypeManager();
+        nameFactory = NameFactoryImpl.getInstance();
 
         // Get the NodeTypeManager from the Workspace.
         // Note that it must be cast from the generic JCR NodeTypeManager to the
@@ -98,21 +107,21 @@
          * + myFooInBar (foo)
          */
         final NodeTypeDef foo = new NodeTypeDef();
-        foo.setName(new QName("", "foo"));
-        foo.setSupertypes(new QName[]{QName.NT_BASE});
+        foo.setName(nameFactory.create("", "foo"));
+        foo.setSupertypes(new Name[]{NameConstants.NT_BASE});
 
         final NodeTypeDef bar = new NodeTypeDef();
-        bar.setName(new QName("", "bar"));
-        bar.setSupertypes(new QName[]{QName.NT_BASE});
+        bar.setName(nameFactory.create("", "bar"));
+        bar.setSupertypes(new Name[]{NameConstants.NT_BASE});
 
         NodeDefImpl myBarInFoo = new NodeDefImpl();
-        myBarInFoo.setRequiredPrimaryTypes(new QName[]{bar.getName()});
-        myBarInFoo.setName(new QName("", "myBarInFoo"));
+        myBarInFoo.setRequiredPrimaryTypes(new Name[]{bar.getName()});
+        myBarInFoo.setName(nameFactory.create("", "myBarInFoo"));
         myBarInFoo.setDeclaringNodeType(foo.getName());
 
         NodeDefImpl myFooInBar = new NodeDefImpl();
-        myFooInBar.setRequiredPrimaryTypes(new QName[]{foo.getName()});
-        myFooInBar.setName(new QName("", "myFooInBar"));
+        myFooInBar.setRequiredPrimaryTypes(new Name[]{foo.getName()});
+        myFooInBar.setName(nameFactory.create("", "myFooInBar"));
         myFooInBar.setDeclaringNodeType(bar.getName());
 
         foo.setChildNodeDefs(new NodeDefImpl[]{myBarInFoo});
@@ -146,13 +155,13 @@
          *
          */
         final NodeTypeDef foo = new NodeTypeDef();
-        foo.setName(new QName("", "foo"));
-        foo.setSupertypes(new QName[]{QName.NT_BASE});
+        foo.setName(nameFactory.create("", "foo"));
+        foo.setSupertypes(new Name[]{NameConstants.NT_BASE});
 
 
         NodeDefImpl myBarInFoo = new NodeDefImpl();
-        myBarInFoo.setRequiredPrimaryTypes(new QName[]{new QName("", "I_am_an_invalid_required_primary_type")});
-        myBarInFoo.setName(new QName("", "myNTInFoo"));
+        myBarInFoo.setRequiredPrimaryTypes(new Name[]{nameFactory.create("", "I_am_an_invalid_required_primary_type")});
+        myBarInFoo.setName(nameFactory.create("", "myNTInFoo"));
         myBarInFoo.setDeclaringNodeType(foo.getName());
 
         foo.setChildNodeDefs(new NodeDefImpl[]{myBarInFoo});
@@ -190,38 +199,38 @@
          */
 
         final NodeTypeDef folder = new NodeTypeDef();
-        folder.setName(new QName("", "Folder"));
+        folder.setName(nameFactory.create("", "Folder"));
 
         final NodeTypeDef cmsObject = new NodeTypeDef();
-        cmsObject.setName(new QName("", "CmsObject"));
-        cmsObject.setSupertypes(new QName[]{QName.NT_BASE});
+        cmsObject.setName(nameFactory.create("", "CmsObject"));
+        cmsObject.setSupertypes(new Name[]{NameConstants.NT_BASE});
         NodeDefImpl parentFolder = new NodeDefImpl();
-        parentFolder.setRequiredPrimaryTypes(new QName[]{folder.getName()});
-        parentFolder.setName(new QName("", "parentFolder"));
+        parentFolder.setRequiredPrimaryTypes(new Name[]{folder.getName()});
+        parentFolder.setName(nameFactory.create("", "parentFolder"));
         parentFolder.setDeclaringNodeType(cmsObject.getName());
         cmsObject.setChildNodeDefs(new NodeDefImpl[]{parentFolder});
 
 
         final NodeTypeDef document = new NodeTypeDef();
-        document.setName(new QName("", "Document"));
-        document.setSupertypes(new QName[]{cmsObject.getName()});
+        document.setName(nameFactory.create("", "Document"));
+        document.setSupertypes(new Name[]{cmsObject.getName()});
         PropDefImpl sizeProp = new PropDefImpl();
-        sizeProp.setName(new QName("", "size"));
+        sizeProp.setName(nameFactory.create("", "size"));
         sizeProp.setRequiredType(PropertyType.LONG);
         sizeProp.setDeclaringNodeType(document.getName());
         document.setPropertyDefs(new PropDef[]{sizeProp});
 
 
-        folder.setSupertypes(new QName[]{cmsObject.getName()});
+        folder.setSupertypes(new Name[]{cmsObject.getName()});
 
         NodeDefImpl folders = new NodeDefImpl();
-        folders.setRequiredPrimaryTypes(new QName[]{folder.getName()});
-        folders.setName(new QName("", "folders"));
+        folders.setRequiredPrimaryTypes(new Name[]{folder.getName()});
+        folders.setName(nameFactory.create("", "folders"));
         folders.setDeclaringNodeType(folder.getName());
 
         NodeDefImpl documents = new NodeDefImpl();
-        documents.setRequiredPrimaryTypes(new QName[]{document.getName()});
-        documents.setName(new QName("", "documents"));
+        documents.setRequiredPrimaryTypes(new Name[]{document.getName()});
+        documents.setName(nameFactory.create("", "documents"));
         documents.setDeclaringNodeType(folder.getName());
 
         folder.setChildNodeDefs(new NodeDefImpl[]{folders, documents});
Index: src/test/java/org/apache/jackrabbit/core/query/PathQueryNodeTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/query/PathQueryNodeTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/query/PathQueryNodeTest.java	(working copy)
@@ -21,36 +21,32 @@
 import junit.framework.TestCase;
 
 import org.apache.jackrabbit.core.query.xpath.XPathQueryBuilder;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
 
 public class PathQueryNodeTest extends TestCase {
 
     private static final DefaultQueryNodeFactory QUERY_NODE_FACTORY = new DefaultQueryNodeFactory(
-            Arrays.asList(new QName[] { QName.NT_NODETYPE }));
-    
-    private static final NamespaceResolver JCR_RESOLVER = new NamespaceResolver() {
-        public String getJCRName(QName qName) {
-            throw new UnsupportedOperationException();
-        }
+            Arrays.asList(new Name[] { NameConstants.NT_NODETYPE }));
 
+    private static final NameResolver JCR_RESOLVER = new DefaultNamePathResolver(new NamespaceResolver() {
+
         public String getPrefix(String uri) {
             throw new UnsupportedOperationException();
         }
-
-        public QName getQName(String jcrName) {
-            throw new UnsupportedOperationException();
-        }
-
+        
         public String getURI(String prefix) {
-            if (QName.NS_JCR_PREFIX.equals(prefix))
-                return QName.NS_JCR_URI;
-            if (QName.NS_NT_PREFIX.equals(prefix))
-                return QName.NS_NT_URI;
+            if (Name.NS_JCR_PREFIX.equals(prefix))
+                return Name.NS_JCR_URI;
+            if (Name.NS_NT_PREFIX.equals(prefix))
+                return Name.NS_NT_URI;
             return "";
         }
-    };    
-    
+    });
+
     public void testNeedsSystemTree() throws Exception {
         QueryRootNode queryRootNode = XPathQueryBuilder.createQuery("/jcr:root/*", JCR_RESOLVER, QUERY_NODE_FACTORY);
         assertTrue(queryRootNode.needsSystemTree());
@@ -66,11 +62,11 @@
 
         queryRootNode = XPathQueryBuilder.createQuery("test//*", JCR_RESOLVER, QUERY_NODE_FACTORY);
         assertFalse(queryRootNode.needsSystemTree());
-        
+
         queryRootNode = XPathQueryBuilder.createQuery("//test/*", JCR_RESOLVER, QUERY_NODE_FACTORY);
-        assertTrue(queryRootNode.needsSystemTree());         
+        assertTrue(queryRootNode.needsSystemTree());
     }
-    
+
     public void testNeedsSystemTreeForAllNodesByNodeType() throws Exception {
         QueryRootNode queryRootNode = XPathQueryBuilder.createQuery("//element(*, nt:resource)", JCR_RESOLVER, QUERY_NODE_FACTORY);
         assertFalse(queryRootNode.needsSystemTree());
Index: src/test/java/org/apache/jackrabbit/core/data/NodeTypeTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/data/NodeTypeTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/data/NodeTypeTest.java	(working copy)
@@ -19,8 +19,8 @@
 import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.nodetype.compact.CompactNodeTypeDefReader;
-import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import java.io.InputStream;
 import java.io.Reader;
@@ -63,7 +63,7 @@
             List ntdList = cndReader.getNodeTypeDefs();
             NodeTypeManagerImpl ntmgr = (NodeTypeManagerImpl) ws.getNodeTypeManager();
             NodeTypeRegistry ntreg = ntmgr.getNodeTypeRegistry();
-            if (!ntreg.isRegistered(new QName("http://namespace.com/ns", "foo" + len))) {
+            if (!ntreg.isRegistered(NameFactoryImpl.getInstance().create("http://namespace.com/ns", "foo" + len))) {
                 ntreg.registerNodeTypes(ntdList);
             }
             Node root = session.getRootNode();
Index: src/test/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java	(working copy)
@@ -109,6 +109,7 @@
 
                 repository = (Repository) ctx.lookup(repName);
             } catch (Exception e) {
+                e.printStackTrace();
                 throw new RepositoryStubException(e.toString());
             }
         }
Index: src/test/java/org/apache/jackrabbit/core/util/RepositoryLockTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/util/RepositoryLockTest.java	(revision 581921)
+++ src/test/java/org/apache/jackrabbit/core/util/RepositoryLockTest.java	(working copy)
@@ -21,8 +21,6 @@
 
 import javax.jcr.RepositoryException;
 
-import org.apache.jackrabbit.core.util.RepositoryLock;
-
 import junit.framework.TestCase;
 
 /**
Index: src/main/java/org/apache/jackrabbit/core/SearchManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/SearchManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/SearchManager.java	(working copy)
@@ -35,8 +35,8 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.NodeStateIterator;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
Index: src/main/java/org/apache/jackrabbit/core/PropertyId.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/PropertyId.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/PropertyId.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 /**
  * Property identifier. An instance of this class identifies a single
@@ -32,7 +33,7 @@
     private final NodeId parentId;
 
     /** Qualified name of the property. */
-    private final QName propName;
+    private final Name propName;
 
     /** the precalculated hash code */
     private final int hashCode;
@@ -43,7 +44,7 @@
      * @param parentId the id of the parent node
      * @param propName qualified name of the property
      */
-    public PropertyId(NodeId parentId, QName propName) {
+    public PropertyId(NodeId parentId, Name propName) {
         if (parentId == null) {
             throw new IllegalArgumentException("parentId can not be null");
         }
@@ -84,7 +85,7 @@
      *
      * @return qualified name
      */
-    public QName getName() {
+    public Name getName() {
         return propName;
     }
 
@@ -109,7 +110,7 @@
             throw new IllegalArgumentException("invalid PropertyId literal");
         }
         String uuid = s.substring(0, i);
-        QName name = QName.valueOf(s.substring(i + 1));
+        Name name = NameFactoryImpl.getInstance().create(s.substring(i + 1));
 
         return new PropertyId(NodeId.valueOf(uuid), name);
     }
Index: src/main/java/org/apache/jackrabbit/core/cluster/ClusterContext.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/cluster/ClusterContext.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/cluster/ClusterContext.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.cluster;
 
 import org.apache.jackrabbit.core.config.ClusterConfig;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
 import javax.jcr.RepositoryException;
 
Index: src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java	(working copy)
@@ -35,8 +35,8 @@
 import org.apache.jackrabbit.core.state.ItemState;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 import EDU.oswego.cs.dl.util.concurrent.Mutex;
 
 import javax.jcr.RepositoryException;
@@ -848,7 +848,7 @@
      * Process one or more node type registrations.
      *
      * @param c collection of node type definitions, if this is a register
-     *          operation; collection of <code>QName</code>s if this is
+     *          operation; collection of <code>Name</code>s if this is
      *          an unregister operation
      * @param register <code>true</code>, if this is a register operation;
      *                 <code>false</code> otherwise
@@ -986,8 +986,8 @@
                     NodeId parentId = record.readNodeId();
                     Path parentPath = record.readPath();
                     NodeId childId = record.readNodeId();
-                    Path.PathElement childRelPath = record.readPathElement();
-                    QName ntName = record.readQName();
+                    Path.Element childRelPath = record.readPathElement();
+                    Name ntName = record.readQName();
 
                     Set mixins = new HashSet();
                     int mixinCount = record.readInt();
@@ -1078,8 +1078,8 @@
      * @return event
      */
     private EventState createEventState(int type, NodeId parentId, Path parentPath,
-                                        NodeId childId, Path.PathElement childRelPath,
-                                        QName ntName, Set mixins, String userId) {
+                                        NodeId childId, Path.Element childRelPath,
+                                        Name ntName, Set mixins, String userId) {
         switch (type) {
             case Event.NODE_ADDED:
                 return EventState.childNodeAdded(parentId, parentPath, childId, childRelPath,
@@ -1180,7 +1180,7 @@
             if (register) {
                 record.writeNodeTypeDef((NodeTypeDef) iter.next());
             } else {
-                record.writeQName((QName) iter.next());
+                record.writeQName((Name) iter.next());
             }
         }
     }
@@ -1233,7 +1233,7 @@
         record.writeInt(mixins.size());
         Iterator iter = mixins.iterator();
         while (iter.hasNext()) {
-            record.writeQName((QName) iter.next());
+            record.writeQName((Name) iter.next());
         }
         record.writeString(event.getUserId());
     }
Index: src/main/java/org/apache/jackrabbit/core/ItemValidator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/ItemValidator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/ItemValidator.java	(working copy)
@@ -24,9 +24,9 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -107,7 +107,7 @@
         NodeDef def = ntReg.getNodeDef(nodeState.getDefinitionId());
 
         // check if primary type satisfies the 'required node types' constraint
-        QName[] requiredPrimaryTypes = def.getRequiredPrimaryTypes();
+        Name[] requiredPrimaryTypes = def.getRequiredPrimaryTypes();
         for (int i = 0; i < requiredPrimaryTypes.length; i++) {
             if (!entPrimary.includesNodeType(requiredPrimaryTypes[i])) {
                 String msg = safeGetJCRPath(nodeState.getNodeId())
@@ -193,7 +193,7 @@
             throws RepositoryException {
         // mixin types
         Set set = nodeState.getMixinTypeNames();
-        QName[] types = new QName[set.size() + 1];
+        Name[] types = new Name[set.size() + 1];
         set.toArray(types);
         // primary type
         types[types.length - 1] = nodeState.getNodeTypeName();
Index: src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(working copy)
@@ -39,8 +39,10 @@
 import org.apache.jackrabbit.core.util.DOMWalker;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
 import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -129,11 +131,14 @@
      */
     private String nodePathTemplate = "xxxx/xxxx/xxxxxxxxxxxxxxxxxxxxxxxx";
 
+    private final NameFactory factory;
+
     /**
      * Creates a new <code>XMLPersistenceManager</code> instance.
      */
     public XMLPersistenceManager() {
         initialized = false;
+        factory = NameFactoryImpl.getInstance();
     }
 
     /**
@@ -225,7 +230,7 @@
         }
         // check nodetype
         String ntName = walker.getAttribute(NODETYPE_ATTRIBUTE);
-        if (!QName.valueOf(ntName).equals(state.getNodeTypeName())) {
+        if (!factory.create(ntName).equals(state.getNodeTypeName())) {
             String msg = "invalid serialized state: nodetype mismatch";
             log.debug(msg);
             throw new ItemStateException(msg);
@@ -251,7 +256,7 @@
         if (walker.enterElement(MIXINTYPES_ELEMENT)) {
             Set mixins = new HashSet();
             while (walker.iterateElements(MIXINTYPE_ELEMENT)) {
-                mixins.add(QName.valueOf(walker.getAttribute(NAME_ATTRIBUTE)));
+                mixins.add(factory.create(walker.getAttribute(NAME_ATTRIBUTE)));
             }
             if (mixins.size() > 0) {
                 state.setMixinTypeNames(mixins);
@@ -264,7 +269,7 @@
             while (walker.iterateElements(PROPERTY_ELEMENT)) {
                 String propName = walker.getAttribute(NAME_ATTRIBUTE);
                 // @todo deserialize type and values
-                state.addPropertyName(QName.valueOf(propName));
+                state.addPropertyName(factory.create(propName));
             }
             walker.leaveElement();
         }
@@ -274,7 +279,7 @@
             while (walker.iterateElements(NODE_ELEMENT)) {
                 String childName = walker.getAttribute(NAME_ATTRIBUTE);
                 String childUUID = walker.getAttribute(UUID_ATTRIBUTE);
-                state.addChildNodeEntry(QName.valueOf(childName), NodeId.valueOf(childUUID));
+                state.addChildNodeEntry(factory.create(childName), NodeId.valueOf(childUUID));
             }
             walker.leaveElement();
         }
@@ -290,7 +295,7 @@
             throw new ItemStateException(msg);
         }
         // check name
-        if (!state.getName().equals(QName.valueOf(walker.getAttribute(NAME_ATTRIBUTE)))) {
+        if (!state.getName().equals(factory.create(walker.getAttribute(NAME_ATTRIBUTE)))) {
             String msg = "invalid serialized state: name mismatch";
             log.debug(msg);
             throw new ItemStateException(msg);
@@ -479,7 +484,7 @@
                 String ntName = walker.getAttribute(NODETYPE_ATTRIBUTE);
 
                 NodeState state = createNew(id);
-                state.setNodeTypeName(QName.valueOf(ntName));
+                state.setNodeTypeName(factory.create(ntName));
                 readState(walker, state);
                 return state;
             } finally {
@@ -582,7 +587,7 @@
                 writer.write("\t<" + PROPERTIES_ELEMENT + ">\n");
                 iter = state.getPropertyNames().iterator();
                 while (iter.hasNext()) {
-                    QName propName = (QName) iter.next();
+                    Name propName = (Name) iter.next();
                     writer.write("\t\t<" + PROPERTY_ELEMENT + " "
                             + NAME_ATTRIBUTE + "=\"" + Text.encodeIllegalXMLCharacters(propName.toString()) + "\">\n");
                     // @todo serialize type, definition id and values
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/NodePropBundle.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/NodePropBundle.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/NodePropBundle.java	(working copy)
@@ -33,7 +33,8 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
 import org.apache.jackrabbit.core.nodetype.PropDefId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 /**
  * This Class provides a simple structure to hold the nodestate and related
@@ -57,7 +58,7 @@
     /**
      * the nodetype name
      */
-    private QName nodeTypeName;
+    private Name nodeTypeName;
 
     /**
      * the mixintype names
@@ -129,7 +130,7 @@
         nodeTypeName = state.getNodeTypeName();
         mixinTypeNames = state.getMixinTypeNames();
         nodeDefId = state.getDefinitionId();
-        isReferenceable = state.hasPropertyName(QName.JCR_UUID);
+        isReferenceable = state.hasPropertyName(NameConstants.JCR_UUID);
         modCount = state.getModCount();
         List list = state.getChildNodeEntries();
         Iterator iter = list.iterator();
@@ -160,13 +161,13 @@
         state.setPropertyNames(properties.keySet());
 
         // add fake property entries
-        state.addPropertyName(QName.JCR_PRIMARYTYPE);
+        state.addPropertyName(NameConstants.JCR_PRIMARYTYPE);
         if (mixinTypeNames.size()>0) {
-            state.addPropertyName(QName.JCR_MIXINTYPES);
+            state.addPropertyName(NameConstants.JCR_MIXINTYPES);
         }
         // uuid is special...only if 'referenceable'
         if (isReferenceable) {
-            state.addPropertyName(QName.JCR_UUID);
+            state.addPropertyName(NameConstants.JCR_UUID);
         }
 
         return state;
@@ -178,7 +179,7 @@
      * @param name the name of the new property
      * @return the new property state
      */
-    public PropertyState createPropertyState(PersistenceManager pMgr, QName name) {
+    public PropertyState createPropertyState(PersistenceManager pMgr, Name name) {
         PropertyEntry p = getPropertyEntry(name);
         if (p == null) {
             return null;
@@ -236,7 +237,7 @@
      * Returns the nodetype name of this bundle
      * @return the nodetype name of this bundle
      */
-    public QName getNodeTypeName() {
+    public Name getNodeTypeName() {
         return nodeTypeName;
     }
 
@@ -244,7 +245,7 @@
      * Sets the node type name
      * @param nodeTypeName the nodetype name
      */
-    public void setNodeTypeName(QName nodeTypeName) {
+    public void setNodeTypeName(Name nodeTypeName) {
         this.nodeTypeName = nodeTypeName;
     }
 
@@ -326,7 +327,7 @@
      * @param name the name of the entry.
      * @param id the id of the entry
      */
-    public void addChildNodeEntry(QName name, NodeId id) {
+    public void addChildNodeEntry(Name name, NodeId id) {
         childNodeEntries.add(new ChildNodeEntry(name, id));
     }
 
@@ -355,11 +356,11 @@
      * @return <code>true</code> if the property exists;
      *         <code>false</code> otherwise.
      */
-    public boolean hasProperty(QName name) {
+    public boolean hasProperty(Name name) {
         return properties.containsKey(name)
-                || name.equals(QName.JCR_PRIMARYTYPE)
-                || (isReferenceable && name.equals(QName.JCR_UUID))
-                || (mixinTypeNames.size()>0 && name.equals(QName.JCR_MIXINTYPES));
+                || name.equals(NameConstants.JCR_PRIMARYTYPE)
+                || (isReferenceable && name.equals(NameConstants.JCR_UUID))
+                || (mixinTypeNames.size()>0 && name.equals(NameConstants.JCR_MIXINTYPES));
     }
 
     /**
@@ -383,7 +384,7 @@
      * @param name the name of the property entry
      * @return the desired property entry or <code>null</code>
      */
-    public PropertyEntry getPropertyEntry(QName name) {
+    public PropertyEntry getPropertyEntry(Name name) {
         return (PropertyEntry) properties.get(name);
     }
 
@@ -393,7 +394,7 @@
     public void removeAllProperties() {
         Iterator iter = properties.keySet().iterator();
         while (iter.hasNext()) {
-            QName name = (QName) iter.next();
+            Name name = (Name) iter.next();
             removeProperty(name);
             iter = properties.keySet().iterator();
         }
@@ -403,7 +404,7 @@
      * Removes the proprty with the given name from this bundle.
      * @param name the name of the property
      */
-    public void removeProperty(QName name) {
+    public void removeProperty(Name name) {
         PropertyEntry pe = (PropertyEntry) properties.remove(name);
         if (pe != null) {
             pe.destroy();
@@ -452,7 +453,7 @@
         /**
          * the name of the entry
          */
-        private final QName name;
+        private final Name name;
 
         /**
          * the id of the entry
@@ -464,7 +465,7 @@
          * @param name the name
          * @param id the id
          */
-        public ChildNodeEntry(QName name, NodeId id) {
+        public ChildNodeEntry(Name name, NodeId id) {
             this.name = name;
             this.id = id;
         }
@@ -473,7 +474,7 @@
          * Returns the name.
          * @return the name.
          */
-        public QName getName() {
+        public Name getName() {
             return name;
         }
 
@@ -565,7 +566,7 @@
          * Returns the property name
          * @return the property name
          */
-        public QName getName() {
+        public Name getName() {
             return id.getName();
         }
 
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java	(working copy)
@@ -27,8 +27,9 @@
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
 import org.apache.jackrabbit.core.nodetype.PropDefId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -89,7 +90,7 @@
         index &= 0x00ffffff;
         String uri = nsIndex.indexToString(index);
         String local = nameIndex.indexToString(in.readInt());
-        QName nodeTypeName = new QName(uri, local);
+        Name nodeTypeName = NameFactoryImpl.getInstance().create(uri, local);
 
         // primaryType
         bundle.setNodeTypeName(nodeTypeName);
@@ -102,7 +103,7 @@
 
         // mixin types
         Set mixinTypeNames = new HashSet();
-        QName name = readIndexedQName(in);
+        Name name = readIndexedQName(in);
         while (name != null) {
             mixinTypeNames.add(name);
             name = readIndexedQName(in);
@@ -154,7 +155,7 @@
             index &= 0x00ffffff;
             String uri = nsIndex.indexToString(index);
             String local = nameIndex.indexToString(in.readInt());
-            QName nodeTypeName = new QName(uri, local);
+            Name nodeTypeName = NameFactoryImpl.getInstance().create(uri, local);
 
             log.info("Serialzation Version: " + version);
             log.info("NodeTypeName: " + nodeTypeName);
@@ -177,7 +178,7 @@
             return false;
         }
         try {
-            QName mixinName = readIndexedQName(in);
+            Name mixinName = readIndexedQName(in);
             while (mixinName != null) {
                 log.info("MixinTypeName: " + mixinName);
                 mixinName = readIndexedQName(in);
@@ -187,7 +188,7 @@
             return false;
         }
         try {
-            QName propName = readIndexedQName(in);
+            Name propName = readIndexedQName(in);
             while (propName != null) {
                 log.info("PropertyName: " + propName);
                 if (!checkPropertyState(in)) {
@@ -209,7 +210,7 @@
         try {
             UUID cneUUID = readUUID(in);
             while (cneUUID != null) {
-                QName cneName = readQName(in);
+                Name cneName = readQName(in);
                 log.info("ChildNodentry: " + cneUUID + ":" + cneName);
                 cneUUID = readUUID(in);
             }
@@ -255,14 +256,14 @@
         // mixin types
         Iterator iter = bundle.getMixinTypeNames().iterator();
         while (iter.hasNext()) {
-            writeIndexedQName(out, (QName) iter.next());
+            writeIndexedQName(out, (Name) iter.next());
         }
         writeIndexedQName(out, null);
 
         // properties
         iter = bundle.getPropertyNames().iterator();
         while (iter.hasNext()) {
-            QName pName = (QName) iter.next();
+            Name pName = (Name) iter.next();
             NodePropBundle.PropertyEntry pState = bundle.getPropertyEntry(pName);
             if (pState == null) {
                 log.error("PropertyState missing in bundle: " + pName);
@@ -493,7 +494,7 @@
                     break;
                 case PropertyType.NAME:
                     try {
-                        QName name = readQName(in);
+                        Name name = readQName(in);
                         log.info("  name: " + name);
                     } catch (IOException e) {
                         log.error("Error while reading name value: " + e);
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java	(working copy)
@@ -25,8 +25,9 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -181,7 +182,7 @@
         int version = (index >> 24) & 0x0ff;
         String uri = nsIndex.indexToString(index & 0x0ffffff);
         String local = in.readUTF();
-        state.setNodeTypeName(new QName(uri, local));
+        state.setNodeTypeName(NameFactoryImpl.getInstance().create(uri, local));
 
         // parentUUID
         state.setParentId(readID(in));
@@ -205,7 +206,7 @@
         // child nodes (list of name/uuid pairs)
         count = in.readInt();   // count
         for (int i = 0; i < count; i++) {
-            QName name = readQName(in);
+            Name name = readQName(in);
             NodeId parentId = readID(in);
             state.addChildNodeEntry(name, parentId);
         }
@@ -236,13 +237,13 @@
         Collection c = state.getMixinTypeNames();
         out.writeInt(c.size()); // count
         for (Iterator iter = c.iterator(); iter.hasNext();) {
-            writeQName(out, (QName) iter.next());
+            writeQName(out, (Name) iter.next());
         }
         // properties (names)
         c = state.getPropertyNames();
         out.writeInt(c.size()); // count
         for (Iterator iter = c.iterator(); iter.hasNext();) {
-            QName pName = (QName) iter.next();
+            Name pName = (Name) iter.next();
             writeIndexedQName(out, pName);
         }
         // child nodes (list of name/uuid pairs)
@@ -340,15 +341,15 @@
     }
 
     /**
-     * Deserializes a QName
+     * Deserializes a Name
      * @param in the input stream
      * @return the qname
      * @throws IOException in an I/O error occurs.
      */
-    public QName readQName(DataInputStream in) throws IOException {
+    public Name readQName(DataInputStream in) throws IOException {
         String uri = nsIndex.indexToString(in.readInt());
         String local = in.readUTF();
-        return new QName(uri, local);
+        return NameFactoryImpl.getInstance().create(uri, local);
     }
 
     /**
@@ -372,40 +373,40 @@
     }
 
     /**
-     * Serializes a QName
+     * Serializes a Name
      * @param out the output stream
      * @param name the name
      * @throws IOException in an I/O error occurs.
      */
-    public void writeQName(DataOutputStream out, QName name) throws IOException {
+    public void writeQName(DataOutputStream out, Name name) throws IOException {
         out.writeInt(nsIndex.stringToIndex(name.getNamespaceURI()));
         out.writeUTF(name.getLocalName());
     }
 
     /**
-     * Deserializes an indexed QName
+     * Deserializes an indexed Name
      * @param in the input stream
      * @return the qname
      * @throws IOException in an I/O error occurs.
      */
-    public QName readIndexedQName(DataInputStream in) throws IOException {
+    public Name readIndexedQName(DataInputStream in) throws IOException {
         int index = in.readInt();
         if (index < 0) {
             return null;
         } else {
             String uri = nsIndex.indexToString(index);
             String local = nameIndex.indexToString(in.readInt());
-            return new QName(uri, local);
+            return NameFactoryImpl.getInstance().create(uri, local);
         }
     }
 
     /**
-     * Serializes a indexed QName
+     * Serializes a indexed Name
      * @param out the output stream
      * @param name the name
      * @throws IOException in an I/O error occurs.
      */
-    public void writeIndexedQName(DataOutputStream out, QName name) throws IOException {
+    public void writeIndexedQName(DataOutputStream out, Name name) throws IOException {
         if (name == null) {
             out.writeInt(-1);
         } else {
@@ -433,7 +434,7 @@
      */
     public PropertyId readPropertyId(DataInputStream in) throws IOException {
         UUID uuid = readUUID(in);
-        QName name = readQName(in);
+        Name name = readQName(in);
         return new PropertyId(new NodeId(uuid), name);
     }
 }
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java	(working copy)
@@ -42,7 +42,8 @@
 import org.apache.jackrabbit.core.persistence.bundle.util.BundleCache;
 import org.apache.jackrabbit.core.persistence.bundle.util.LRUNodeIdCache;
 import org.apache.jackrabbit.core.persistence.bundle.util.HashMapIndex;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -406,12 +407,12 @@
 
         // init prop defs
         if (context.getNodeTypeRegistry() != null) {
-            idJcrUUID = context.getNodeTypeRegistry().getEffectiveNodeType(QName.MIX_REFERENCEABLE).getApplicablePropertyDef(
-                    QName.JCR_UUID, PropertyType.STRING, false).getId();
-            idJcrPrimaryType = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
-                    QName.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId();
-            idJcrMixinTypes = context.getNodeTypeRegistry().getEffectiveNodeType(QName.NT_BASE).getApplicablePropertyDef(
-                    QName.JCR_MIXINTYPES, PropertyType.NAME, true).getId();
+            idJcrUUID = context.getNodeTypeRegistry().getEffectiveNodeType(NameConstants.MIX_REFERENCEABLE).getApplicablePropertyDef(
+                    NameConstants.JCR_UUID, PropertyType.STRING, false).getId();
+            idJcrPrimaryType = context.getNodeTypeRegistry().getEffectiveNodeType(NameConstants.NT_BASE).getApplicablePropertyDef(
+                    NameConstants.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId();
+            idJcrMixinTypes = context.getNodeTypeRegistry().getEffectiveNodeType(NameConstants.NT_BASE).getApplicablePropertyDef(
+                    NameConstants.JCR_MIXINTYPES, PropertyType.NAME, true).getId();
         }
     }
 
@@ -443,25 +444,25 @@
         PropertyState state = bundle.createPropertyState(this, id.getName());
         if (state == null) {
             // check if autocreated property state
-            if (id.getName().equals(QName.JCR_UUID)) {
+            if (id.getName().equals(NameConstants.JCR_UUID)) {
                 state = createNew(id);
                 state.setType(PropertyType.STRING);
                 state.setDefinitionId(idJcrUUID);
                 state.setMultiValued(false);
                 state.setValues(new InternalValue[]{InternalValue.create(id.getParentId().getUUID().toString())});
-            } else if (id.getName().equals(QName.JCR_PRIMARYTYPE)) {
+            } else if (id.getName().equals(NameConstants.JCR_PRIMARYTYPE)) {
                 state = createNew(id);
                 state.setType(PropertyType.NAME);
                 state.setDefinitionId(idJcrPrimaryType);
                 state.setMultiValued(false);
                 state.setValues(new InternalValue[]{InternalValue.create(bundle.getNodeTypeName())});
-            } else if (id.getName().equals(QName.JCR_MIXINTYPES)) {
+            } else if (id.getName().equals(NameConstants.JCR_MIXINTYPES)) {
                 Set mixins = bundle.getMixinTypeNames();
                 state = createNew(id);
                 state.setType(PropertyType.NAME);
                 state.setDefinitionId(idJcrMixinTypes);
                 state.setMultiValued(true);
-                state.setValues(InternalValue.create((QName[]) mixins.toArray(new QName[mixins.size()])));
+                state.setValues(InternalValue.create((Name[]) mixins.toArray(new Name[mixins.size()])));
             } else {
                 throw new NoSuchItemStateException(id.toString());
             }
@@ -557,9 +558,9 @@
             } else {
                 PropertyId id = (PropertyId) state.getId();
                 // skip primaryType pr mixinTypes properties
-                if (id.getName().equals(QName.JCR_PRIMARYTYPE)
-                    || id.getName().equals(QName.JCR_MIXINTYPES)
-                    || id.getName().equals(QName.JCR_UUID)) {
+                if (id.getName().equals(NameConstants.JCR_PRIMARYTYPE)
+                    || id.getName().equals(NameConstants.JCR_MIXINTYPES)
+                    || id.getName().equals(NameConstants.JCR_UUID)) {
                     continue;
                 }
                 NodeId nodeId = id.getParentId();
@@ -609,9 +610,9 @@
             if (!state.isNode()) {
                 PropertyId id = (PropertyId) state.getId();
                 // skip primaryType pr mixinTypes properties
-                if (id.getName().equals(QName.JCR_PRIMARYTYPE)
-                    || id.getName().equals(QName.JCR_MIXINTYPES)
-                    || id.getName().equals(QName.JCR_UUID)) {
+                if (id.getName().equals(NameConstants.JCR_PRIMARYTYPE)
+                    || id.getName().equals(NameConstants.JCR_MIXINTYPES)
+                    || id.getName().equals(NameConstants.JCR_UUID)) {
                     continue;
                 }
                 NodeId nodeId = id.getParentId();
Index: src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java	(working copy)
@@ -26,8 +26,9 @@
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import javax.jcr.PropertyType;
 import java.io.DataInputStream;
@@ -94,7 +95,7 @@
         c = state.getPropertyNames();
         out.writeInt(c.size()); // count
         for (Iterator iter = c.iterator(); iter.hasNext();) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             out.writeUTF(propName.toString());   // name
         }
         // child nodes (list of name/uuid pairs)
@@ -122,7 +123,7 @@
 
         // primaryType
         String s = in.readUTF();
-        state.setNodeTypeName(QName.valueOf(s));
+        state.setNodeTypeName(NameFactoryImpl.getInstance().create(s));
         // parentUUID (may be null)
         byte[] uuidBytes = new byte[UUID.UUID_BYTE_LENGTH];
         in.readFully(uuidBytes);
@@ -136,7 +137,7 @@
         int count = in.readInt();   // count
         Set set = new HashSet(count);
         for (int i = 0; i < count; i++) {
-            set.add(QName.valueOf(in.readUTF())); // name
+            set.add(NameFactoryImpl.getInstance().create(in.readUTF())); // name
         }
         if (set.size() > 0) {
             state.setMixinTypeNames(set);
@@ -147,12 +148,12 @@
         // properties (names)
         count = in.readInt();   // count
         for (int i = 0; i < count; i++) {
-            state.addPropertyName(QName.valueOf(in.readUTF())); // name
+            state.addPropertyName(NameFactoryImpl.getInstance().create(in.readUTF())); // name
         }
         // child nodes (list of name/uuid pairs)
         count = in.readInt();   // count
         for (int i = 0; i < count; i++) {
-            QName name = QName.valueOf(in.readUTF());    // name
+            Name name = NameFactoryImpl.getInstance().create(in.readUTF());    // name
             // uuid
             in.readFully(uuidBytes);
             state.addChildNodeEntry(name, new NodeId(new UUID(uuidBytes)));
Index: src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java	(working copy)
@@ -36,7 +36,7 @@
 import org.apache.jackrabbit.core.persistence.util.Serializer;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -147,7 +147,7 @@
         this.persistent = Boolean.valueOf(persistent).booleanValue();
     }
 
-    protected static String buildBlobFilePath(String parentUUID, QName propName, int index) {
+    protected static String buildBlobFilePath(String parentUUID, Name propName, int index) {
         StringBuffer sb = new StringBuffer();
         char[] chars = parentUUID.toCharArray();
         int cnt = 0;
Index: src/main/java/org/apache/jackrabbit/core/SessionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(working copy)
@@ -89,11 +89,14 @@
 import org.apache.jackrabbit.core.xml.SAXParserProvider;
 import org.apache.jackrabbit.core.xml.SessionImporter;
 import org.apache.jackrabbit.core.xml.SysViewSAXEventGenerator;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
 import org.slf4j.Logger;
@@ -184,6 +187,11 @@
     protected final LocalNamespaceMappings nsMappings;
 
     /**
+     * Name and Path resolver
+     */
+    protected final NamePathResolver namePathResolver;
+
+    /**
      * The version manager for this session
      */
     protected final VersionManager versionMgr;
@@ -248,7 +256,8 @@
         }
         this.subject = subject;
         nsMappings = new LocalNamespaceMappings(rep.getNamespaceRegistry());
-        ntMgr = new NodeTypeManagerImpl(rep.getNodeTypeRegistry(), rep.getNamespaceRegistry(), getNamespaceResolver(), rep.getDataStore());
+        namePathResolver = new DefaultNamePathResolver(nsMappings, true);
+        ntMgr = new NodeTypeManagerImpl(rep.getNodeTypeRegistry(), rep.getNamespaceRegistry(), getNamespaceResolver(), getNamePathResolver(), rep.getDataStore());
         String wspName = wspConfig.getName();
         wsp = createWorkspaceInstance(wspConfig,
                 rep.getWorkspaceStateManager(wspName), rep, this);
@@ -400,6 +409,15 @@
     }
 
     /**
+     * Returns the <code>NamePathResolver</code> of this session.
+     *
+     * @return the <code>NamePathResolver</code> of this session
+     */
+    public NamePathResolver getNamePathResolver() {
+        return namePathResolver;
+    }
+
+    /**
      * Returns the <code>SessionItemStateManager</code> associated with this session.
      *
      * @return the <code>SessionItemStateManager</code> associated with this session
@@ -445,7 +463,7 @@
         // check for mix:referenceable seems therefore to be a reasonable
         // compromise in order to improve performance.
 /*
-        if (node.isNodeType(QName.MIX_REFERENCEABLE)) {
+        if (node.isNodeType(Name.MIX_REFERENCEABLE)) {
             return node;
         } else {
             // there is a node with that uuid but the node does not expose it
@@ -583,22 +601,22 @@
 
     //--------------------------------------------------------< NameResolver >
 
-    public String getJCRName(QName name) throws NamespaceException {
-        return nsMappings.getNameResolver().getJCRName(name);
+    public String getJCRName(Name name) throws NamespaceException {
+        return namePathResolver.getJCRName(name);
     }
 
-    public QName getQName(String name) throws NameException, NamespaceException {
-        return nsMappings.getNameResolver().getQName(name);
+    public Name getQName(String name) throws IllegalNameException, NamespaceException {
+        return namePathResolver.getQName(name);
     }
 
     //--------------------------------------------------------< PathResolver >
 
     public String getJCRPath(Path path) throws NamespaceException {
-        return nsMappings.getPathResolver().getJCRPath(path);
+        return namePathResolver.getJCRPath(path);
     }
 
-    public Path getQPath(String path) throws NameException, NamespaceException {
-        return nsMappings.getPathResolver().getQPath(path);
+    public Path getQPath(String path) throws MalformedPathException, IllegalNameException, NamespaceException {
+        return namePathResolver.getQPath(path);
     }
 
     //--------------------------------------------------------------< Session >
@@ -887,7 +905,7 @@
         // check paths & get node instances
 
         Path srcPath;
-        Path.PathElement srcName;
+        Path.Element srcName;
         Path srcParentPath;
         NodeImpl targetNode;
         NodeImpl srcParentNode;
@@ -913,7 +931,7 @@
         }
 
         Path destPath;
-        Path.PathElement destName;
+        Path.Element destName;
         Path destParentPath;
         NodeImpl destParentNode;
         try {
Index: src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/LocalNamespaceMappings.java	(working copy)
@@ -16,16 +16,10 @@
  */
 package org.apache.jackrabbit.core;
 
-import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NameResolver;
-import org.apache.jackrabbit.name.NamespaceListener;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.ParsingNameResolver;
-import org.apache.jackrabbit.name.ParsingPathResolver;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameCache;
+import org.apache.jackrabbit.namespace.AbstractNamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceListener;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.XMLChar;
 
 import javax.jcr.NamespaceException;
@@ -49,7 +43,7 @@
  * underlying namespace registry.
  */
 class LocalNamespaceMappings extends AbstractNamespaceResolver
-        implements NamespaceListener, NameCache {
+        implements NamespaceListener {
 
     /** The underlying global and persistent namespace registry. */
     private final NamespaceRegistryImpl nsReg;
@@ -60,10 +54,6 @@
     /** URI to prefix mappings of local namespaces. */
     private final HashMap uriToPrefix = new HashMap();
 
-    private final NameResolver nameResolver;
-
-    private final PathResolver pathResolver;
-
     /**
      * Creates a local namespace manager with the given underlying
      * namespace registry.
@@ -73,8 +63,6 @@
     LocalNamespaceMappings(NamespaceRegistryImpl nsReg) {
         this.nsReg = nsReg;
         this.nsReg.addListener(this);
-        nameResolver = new ParsingNameResolver(this);
-        pathResolver = new ParsingPathResolver(nameResolver);
     }
 
     /**
@@ -90,16 +78,16 @@
         if (prefix == null || uri == null) {
             throw new IllegalArgumentException("prefix/uri can not be null");
         }
-        if (QName.NS_EMPTY_PREFIX.equals(prefix)
-                || QName.NS_DEFAULT_URI.equals(uri)) {
+        if (Name.NS_EMPTY_PREFIX.equals(prefix)
+                || Name.NS_DEFAULT_URI.equals(uri)) {
             throw new NamespaceException("default namespace is reserved and can not be changed");
         }
         // special case: xml namespace
-        if (uri.equals(QName.NS_XML_URI)) {
+        if (uri.equals(Name.NS_XML_URI)) {
             throw new NamespaceException("xml namespace is reserved and can not be changed.");
         }
         // special case: prefixes xml*
-        if (prefix.toLowerCase().startsWith(QName.NS_XML_PREFIX)) {
+        if (prefix.toLowerCase().startsWith(Name.NS_XML_PREFIX)) {
             throw new NamespaceException("reserved prefix: " + prefix);
         }
         // check if the prefix is a valid XML prefix
@@ -168,60 +156,6 @@
         nsReg.removeListener(this);
     }
 
-    public NameResolver getNameResolver() {
-        if (prefixToURI.isEmpty()) {
-            return nsReg.getNameResolver();
-        } else {
-            return nameResolver;
-        }
-    }
-
-    public PathResolver getPathResolver() {
-        if (prefixToURI.isEmpty()) {
-            return nsReg.getPathResolver();
-        } else {
-            return pathResolver;
-        }
-    }
-
-    //-------------------------------------------------------------< NameCache >
-
-    /**
-     * {@inheritDoc}
-     */
-    public QName retrieveName(String jcrName) {
-        try {
-            return getNameResolver().getQName(jcrName);
-        } catch (NameException e) {
-            return null;
-        } catch (NamespaceException e) {
-            return null;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String retrieveName(QName name) {
-        try {
-            return getNameResolver().getJCRName(name);
-        } catch (NamespaceException e) {
-            return null;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void cacheName(String jcrName, QName name) {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void evictAllNames() {
-    }
-
     //-----------------------------------------------------< NamespaceResolver >
     /**
      * {@inheritDoc}
Index: src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/PropertyImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/PropertyImpl.java	(working copy)
@@ -21,8 +21,8 @@
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.value.BooleanValue;
 import org.apache.jackrabbit.value.DateValue;
@@ -30,6 +30,7 @@
 import org.apache.jackrabbit.value.LongValue;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -168,7 +169,7 @@
                 return value.toString().length();
 
             case PropertyType.NAME:
-                QName name = value.getQName();
+                Name name = value.getQName();
                 return session.getJCRName(name).length();
 
             case PropertyType.PATH:
@@ -291,7 +292,7 @@
 
     /**
      * Same as <code>{@link Property#setValue(String)}</code> except that
-     * this method takes a <code>QName</code> instead of a <code>String</code>
+     * this method takes a <code>Name</code> instead of a <code>String</code>
      * value.
      *
      * @param name
@@ -301,7 +302,7 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public void setValue(QName name)
+    public void setValue(Name name)
             throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException,
             RepositoryException {
@@ -326,10 +327,10 @@
         if (reqType != PropertyType.NAME) {
             // type conversion required
             Value targetValue = ValueHelper.convert(
-                    InternalValue.create(name).toJCRValue(session.getNamespaceResolver()),
+                    InternalValue.create(name).toJCRValue(session.getNamePathResolver()),
                     reqType,
                     ValueFactoryImpl.getInstance());
-            internalValue = InternalValue.create(targetValue, session.getNamespaceResolver(), rep.getDataStore());
+            internalValue = InternalValue.create(targetValue, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             internalValue = InternalValue.create(name);
@@ -340,7 +341,7 @@
 
     /**
      * Same as <code>{@link Property#setValue(String[])}</code> except that
-     * this method takes an array of <code>QName</code> instead of
+     * this method takes an array of <code>Name</code> instead of
      * <code>String</code> values.
      *
      * @param names
@@ -350,7 +351,7 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public void setValue(QName[] names)
+    public void setValue(Name[] names)
             throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException,
             RepositoryException {
@@ -371,16 +372,16 @@
         if (names != null) {
             internalValues = new InternalValue[names.length];
             for (int i = 0; i < names.length; i++) {
-                QName name = names[i];
+                Name name = names[i];
                 InternalValue internalValue = null;
                 if (name != null) {
                     if (reqType != PropertyType.NAME) {
                         // type conversion required
                         Value targetValue = ValueHelper.convert(
-                                InternalValue.create(name).toJCRValue(session.getNamespaceResolver()),
+                                InternalValue.create(name).toJCRValue(session.getNamePathResolver()),
                                 reqType,
                                 ValueFactoryImpl.getInstance());
-                        internalValue = InternalValue.create(targetValue, session.getNamespaceResolver(), rep.getDataStore());
+                        internalValue = InternalValue.create(targetValue, session.getNamePathResolver(), rep.getDataStore());
                     } else {
                         // no type conversion required
                         internalValue = InternalValue.create(name);
@@ -396,7 +397,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getQName() {
+    public Name getQName() {
         return ((PropertyId) id).getName();
     }
 
@@ -458,7 +459,7 @@
         InternalValue[] internalValues = state.getValues();
         Value[] values = new Value[internalValues.length];
         for (int i = 0; i < internalValues.length; i++) {
-            values[i] = internalValues[i].toJCRValue(session.getNamespaceResolver());
+            values[i] = internalValues[i].toJCRValue(session.getNamePathResolver());
         }
         return values;
     }
@@ -479,7 +480,7 @@
         PropertyState state = (PropertyState) getItemState();
         try {
             InternalValue val = state.getValues()[0];
-            return val.toJCRValue(session.getNamespaceResolver());
+            return val.toJCRValue(session.getNamePathResolver());
         } catch (RepositoryException e) {
             throw e;
         } catch (Exception e) {
@@ -542,7 +543,7 @@
             return val.getLong();
         }
         // not a LONG value, delegate conversion to Value object
-        return val.toJCRValue(session.getNamespaceResolver()).getLong();
+        return val.toJCRValue(session.getNamePathResolver()).getLong();
     }
 
     /**
@@ -566,7 +567,7 @@
             return val.getDouble();
         }
         // not a DOUBLE value, delegate conversion to Value object
-        return val.toJCRValue(session.getNamespaceResolver()).getDouble();
+        return val.toJCRValue(session.getNamePathResolver()).getDouble();
     }
 
     /**
@@ -590,7 +591,7 @@
             return val.getDate();
         }
         // not a DATE value, delegate conversion to Value object
-        return val.toJCRValue(session.getNamespaceResolver()).getDate();
+        return val.toJCRValue(session.getNamePathResolver()).getDate();
     }
 
     /**
@@ -614,7 +615,7 @@
             return val.getBoolean();
         }
         // not a BOOLEAN value, delegate conversion to Value object
-        return val.toJCRValue(session.getNamespaceResolver()).getBoolean();
+        return val.toJCRValue(session.getNamePathResolver()).getBoolean();
     }
 
     /**
@@ -671,7 +672,7 @@
             Value targetVal = ValueHelper.convert(
                     new DateValue(date), reqType,
                     ValueFactoryImpl.getInstance());
-            value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+            value = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             value = InternalValue.create(date);
@@ -705,7 +706,7 @@
             Value targetVal = ValueHelper.convert(
                     new DoubleValue(number), reqType,
                     ValueFactoryImpl.getInstance());
-            value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+            value = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             value = InternalValue.create(number);
@@ -743,10 +744,10 @@
             value = InternalValue.createTemporary(stream, rep.getDataStore());
             if (reqType != PropertyType.BINARY) {
                 // type conversion required
-                Value jcrValue = value.toJCRValue(session.getNamespaceResolver());
+                Value jcrValue = value.toJCRValue(session.getNamePathResolver());
                 Value targetVal = ValueHelper.convert(
                         jcrValue, reqType, ValueFactoryImpl.getInstance());
-                value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+                value = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
             }
         } catch (IOException ioe) {
             String msg = "failed to spool stream to internal storage";
@@ -787,7 +788,7 @@
             Value targetValue = ValueHelper.convert(
                     string, reqType,
                     ValueFactoryImpl.getInstance());
-            internalValue = InternalValue.create(targetValue, session.getNamespaceResolver(), rep.getDataStore());
+            internalValue = InternalValue.create(targetValue, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             internalValue = InternalValue.create(string);
@@ -827,7 +828,7 @@
                         Value targetValue = ValueHelper.convert(
                                 string, reqType,
                                 ValueFactoryImpl.getInstance());
-                        internalValue = InternalValue.create(targetValue, session.getNamespaceResolver(), rep.getDataStore());
+                        internalValue = InternalValue.create(targetValue, session.getNamePathResolver(), rep.getDataStore());
                     } else {
                         // no type conversion required
                         internalValue = InternalValue.create(string);
@@ -865,7 +866,7 @@
             Value targetVal = ValueHelper.convert(
                     new BooleanValue(b), reqType,
                     ValueFactoryImpl.getInstance());
-            value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+            value = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             value = InternalValue.create(b);
@@ -901,7 +902,7 @@
         if (reqType == PropertyType.REFERENCE) {
             if (target instanceof NodeImpl) {
                 NodeImpl targetNode = (NodeImpl) target;
-                if (targetNode.isNodeType(QName.MIX_REFERENCEABLE)) {
+                if (targetNode.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
                     InternalValue value = InternalValue.create(new UUID(targetNode.getUUID()));
                     internalSetValue(new InternalValue[]{value}, reqType);
                 } else {
@@ -941,7 +942,7 @@
             Value targetVal = ValueHelper.convert(
                     new LongValue(number), reqType,
                     ValueFactoryImpl.getInstance());
-            value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+            value = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
             value = InternalValue.create(number);
@@ -984,10 +985,10 @@
             Value targetVal = ValueHelper.convert(
                     value, reqType,
                     ValueFactoryImpl.getInstance());
-            internalValue = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+            internalValue = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
         } else {
             // no type conversion required
-            internalValue = InternalValue.create(value, session.getNamespaceResolver(), rep.getDataStore());
+            internalValue = InternalValue.create(value, session.getNamePathResolver(), rep.getDataStore());
         }
         internalSetValue(new InternalValue[]{internalValue}, reqType);
     }
@@ -1044,10 +1045,10 @@
                         Value targetVal = ValueHelper.convert(
                                 value, reqType,
                                 ValueFactoryImpl.getInstance());
-                        internalValue = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
+                        internalValue = InternalValue.create(targetVal, session.getNamePathResolver(), rep.getDataStore());
                     } else {
                         // no type conversion required
-                        internalValue = InternalValue.create(value, session.getNamespaceResolver(), rep.getDataStore());
+                        internalValue = InternalValue.create(value, session.getNamePathResolver(), rep.getDataStore());
                     }
                 }
                 internalValues[i] = internalValue;
Index: src/main/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java	(working copy)
@@ -33,9 +33,10 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.ItemStateReferenceMap;
 import org.apache.jackrabbit.core.state.ItemStateListener;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.util.WeakIdentityCollection;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -251,7 +252,7 @@
      * {@inheritDoc}
      */
     public VirtualPropertyState createPropertyState(VirtualNodeState parent,
-                                                    QName name, int type,
+                                                    Name name, int type,
                                                     boolean multiValued)
             throws RepositoryException {
         PropDef def = getApplicablePropertyDef(parent, name, type, multiValued);
@@ -266,8 +267,8 @@
     /**
      * {@inheritDoc}
      */
-    public VirtualNodeState createNodeState(VirtualNodeState parent, QName name,
-                                            NodeId id, QName nodeTypeName)
+    public VirtualNodeState createNodeState(VirtualNodeState parent, Name name,
+                                            NodeId id, Name nodeTypeName)
             throws RepositoryException {
 
         NodeDefId def;
@@ -276,7 +277,7 @@
         } catch (RepositoryException re) {
             // hack, use nt:unstructured as parent
             NodeTypeRegistry ntReg = getNodeTypeRegistry();
-            EffectiveNodeType ent = ntReg.getEffectiveNodeType(QName.NT_UNSTRUCTURED);
+            EffectiveNodeType ent = ntReg.getEffectiveNodeType(NameConstants.NT_UNSTRUCTURED);
             NodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName, ntReg);
             ntReg.getNodeDef(cnd.getId());
             def = cnd.getId();
@@ -287,7 +288,7 @@
         if (id == null) {
             id = new NodeId(UUID.randomUUID());
         }
-        state = new VirtualNodeState(this, parent.getNodeId(), id, nodeTypeName, new QName[0]);
+        state = new VirtualNodeState(this, parent.getNodeId(), id, nodeTypeName, new Name[0]);
         state.setDefinitionId(def);
 
         cache(state);
@@ -376,7 +377,7 @@
      * @return
      * @throws RepositoryException
      */
-    protected PropDef getApplicablePropertyDef(NodeState parent, QName propertyName,
+    protected PropDef getApplicablePropertyDef(NodeState parent, Name propertyName,
                                                int type, boolean multiValued)
             throws RepositoryException {
         return getEffectiveNodeType(parent).getApplicablePropertyDef(propertyName, type, multiValued);
@@ -390,7 +391,7 @@
      * @return
      * @throws RepositoryException
      */
-    protected NodeDef getApplicableChildNodeDef(NodeState parent, QName nodeName, QName nodeTypeName)
+    protected NodeDef getApplicableChildNodeDef(NodeState parent, Name nodeName, Name nodeTypeName)
             throws RepositoryException {
         return getEffectiveNodeType(parent).getApplicableChildNodeDef(
                 nodeName, nodeTypeName, getNodeTypeRegistry());
@@ -411,7 +412,7 @@
         // primary type
         set.add(parent.getNodeTypeName());
         try {
-            return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            return ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             String msg = "internal error: failed to build effective node type for node " + parent.getNodeId();
             throw new RepositoryException(msg, ntce);
Index: src/main/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java	(working copy)
@@ -21,7 +21,7 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.ItemStateListener;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.RepositoryException;
 
@@ -56,7 +56,7 @@
      * @throws RepositoryException
      */
     VirtualPropertyState createPropertyState(VirtualNodeState parent,
-                                             QName name, int type,
+                                             Name name, int type,
                                              boolean multiValued)
             throws RepositoryException;
 
@@ -70,8 +70,8 @@
      * @return
      * @throws RepositoryException
      */
-    VirtualNodeState createNodeState(VirtualNodeState parent, QName name,
-                                     NodeId id, QName nodeTypeName)
+    VirtualNodeState createNodeState(VirtualNodeState parent, Name name,
+                                     NodeId id, Name nodeTypeName)
         throws RepositoryException;
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/virtual/VirtualNodeState.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/virtual/VirtualNodeState.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/virtual/VirtualNodeState.java	(working copy)
@@ -21,7 +21,8 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -60,14 +61,14 @@
     public VirtualNodeState(AbstractVISProvider stateMgr,
                             NodeId parentId,
                             NodeId id,
-                            QName nodeTypeName,
-                            QName[] mixins)
+                            Name nodeTypeName,
+                            Name[] mixins)
             throws RepositoryException {
         super(id, nodeTypeName, parentId, ItemState.STATUS_EXISTING, false);
         this.stateMgr = stateMgr;
         setContainer(stateMgr);
         // add default properties
-        setPropertyValue(QName.JCR_PRIMARYTYPE, InternalValue.create(nodeTypeName));
+        setPropertyValue(NameConstants.JCR_PRIMARYTYPE, InternalValue.create(nodeTypeName));
         setMixinNodeTypes(mixins);
     }
 
@@ -87,7 +88,7 @@
      * @param name
      * @return the values
      */
-    public InternalValue[] getPropertyValues(QName name) throws NoSuchItemStateException {
+    public InternalValue[] getPropertyValues(Name name) throws NoSuchItemStateException {
         VirtualPropertyState ps = getProperty(name);
         if (ps == null) {
             return null;
@@ -102,7 +103,7 @@
      * @param name
      * @return the value
      */
-    public InternalValue getPropertyValue(QName name) throws NoSuchItemStateException {
+    public InternalValue getPropertyValue(Name name) throws NoSuchItemStateException {
         VirtualPropertyState ps = getProperty(name);
         if (ps == null || ps.getValues().length == 0) {
             return null;
@@ -118,7 +119,7 @@
      * @return
      * @throws NoSuchItemStateException
      */
-    public VirtualPropertyState getProperty(QName name) throws NoSuchItemStateException {
+    public VirtualPropertyState getProperty(Name name) throws NoSuchItemStateException {
         return (VirtualPropertyState) properties.get(name);
     }
 
@@ -129,7 +130,7 @@
      * @param value
      * @throws javax.jcr.RepositoryException
      */
-    public void setPropertyValue(QName name, InternalValue value)
+    public void setPropertyValue(Name name, InternalValue value)
             throws RepositoryException {
         setPropertyValues(name, value.getType(), new InternalValue[]{value}, false);
     }
@@ -142,7 +143,7 @@
      * @param values
      * @throws RepositoryException
      */
-    public void setPropertyValues(QName name, int type, InternalValue[] values)
+    public void setPropertyValues(Name name, int type, InternalValue[] values)
             throws RepositoryException {
         setPropertyValues(name, type, values, true);
     }
@@ -155,7 +156,7 @@
      * @param values
      * @throws RepositoryException
      */
-    public void setPropertyValues(QName name, int type, InternalValue[] values, boolean multiple)
+    public void setPropertyValues(Name name, int type, InternalValue[] values, boolean multiple)
             throws RepositoryException {
         VirtualPropertyState prop = getOrCreatePropertyState(name, type, multiple);
         prop.setValues(values);
@@ -170,7 +171,7 @@
      * @return
      * @throws RepositoryException
      */
-    protected VirtualPropertyState getOrCreatePropertyState(QName name, int type, boolean multiValued)
+    protected VirtualPropertyState getOrCreatePropertyState(Name name, int type, boolean multiValued)
             throws RepositoryException {
 
         VirtualPropertyState prop = (VirtualPropertyState) properties.get(name);
@@ -188,7 +189,7 @@
      * @param mixins
      * @throws RepositoryException
      */
-    public void setMixinNodeTypes(QName[] mixins) throws RepositoryException {
+    public void setMixinNodeTypes(Name[] mixins) throws RepositoryException {
         if (mixins != null) {
             HashSet set = new HashSet();
             InternalValue[] values = new InternalValue[mixins.length];
@@ -197,7 +198,7 @@
                 values[i] = InternalValue.create(mixins[i]);
             }
             setMixinTypeNames(set);
-            setPropertyValues(QName.JCR_MIXINTYPES, PropertyType.NAME, values);
+            setPropertyValues(NameConstants.JCR_MIXINTYPES, PropertyType.NAME, values);
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/virtual/VirtualValueProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/virtual/VirtualValueProvider.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/virtual/VirtualValueProvider.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.virtual;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * A <code>VirtualValueProvider</code> is used for virtual properties that
@@ -30,6 +30,6 @@
      * @param propName the name of the property
      * @return the values
      */
-    InternalValue[] getVirtualValues(QName propName);
+    InternalValue[] getVirtualValues(Name propName);
 
 }
Index: src/main/java/org/apache/jackrabbit/core/NodeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(working copy)
@@ -42,14 +42,17 @@
 import org.apache.jackrabbit.core.version.DateVersionSelector;
 import org.apache.jackrabbit.core.version.VersionImpl;
 import org.apache.jackrabbit.core.lock.LockManager;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ChildrenCollectorFilter;
 import org.apache.jackrabbit.util.IteratorHelper;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.value.ValueHelper;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -103,7 +106,7 @@
     private static Logger log = LoggerFactory.getLogger(NodeImpl.class);
 
     /** same as ((NodeState) state).getNodeTypeName(); cached to avoid type casts */
-    protected final QName primaryTypeName;
+    protected final Name primaryTypeName;
 
     /** the definition of this node */
     protected NodeDefinition definition;
@@ -137,7 +140,7 @@
              */
             log.warn("Fallback to nt:unstructured due to unknown node type '"
                     + state.getNodeTypeName() + "' of node " + safeGetJCRPath());
-            primaryTypeName = QName.NT_UNSTRUCTURED;
+            primaryTypeName = NameConstants.NT_UNSTRUCTURED;
         }
     }
 
@@ -161,7 +164,7 @@
              * have to build & resolve absolute path)
              */
             if (relPath.indexOf('/') == -1) {
-                QName propName = session.getQName(relPath);
+                Name propName = session.getQName(relPath);
                 // check if property entry exists
                 NodeState thisState = (NodeState) state;
                 if (thisState.hasPropertyName(propName)) {
@@ -175,7 +178,7 @@
              * build and resolve absolute path
              */
             Path p =
-                Path.create(getPrimaryPath(), session.getQPath(relPath), false)
+                PathFactoryImpl.getInstance().create(getPrimaryPath(), session.getQPath(relPath), false)
                 .getCanonicalPath();
             ItemId id = session.getHierarchyManager().resolvePath(p);
             if (id == null) {
@@ -216,7 +219,7 @@
              */
             Path p = session.getQPath(relPath);
             if (p.getLength() == 1) {
-                Path.PathElement pe = p.getNameElement();
+                Path.Element pe = p.getNameElement();
                 if (pe.denotesName()) {
                     // check if node entry exists
                     NodeState thisState = (NodeState) state;
@@ -237,7 +240,7 @@
             /**
              * build and resolve absolute path
              */
-            p = Path.create(getPrimaryPath(), p, true);
+            p = PathFactoryImpl.getInstance().create(getPrimaryPath(), p, true);
             ItemId id = session.getHierarchyManager().resolvePath(p);
             if (id == null) {
                 // path not found
@@ -299,7 +302,7 @@
      * @return
      * @throws RepositoryException
      */
-    protected InternalValue[] computeSystemGeneratedPropertyValues(QName name,
+    protected InternalValue[] computeSystemGeneratedPropertyValues(Name name,
                                                                    PropertyDefinitionImpl def)
             throws RepositoryException {
         InternalValue[] genValues = null;
@@ -313,9 +316,9 @@
 
         // compute system generated values
         NodeTypeImpl nt = (NodeTypeImpl) def.getDeclaringNodeType();
-        if (nt.getQName().equals(QName.MIX_REFERENCEABLE)) {
+        if (nt.getQName().equals(NameConstants.MIX_REFERENCEABLE)) {
             // mix:referenceable node type
-            if (name.equals(QName.JCR_UUID)) {
+            if (name.equals(NameConstants.JCR_UUID)) {
                 // jcr:uuid property
                 genValues = new InternalValue[]{
                         InternalValue.create(thisState.getNodeId().getUUID().toString())
@@ -340,36 +343,36 @@
                genValues = new InternalValue[]{InternalValue.create(new UUID(hist.getRootVersion().getUUID()))};
            }
 */
-        } else if (nt.getQName().equals(QName.NT_HIERARCHYNODE)) {
+        } else if (nt.getQName().equals(NameConstants.NT_HIERARCHYNODE)) {
             // nt:hierarchyNode node type
-            if (name.equals(QName.JCR_CREATED)) {
+            if (name.equals(NameConstants.JCR_CREATED)) {
                 // jcr:created property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
-        } else if (nt.getQName().equals(QName.NT_RESOURCE)) {
+        } else if (nt.getQName().equals(NameConstants.NT_RESOURCE)) {
             // nt:resource node type
-            if (name.equals(QName.JCR_LASTMODIFIED)) {
+            if (name.equals(NameConstants.JCR_LASTMODIFIED)) {
                 // jcr:lastModified property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
-        } else if (nt.getQName().equals(QName.NT_VERSION)) {
+        } else if (nt.getQName().equals(NameConstants.NT_VERSION)) {
             // nt:version node type
-            if (name.equals(QName.JCR_CREATED)) {
+            if (name.equals(NameConstants.JCR_CREATED)) {
                 // jcr:created property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
-        } else if (nt.getQName().equals(QName.NT_BASE)) {
+        } else if (nt.getQName().equals(NameConstants.NT_BASE)) {
             // nt:base node type
-            if (name.equals(QName.JCR_PRIMARYTYPE)) {
+            if (name.equals(NameConstants.JCR_PRIMARYTYPE)) {
                 // jcr:primaryType property
                 genValues = new InternalValue[]{InternalValue.create(primaryTypeName)};
-            } else if (name.equals(QName.JCR_MIXINTYPES)) {
+            } else if (name.equals(NameConstants.JCR_MIXINTYPES)) {
                 // jcr:mixinTypes property
                 Set mixins = thisState.getMixinTypeNames();
                 ArrayList values = new ArrayList(mixins.size());
                 Iterator iter = mixins.iterator();
                 while (iter.hasNext()) {
-                    values.add(InternalValue.create((QName) iter.next()));
+                    values.add(InternalValue.create((Name) iter.next()));
                 }
                 genValues = (InternalValue[]) values.toArray(new InternalValue[values.size()]);
             }
@@ -414,7 +417,7 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    protected synchronized PropertyImpl getOrCreateProperty(QName name, int type,
+    protected synchronized PropertyImpl getOrCreateProperty(Name name, int type,
                                                             boolean multiValued,
                                                             boolean exactTypeMatch,
                                                             BitSet status)
@@ -469,7 +472,7 @@
         }
     }
 
-    protected synchronized PropertyImpl createChildProperty(QName name, int type,
+    protected synchronized PropertyImpl createChildProperty(Name name, int type,
                                                             PropertyDefinitionImpl def)
             throws RepositoryException {
         // check for name collisions with existing child nodes
@@ -515,7 +518,7 @@
         return prop;
     }
 
-    protected synchronized NodeImpl createChildNode(QName name,
+    protected synchronized NodeImpl createChildNode(Name name,
                                                     NodeDefinitionImpl def,
                                                     NodeTypeImpl nodeType,
                                                     NodeId id)
@@ -571,8 +574,8 @@
         return node;
     }
 
-    protected void renameChildNode(QName oldName, int index, NodeId id,
-                                   QName newName)
+    protected void renameChildNode(Name oldName, int index, NodeId id,
+                                   Name newName)
             throws RepositoryException {
         // modify the state of 'this', i.e. the parent node
         NodeState thisState = (NodeState) getOrCreateTransientItemState();
@@ -588,7 +591,7 @@
         }
     }
 
-    protected void removeChildProperty(QName propName) throws RepositoryException {
+    protected void removeChildProperty(Name propName) throws RepositoryException {
         // modify the state of 'this', i.e. the parent node
         NodeState thisState = (NodeState) getOrCreateTransientItemState();
 
@@ -605,7 +608,7 @@
         itemMgr.getItem(propId).setRemoved();
     }
 
-    protected void removeChildNode(QName nodeName, int index)
+    protected void removeChildNode(Name nodeName, int index)
             throws RepositoryException {
         // modify the state of 'this', i.e. the parent node
         NodeState thisState = (NodeState) getOrCreateTransientItemState();
@@ -670,7 +673,7 @@
         // use temp set to avoid ConcurrentModificationException
         HashSet tmp = new HashSet(thisState.getPropertyNames());
         for (Iterator iter = tmp.iterator(); iter.hasNext();) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             // remove the property entry
             thisState.removePropertyName(propName);
             // remove property
@@ -694,11 +697,11 @@
             throws ItemExistsException, PathNotFoundException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
         Path nodePath;
-        QName nodeName;
+        Name nodeName;
         Path parentPath;
         try {
             nodePath =
-                Path.create(getPrimaryPath(), session.getQPath(relPath), false)
+                PathFactoryImpl.getInstance().create(getPrimaryPath(), session.getQPath(relPath), false)
                 .getCanonicalPath();
             if (nodePath.getNameElement().getIndex() != 0) {
                 String msg = "illegal subscript specified: " + nodePath;
@@ -742,20 +745,20 @@
         return parentNode.internalAddChildNode(nodeName, nodeType, id);
     }
 
-    protected NodeImpl internalAddChildNode(QName nodeName,
+    protected NodeImpl internalAddChildNode(Name nodeName,
                                             NodeTypeImpl nodeType)
             throws ItemExistsException, ConstraintViolationException,
             RepositoryException {
         return internalAddChildNode(nodeName, nodeType, null);
     }
 
-    protected NodeImpl internalAddChildNode(QName nodeName,
+    protected NodeImpl internalAddChildNode(Name nodeName,
                                             NodeTypeImpl nodeType, NodeId id)
             throws ItemExistsException, ConstraintViolationException,
             RepositoryException {
         Path nodePath;
         try {
-            nodePath = Path.create(getPrimaryPath(), nodeName, true);
+            nodePath = PathFactoryImpl.getInstance().create(getPrimaryPath(), nodeName, true);
         } catch (MalformedPathException e) {
             // should never happen
             String msg = "internal error: invalid path " + safeGetJCRPath();
@@ -765,7 +768,7 @@
 
         NodeDefinitionImpl def;
         try {
-            QName nodeTypeName = null;
+            Name nodeTypeName = null;
             if (nodeType != null) {
                 nodeTypeName = nodeType.getQName();
             }
@@ -815,18 +818,18 @@
         NodeState thisState = (NodeState) state;
         // get or create jcr:mixinTypes property
         PropertyImpl prop;
-        if (thisState.hasPropertyName(QName.JCR_MIXINTYPES)) {
-            prop = (PropertyImpl) itemMgr.getItem(new PropertyId(thisState.getNodeId(), QName.JCR_MIXINTYPES));
+        if (thisState.hasPropertyName(NameConstants.JCR_MIXINTYPES)) {
+            prop = (PropertyImpl) itemMgr.getItem(new PropertyId(thisState.getNodeId(), NameConstants.JCR_MIXINTYPES));
         } else {
             // find definition for the jcr:mixinTypes property and create property
             PropertyDefinitionImpl def = getApplicablePropertyDefinition(
-                    QName.JCR_MIXINTYPES, PropertyType.NAME, true, true);
-            prop = createChildProperty(QName.JCR_MIXINTYPES, PropertyType.NAME, def);
+                    NameConstants.JCR_MIXINTYPES, PropertyType.NAME, true, true);
+            prop = createChildProperty(NameConstants.JCR_MIXINTYPES, PropertyType.NAME, def);
         }
 
         if (mixinNames.isEmpty()) {
             // purge empty jcr:mixinTypes property
-            removeChildProperty(QName.JCR_MIXINTYPES);
+            removeChildProperty(NameConstants.JCR_MIXINTYPES);
             return;
         }
 
@@ -836,15 +839,15 @@
         Iterator iter = mixinNames.iterator();
         int cnt = 0;
         while (iter.hasNext()) {
-            vals[cnt++] = InternalValue.create((QName) iter.next());
+            vals[cnt++] = InternalValue.create((Name) iter.next());
         }
         prop.internalSetValue(vals, PropertyType.NAME);
     }
 
     /**
-     * Returns the <code>QName</code>s of this node's mixin types.
+     * Returns the <code>Name</code>s of this node's mixin types.
      *
-     * @return a set of the <code>QName</code>s of this node's mixin types.
+     * @return a set of the <code>Name</code>s of this node's mixin types.
      */
     public Set getMixinTypeNames() {
         return ((NodeState) state).getMixinTypeNames();
@@ -874,7 +877,7 @@
         // build effective node type of mixins & primary type
         NodeTypeRegistry ntReg = session.getNodeTypeManager().getNodeTypeRegistry();
 
-        QName[] types = new QName[mixins.size() + 1];
+        Name[] types = new Name[mixins.size() + 1];
         mixins.toArray(types);
         // primary type
         types[types.length - 1] = primaryTypeName;
@@ -899,8 +902,8 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    protected NodeDefinitionImpl getApplicableChildNodeDefinition(QName nodeName,
-                                                                  QName nodeTypeName)
+    protected NodeDefinitionImpl getApplicableChildNodeDefinition(Name nodeName,
+                                                                  Name nodeTypeName)
             throws ConstraintViolationException, RepositoryException {
         NodeTypeManagerImpl ntMgr = session.getNodeTypeManager();
         NodeDef cnd = getEffectiveNodeType().getApplicableChildNodeDef(
@@ -921,7 +924,7 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    protected PropertyDefinitionImpl getApplicablePropertyDefinition(QName propertyName,
+    protected PropertyDefinitionImpl getApplicablePropertyDefinition(Name propertyName,
                                                                      int type,
                                                                      boolean multiValued,
                                                                      boolean exactTypeMatch)
@@ -1008,11 +1011,11 @@
 
     /**
      * Same as {@link Node#addMixin(String)} except that it takes a
-     * <code>QName</code> instead of a <code>String</code>.
+     * <code>Name</code> instead of a <code>String</code>.
      *
      * @see Node#addMixin(String)
      */
-    public void addMixin(QName mixinName)
+    public void addMixin(Name mixinName)
             throws NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
         // check state of this instance
@@ -1056,7 +1059,7 @@
             // primary type
             set.add(primaryTypeName);
             // build effective node type representing primary type including existing mixin's
-            entExisting = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            entExisting = ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
             if (entExisting.includesNodeType(mixinName)) {
                 // new mixin is already included in existing mixin type(s)
                 return;
@@ -1065,7 +1068,7 @@
             // add new mixin
             set.add(mixinName);
             // try to build new effective node type (will throw in case of conflicts)
-            ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             throw new ConstraintViolationException(ntce.getMessage());
         }
@@ -1119,11 +1122,11 @@
 
     /**
      * Same as {@link Node#removeMixin(String)} except that it takes a
-     * <code>QName</code> instead of a <code>String</code>.
+     * <code>Name</code> instead of a <code>String</code>.
      *
      * @see Node#removeMixin(String)
      */
-    public void removeMixin(QName mixinName)
+    public void removeMixin(Name mixinName)
             throws NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
         // check state of this instance
@@ -1167,7 +1170,7 @@
             // primary type
             set.add(primaryTypeName);
             // build effective node type representing primary type including remaining mixin's
-            entRemaining = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            entRemaining = ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             throw new ConstraintViolationException(ntce.getMessage());
         }
@@ -1178,9 +1181,9 @@
          * it can only be removed if there no more references to this node
          */
         NodeTypeImpl mixin = ntMgr.getNodeType(mixinName);
-        if ((QName.MIX_REFERENCEABLE.equals(mixinName)
-                || mixin.isDerivedFrom(QName.MIX_REFERENCEABLE))
-                && !entRemaining.includesNodeType(QName.MIX_REFERENCEABLE)) {
+        if ((NameConstants.MIX_REFERENCEABLE.equals(mixinName)
+                || mixin.isDerivedFrom(NameConstants.MIX_REFERENCEABLE))
+                && !entRemaining.includesNodeType(NameConstants.MIX_REFERENCEABLE)) {
             // removing this mixin would effectively remove mix:referenceable:
             // make sure no references exist
             PropertyIterator iter = getReferences();
@@ -1211,7 +1214,7 @@
         // use temp set to avoid ConcurrentModificationException
         HashSet set = new HashSet(thisState.getPropertyNames());
         for (Iterator iter = set.iterator(); iter.hasNext();) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             PropertyImpl prop = (PropertyImpl) itemMgr.getItem(
                     new PropertyId(thisState.getNodeId(), propName));
             // check if property has been defined by mixin type (or one of its supertypes)
@@ -1242,13 +1245,13 @@
 
     /**
      * Same as {@link Node#isNodeType(String)} except that it takes a
-     * <code>QName</code> instead of a <code>String</code>.
+     * <code>Name</code> instead of a <code>String</code>.
      *
      * @param ntName name of node type
      * @return <code>true</code> if this node is of the specified node type;
      *         otherwise <code>false</code>
      */
-    public boolean isNodeType(QName ntName) throws RepositoryException {
+    public boolean isNodeType(Name ntName) throws RepositoryException {
         // check state of this instance
         sanityCheck();
 
@@ -1315,7 +1318,7 @@
      * @throws ValueFormatException
      * @throws RepositoryException
      */
-    protected Property internalSetProperty(QName name, InternalValue value)
+    protected Property internalSetProperty(Name name, InternalValue value)
             throws ValueFormatException, RepositoryException {
         int type;
         if (value == null) {
@@ -1356,7 +1359,7 @@
      * @throws ValueFormatException
      * @throws RepositoryException
      */
-    protected Property internalSetProperty(QName name, InternalValue[] values)
+    protected Property internalSetProperty(Name name, InternalValue[] values)
             throws ValueFormatException, RepositoryException {
         int type;
         if (values == null || values.length == 0
@@ -1382,7 +1385,7 @@
      * @throws ValueFormatException
      * @throws RepositoryException
      */
-    protected Property internalSetProperty(QName name, InternalValue[] values,
+    protected Property internalSetProperty(Name name, InternalValue[] values,
                                            int type)
             throws ValueFormatException, RepositoryException {
         BitSet status = new BitSet();
@@ -1410,7 +1413,7 @@
      *                               specified name.
      * @throws RepositoryException   If another error occurs.
      */
-    public NodeImpl getNode(QName name) throws ItemNotFoundException, RepositoryException {
+    public NodeImpl getNode(Name name) throws ItemNotFoundException, RepositoryException {
         return getNode(name, 1);
     }
 
@@ -1425,7 +1428,7 @@
      *                               specified name.
      * @throws RepositoryException   If another error occurs.
      */
-    public NodeImpl getNode(QName name, int index)
+    public NodeImpl getNode(Name name, int index)
             throws ItemNotFoundException, RepositoryException {
         // check state of this instance
         sanityCheck();
@@ -1454,7 +1457,7 @@
      * @return <code>true</code> if the child node exists; <code>false</code> otherwise.
      * @throws RepositoryException If an unspecified error occurs.
      */
-    public boolean hasNode(QName name) throws RepositoryException {
+    public boolean hasNode(Name name) throws RepositoryException {
         return hasNode(name, 1);
     }
 
@@ -1468,7 +1471,7 @@
      * @return <code>true</code> if the child node exists; <code>false</code> otherwise.
      * @throws RepositoryException If an unspecified error occurs.
      */
-    public boolean hasNode(QName name, int index) throws RepositoryException {
+    public boolean hasNode(Name name, int index) throws RepositoryException {
         // check state of this instance
         sanityCheck();
 
@@ -1493,7 +1496,7 @@
      *                               specified name.
      * @throws RepositoryException   If another error occurs.
      */
-    public PropertyImpl getProperty(QName name)
+    public PropertyImpl getProperty(Name name)
             throws ItemNotFoundException, RepositoryException {
         // check state of this instance
         sanityCheck();
@@ -1515,7 +1518,7 @@
      * @return <code>true</code> if the property exists; <code>false</code> otherwise.
      * @throws RepositoryException If an unspecified error occurs.
      */
-    public boolean hasProperty(QName name) throws RepositoryException {
+    public boolean hasProperty(Name name) throws RepositoryException {
         // check state of this instance
         sanityCheck();
 
@@ -1530,7 +1533,7 @@
 
     /**
      * Same as <code>{@link Node#addNode(String, String)}</code> except that
-     * this method takes <code>QName</code> arguments instead of
+     * this method takes <code>Name</code> arguments instead of
      * <code>String</code>s and has an additional <code>uuid</code> argument.
      * <p/>
      * <b>Important Notice:</b> This method is for internal use only! Passing
@@ -1550,7 +1553,7 @@
      * @throws LockException
      * @throws RepositoryException
      */
-    public synchronized NodeImpl addNode(QName nodeName, QName nodeTypeName,
+    public synchronized NodeImpl addNode(Name nodeName, Name nodeTypeName,
                                          UUID uuid)
             throws ItemExistsException, NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
@@ -1576,7 +1579,7 @@
 
     /**
      * Same as <code>{@link Node#setProperty(String, Value[])}</code> except that
-     * this method takes a <code>QName</code> name argument instead of a
+     * this method takes a <code>Name</code> name argument instead of a
      * <code>String</code>.
      *
      * @param name
@@ -1588,7 +1591,7 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public PropertyImpl setProperty(QName name, Value[] values)
+    public PropertyImpl setProperty(Name name, Value[] values)
             throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
 
@@ -1623,7 +1626,7 @@
 
     /**
      * Same as <code>{@link Node#setProperty(String, Value[], int)}</code> except
-     * that this method takes a <code>QName</code> name argument instead of a
+     * that this method takes a <code>Name</code> name argument instead of a
      * <code>String</code>.
      *
      * @param name
@@ -1636,7 +1639,7 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public PropertyImpl setProperty(QName name, Value[] values, int type)
+    public PropertyImpl setProperty(Name name, Value[] values, int type)
             throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
         // check state of this instance
@@ -1667,7 +1670,7 @@
 
     /**
      * Same as <code>{@link Node#setProperty(String, Value)}</code> except that
-     * this method takes a <code>QName</code> name argument instead of a
+     * this method takes a <code>Name</code> name argument instead of a
      * <code>String</code>.
      *
      * @param name
@@ -1679,7 +1682,7 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public PropertyImpl setProperty(QName name, Value value)
+    public PropertyImpl setProperty(Name name, Value value)
             throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
         // check state of this instance
@@ -1711,7 +1714,7 @@
     /**
      * @see ItemImpl#getQName()
      */
-    public QName getQName() throws RepositoryException {
+    public Name getQName() throws RepositoryException {
         return session.getHierarchyManager().getName(id);
     }
 
@@ -1726,7 +1729,7 @@
 
     /**
      * Same as <code>{@link Node#orderBefore(String, String)}</code> except that
-     * this method takes a <code>Path.PathElement</code> arguments instead of
+     * this method takes a <code>Path.Element</code> arguments instead of
      * <code>String</code>s.
      *
      * @param srcName
@@ -1738,8 +1741,8 @@
      * @throws LockException
      * @throws RepositoryException
      */
-    public synchronized void orderBefore(Path.PathElement srcName,
-                                         Path.PathElement dstName)
+    public synchronized void orderBefore(Path.Element srcName,
+                                         Path.Element dstName)
             throws UnsupportedRepositoryOperationException, VersionException,
             ConstraintViolationException, ItemNotFoundException, LockException,
             RepositoryException {
@@ -1763,8 +1766,8 @@
         if (!hasNode(srcName.getName(), srcName.getIndex())) {
             String name;
             try {
-                Path.PathElement[] path = new Path.PathElement[] { srcName };
-                name = session.getJCRPath(new Path.PathBuilder(path).getPath());
+                Path.Element[] path = new Path.Element[] { srcName };
+                name = session.getJCRPath(new PathBuilder(path).getPath());
             } catch (NameException e) {
                 name = srcName.toString();
             } catch (NamespaceException e) {
@@ -1776,8 +1779,8 @@
         if (dstName != null && !hasNode(dstName.getName(), dstName.getIndex())) {
             String name;
             try {
-                Path.PathElement[] path = new Path.PathElement[] { dstName };
-                name = session.getJCRPath(new Path.PathBuilder(path).getPath());
+                Path.Element[] path = new Path.Element[] { dstName };
+                name = session.getJCRPath(new PathBuilder(path).getPath());
             } catch (NameException e) {
                 name = dstName.toString();
             } catch (NamespaceException e) {
@@ -1881,9 +1884,9 @@
      * @throws LockException
      * @throws RepositoryException
      */
-    public synchronized NodeImpl replaceChildNode(NodeId id, QName nodeName,
-                                                  QName nodeTypeName,
-                                                  QName[] mixinNames)
+    public synchronized NodeImpl replaceChildNode(NodeId id, Name nodeName,
+                                                  Name nodeTypeName,
+                                                  Name[] mixinNames)
             throws ItemNotFoundException, NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
         // check state of this instance
@@ -2023,7 +2026,7 @@
             ConstraintViolationException, ItemNotFoundException, LockException,
             RepositoryException {
 
-        Path.PathElement insertName;
+        Path.Element insertName;
         try {
             Path p = session.getQPath(srcName);
             // p must be a relative path of length==depth==1 (to eliminate e.g. "..")
@@ -2037,7 +2040,7 @@
             throw new RepositoryException(msg, e);
         }
 
-        Path.PathElement beforeName;
+        Path.Element beforeName;
         if (destName != null) {
             try {
                 Path p = session.getQPath(destName);
@@ -2670,7 +2673,7 @@
         Iterator iter = mixinNames.iterator();
         int i = 0;
         while (iter.hasNext()) {
-            nta[i++] = session.getNodeTypeManager().getNodeType((QName) iter.next());
+            nta[i++] = session.getNodeTypeManager().getNodeType((Name) iter.next());
         }
         return nta;
     }
@@ -2728,7 +2731,7 @@
             return false;
         }
 
-        QName ntName;
+        Name ntName;
         try {
             ntName = session.getQName(mixinName);
         } catch (NameException e) {
@@ -2756,14 +2759,14 @@
             // primary type
             set.add(primaryTypeName);
             // build effective node type representing primary type including existing mixin's
-            entExisting = ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            entExisting = ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
             if (entExisting.includesNodeType(ntName)) {
                 return false;
             }
             // add new mixin
             set.add(ntName);
             // try to build new effective node type (will throw in case of conflicts)
-            ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             return false;
         }
@@ -2859,7 +2862,7 @@
         // check state of this instance
         sanityCheck();
 
-        if (!isNodeType(QName.MIX_REFERENCEABLE)) {
+        if (!isNodeType(NameConstants.MIX_REFERENCEABLE)) {
             throw new UnsupportedRepositoryOperationException();
         }
 
@@ -2883,7 +2886,7 @@
 
             // search nearest ancestor that is referenceable
             NodeImpl m1 = this;
-            while (m1.getDepth() != 0 && !m1.isNodeType(QName.MIX_REFERENCEABLE)) {
+            while (m1.getDepth() != 0 && !m1.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
                 m1 = (NodeImpl) m1.getParent();
             }
 
@@ -2988,9 +2991,9 @@
         checkLock();
 
         Version v = session.getVersionManager().checkin(this);
-        internalSetProperty(QName.JCR_ISCHECKEDOUT, InternalValue.create(false));
-        internalSetProperty(QName.JCR_BASEVERSION, InternalValue.create(new UUID(v.getUUID())));
-        internalSetProperty(QName.JCR_PREDECESSORS, InternalValue.EMPTY_ARRAY, PropertyType.REFERENCE);
+        internalSetProperty(NameConstants.JCR_ISCHECKEDOUT, InternalValue.create(false));
+        internalSetProperty(NameConstants.JCR_BASEVERSION, InternalValue.create(new UUID(v.getUUID())));
+        internalSetProperty(NameConstants.JCR_PREDECESSORS, InternalValue.EMPTY_ARRAY, PropertyType.REFERENCE);
         save();
         return v;
     }
@@ -3017,9 +3020,9 @@
         // check lock status
         checkLock();
 
-        Property prop = internalSetProperty(QName.JCR_ISCHECKEDOUT, InternalValue.create(true));
+        Property prop = internalSetProperty(NameConstants.JCR_ISCHECKEDOUT, InternalValue.create(true));
         prop.save();
-        prop = internalSetProperty(QName.JCR_PREDECESSORS,
+        prop = internalSetProperty(NameConstants.JCR_PREDECESSORS,
                 new InternalValue[]{
                     InternalValue.create(new UUID(getBaseVersion().getUUID()))
                 });
@@ -3142,7 +3145,7 @@
                     try {
                         Path relative = session.getQPath(relPath);
                         Path dstPath =
-                            Path.create(getPrimaryPath(), relative, false)
+                            PathFactoryImpl.getInstance().create(getPrimaryPath(), relative, false)
                             .getCanonicalPath();
                         // move to respective location
                         session.move(node.getPath(), session.getJCRPath(dstPath));
@@ -3197,10 +3200,10 @@
         checkVersionable();
 
         // transactions workaround.
-        NodeId id = NodeId.valueOf(getProperty(QName.JCR_VERSIONHISTORY).getString());
+        NodeId id = NodeId.valueOf(getProperty(NameConstants.JCR_VERSIONHISTORY).getString());
         session.getVersionManager().getVersionHistory(id);
 
-        return (VersionHistory) getProperty(QName.JCR_VERSIONHISTORY).getNode();
+        return (VersionHistory) getProperty(NameConstants.JCR_VERSIONHISTORY).getNode();
     }
 
     /**
@@ -3214,10 +3217,10 @@
         checkVersionable();
 
         // transactions workaround.
-        NodeId id = NodeId.valueOf(getProperty(QName.JCR_BASEVERSION).getString());
+        NodeId id = NodeId.valueOf(getProperty(NameConstants.JCR_BASEVERSION).getString());
         session.getVersionManager().getVersion(id);
 
-        return (Version) getProperty(QName.JCR_BASEVERSION).getNode();
+        return (Version) getProperty(NameConstants.JCR_BASEVERSION).getNode();
     }
 
     //-----------------------------------< versioning support: implementation >
@@ -3229,7 +3232,7 @@
      */
     private void checkVersionable()
             throws UnsupportedRepositoryOperationException, RepositoryException {
-        if (!isNodeType(QName.MIX_VERSIONABLE)) {
+        if (!isNodeType(NameConstants.MIX_VERSIONABLE)) {
             String msg = "Unable to perform versioning operation on non versionable node: " + safeGetJCRPath();
             log.debug(msg);
             throw new UnsupportedRepositoryOperationException(msg);
@@ -3280,7 +3283,7 @@
 
         // search nearest ancestor that is referenceable
         NodeImpl m1 = this;
-        while (!m1.isNodeType(QName.MIX_REFERENCEABLE)) {
+        while (!m1.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
             if (m1.getDepth() == 0) {
                 // root node
                 try {
@@ -3377,11 +3380,11 @@
         }
 
         // if not versionable, update
-        if (!isNodeType(QName.MIX_VERSIONABLE) || failedIds == null) {
+        if (!isNodeType(NameConstants.MIX_VERSIONABLE) || failedIds == null) {
             return srcNode;
         }
         // if source node is not versionable, leave
-        if (!srcNode.isNodeType(QName.MIX_VERSIONABLE)) {
+        if (!srcNode.isNodeType(NameConstants.MIX_VERSIONABLE)) {
             return null;
         }
         // test versions
@@ -3460,13 +3463,13 @@
 
         if (!cancel) {
             // add version to jcr:predecessors list
-            Value[] vals = getProperty(QName.JCR_PREDECESSORS).getValues();
+            Value[] vals = getProperty(NameConstants.JCR_PREDECESSORS).getValues();
             InternalValue[] v = new InternalValue[vals.length + 1];
             for (int i = 0; i < vals.length; i++) {
                 v[i] = InternalValue.create(UUID.fromString(vals[i].getString()));
             }
             v[vals.length] = InternalValue.create(UUID.fromString(version.getUUID()));
-            internalSetProperty(QName.JCR_PREDECESSORS, v);
+            internalSetProperty(NameConstants.JCR_PREDECESSORS, v);
         }
 
         // save
@@ -3479,8 +3482,8 @@
      */
     private Set internalGetMergeFailed() throws RepositoryException {
         HashSet set = new HashSet();
-        if (hasProperty(QName.JCR_MERGEFAILED)) {
-            Value[] vals = getProperty(QName.JCR_MERGEFAILED).getValues();
+        if (hasProperty(NameConstants.JCR_MERGEFAILED)) {
+            Value[] vals = getProperty(NameConstants.JCR_MERGEFAILED).getValues();
             for (int i = 0; i < vals.length; i++) {
                 set.add(vals[i].getString());
             }
@@ -3494,7 +3497,7 @@
      */
     private void internalSetMergeFailed(Set set) throws RepositoryException {
         if (set.isEmpty()) {
-            internalSetProperty(QName.JCR_MERGEFAILED, (InternalValue[]) null);
+            internalSetProperty(NameConstants.JCR_MERGEFAILED, (InternalValue[]) null);
         } else {
             InternalValue[] vals = new InternalValue[set.size()];
             Iterator iter = set.iterator();
@@ -3503,7 +3506,7 @@
                 String uuid = (String) iter.next();
                 vals[i++] = InternalValue.create(UUID.fromString(uuid));
             }
-            internalSetProperty(QName.JCR_MERGEFAILED, vals);
+            internalSetProperty(NameConstants.JCR_MERGEFAILED, vals);
         }
     }
 
@@ -3536,13 +3539,13 @@
          * this would have a negative impact on performance though...
          */
         NodeImpl node = this;
-        while (!node.hasProperty(QName.JCR_ISCHECKEDOUT)) {
+        while (!node.hasProperty(NameConstants.JCR_ISCHECKEDOUT)) {
             if (node.getDepth() == 0) {
                 return true;
             }
             node = (NodeImpl) node.getParent();
         }
-        return node.getProperty(QName.JCR_ISCHECKEDOUT).getBoolean();
+        return node.getProperty(NameConstants.JCR_ISCHECKEDOUT).getBoolean();
     }
 
     /**
@@ -3566,7 +3569,7 @@
      *                                      child of a <code>Property</code>
      * @throws RepositoryException          if another error occurs.
      */
-    private NodeImpl addNode(QName name, InternalFrozenNode frozen)
+    private NodeImpl addNode(Name name, InternalFrozenNode frozen)
             throws ItemExistsException, PathNotFoundException,
             ConstraintViolationException, NoSuchNodeTypeException,
             RepositoryException {
@@ -3582,7 +3585,7 @@
 
         // get frozen mixin
         // todo: also respect mixing types on creation?
-        QName[] mxNames = frozen.getFrozenMixinTypes();
+        Name[] mxNames = frozen.getFrozenMixinTypes();
         for (int i = 0; i < mxNames.length; i++) {
             node.addMixin(mxNames[i]);
         }
@@ -3626,7 +3629,7 @@
 
         // get frozen mixin
         // todo: also respect mixing types on creation?
-        QName[] mxNames = frozen.getFrozenMixinTypes();
+        Name[] mxNames = frozen.getFrozenMixinTypes();
         for (int i = 0; i < mxNames.length; i++) {
             node.addMixin(mxNames[i]);
         }
@@ -3719,9 +3722,9 @@
         while (iter.hasNext()) {
             PropertyImpl p = (PropertyImpl) iter.nextProperty();
             // ignore system types
-            if (p.getQName().equals(QName.JCR_PRIMARYTYPE)
-                    || p.getQName().equals(QName.JCR_MIXINTYPES)
-                    || p.getQName().equals(QName.JCR_UUID)) {
+            if (p.getQName().equals(NameConstants.JCR_PRIMARYTYPE)
+                    || p.getQName().equals(NameConstants.JCR_MIXINTYPES)
+                    || p.getQName().equals(NameConstants.JCR_UUID)) {
                 continue;
             }
             if (p.getDefinition().isMultiple()) {
@@ -3736,7 +3739,7 @@
         NodeIterator niter = getNodes();
         while (niter.hasNext()) {
             NodeImpl n = (NodeImpl) niter.nextNode();
-            Path.PathElement name = n.getPrimaryPath().getNameElement();
+            Path.Element name = n.getPrimaryPath().getNameElement();
             int idx = name.getIndex();
             if (idx == 0) {
                 idx = 1;
@@ -3752,13 +3755,13 @@
             NodeImpl child = (NodeImpl) niter.nextNode();
             NodeImpl dstNode = null;
             NodeId childId = child.getNodeId();
-            Path.PathElement name = child.getPrimaryPath().getNameElement();
+            Path.Element name = child.getPrimaryPath().getNameElement();
             int idx = name.getIndex();
             if (idx == 0) {
                 idx = 1;
             }
 
-            if (child.isNodeType(QName.MIX_REFERENCEABLE)) {
+            if (child.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
                 // check if correspondance exist in
                 // this workspace
                 try {
@@ -3848,7 +3851,7 @@
         }
 
         // set jcr:isCheckedOut property to true, in order to avoid any conflicts
-        internalSetProperty(QName.JCR_ISCHECKEDOUT, InternalValue.create(true));
+        internalSetProperty(NameConstants.JCR_ISCHECKEDOUT, InternalValue.create(true));
 
         // 1. The child node and properties of N will be changed, removed or
         //    added to, depending on their corresponding copies in V and their
@@ -3859,16 +3862,16 @@
 
         // 2. N's jcr:baseVersion property will be changed to point to V.
         UUID uuid = ((NodeId) version.getId()).getUUID();
-        internalSetProperty(QName.JCR_BASEVERSION, InternalValue.create(uuid));
+        internalSetProperty(NameConstants.JCR_BASEVERSION, InternalValue.create(uuid));
 
         // 4. N's jcr:predecessor property is set to null
-        internalSetProperty(QName.JCR_PREDECESSORS, InternalValue.EMPTY_ARRAY, PropertyType.REFERENCE);
+        internalSetProperty(NameConstants.JCR_PREDECESSORS, InternalValue.EMPTY_ARRAY, PropertyType.REFERENCE);
 
         // also clear mergeFailed
-        internalSetProperty(QName.JCR_MERGEFAILED, (InternalValue[]) null);
+        internalSetProperty(NameConstants.JCR_MERGEFAILED, (InternalValue[]) null);
 
         // 3. N's jcr:isCheckedOut property is set to false.
-        internalSetProperty(QName.JCR_ISCHECKEDOUT, InternalValue.create(false));
+        internalSetProperty(NameConstants.JCR_ISCHECKEDOUT, InternalValue.create(false));
 
         return (Version[]) restored.toArray(new Version[restored.size()]);
     }
@@ -3885,7 +3888,7 @@
             throws RepositoryException {
 
         // check uuid
-        if (isNodeType(QName.MIX_REFERENCEABLE)) {
+        if (isNodeType(NameConstants.MIX_REFERENCEABLE)) {
             UUID uuid = freeze.getFrozenUUID();
             if (!internalGetUUID().equals(uuid)) {
                 throw new ItemExistsException("Unable to restore version of " + safeGetJCRPath() + ". UUID changed.");
@@ -3899,7 +3902,7 @@
         }
 
         // adjust mixins
-        QName[] mixinNames = freeze.getFrozenMixinTypes();
+        Name[] mixinNames = freeze.getFrozenMixinTypes();
         setMixinTypesProperty(new HashSet(Arrays.asList(mixinNames)));
 
         // copy frozen properties
@@ -3919,9 +3922,9 @@
         while (piter.hasNext()) {
             PropertyImpl prop = (PropertyImpl) piter.nextProperty();
             // ignore some props that are not well guarded by the OPV
-            if (prop.getQName().equals(QName.JCR_VERSIONHISTORY)) {
+            if (prop.getQName().equals(NameConstants.JCR_VERSIONHISTORY)) {
                 continue;
-            } else if (prop.getQName().equals(QName.JCR_PREDECESSORS)) {
+            } else if (prop.getQName().equals(NameConstants.JCR_PREDECESSORS)) {
                 continue;
             }
             if (prop.getDefinition().getOnParentVersion() == OnParentVersionAction.COPY
@@ -3955,8 +3958,8 @@
             } else if (n.getDefinition().getOnParentVersion() == OnParentVersionAction.VERSION) {
                 // only remove, if node to be restored does not contain child,
                 // or if restored child is not versionable
-                UUID vhUUID = n.hasProperty(QName.JCR_VERSIONHISTORY)
-                        ? new UUID(n.getProperty(QName.JCR_VERSIONHISTORY).getString())
+                UUID vhUUID = n.hasProperty(NameConstants.JCR_VERSIONHISTORY)
+                        ? new UUID(n.getProperty(NameConstants.JCR_VERSIONHISTORY).getString())
                         : null;
                 if (vhUUID == null || !freeze.hasFrozenHistory(vhUUID)) {
                     n.internalRemove(true);
@@ -4081,11 +4084,11 @@
             Value[] values = prop.getValues();
             InternalValue[] ivalues = new InternalValue[values.length];
             for (int i = 0; i < values.length; i++) {
-                ivalues[i] = InternalValue.create(values[i], session.getNamespaceResolver(), rep.getDataStore());
+                ivalues[i] = InternalValue.create(values[i], session.getNamePathResolver(), rep.getDataStore());
             }
             internalSetProperty(prop.getQName(), ivalues);
         } else {
-            InternalValue value = InternalValue.create(prop.getValue(), session.getNamespaceResolver(), rep.getDataStore());
+            InternalValue value = InternalValue.create(prop.getValue(), session.getNamePathResolver(), rep.getDataStore());
             internalSetProperty(prop.getQName(), value);
         }
     }
@@ -4118,9 +4121,9 @@
 
             try {
                 // add properties to content
-                internalSetProperty(QName.JCR_LOCKOWNER,
+                internalSetProperty(NameConstants.JCR_LOCKOWNER,
                         InternalValue.create(getSession().getUserID()));
-                internalSetProperty(QName.JCR_LOCKISDEEP,
+                internalSetProperty(NameConstants.JCR_LOCKISDEEP,
                         InternalValue.create(isDeep));
                 save();
                 succeeded = true;
@@ -4181,8 +4184,8 @@
                 // save first, and unlock later. this guards concurrent access
 
                 // remove properties in content
-                internalSetProperty(QName.JCR_LOCKOWNER, (InternalValue) null);
-                internalSetProperty(QName.JCR_LOCKISDEEP, (InternalValue) null);
+                internalSetProperty(NameConstants.JCR_LOCKOWNER, (InternalValue) null);
+                internalSetProperty(NameConstants.JCR_LOCKISDEEP, (InternalValue) null);
                 save();
             }
             lockMgr.unlock(this);
@@ -4196,7 +4199,7 @@
         // check state of this instance
         sanityCheck();
 
-        if (!isNodeType(QName.MIX_LOCKABLE) || isNew()) {
+        if (!isNodeType(NameConstants.MIX_LOCKABLE) || isNew()) {
             // a node that is new or not lockable never holds a lock
             return false;
         }
@@ -4223,7 +4226,7 @@
      * @throws RepositoryException if another error occurs
      */
     private void checkLockable() throws LockException, RepositoryException {
-        if (!isNodeType(QName.MIX_LOCKABLE)) {
+        if (!isNodeType(NameConstants.MIX_LOCKABLE)) {
             String msg = "Unable to perform locking operation on non-lockable node: "
                     + safeGetJCRPath();
             log.debug(msg);
@@ -4301,7 +4304,7 @@
                 // refs.getReferences() returns a list of PropertyId's
                 List idList = refs.getReferences();
                 if (name != null) {
-                    QName qName;
+                    Name qName;
                     try {
                         qName = session.getQName(name);
                     } catch (NameException e) {
@@ -4413,7 +4416,7 @@
         // check lock status
         checkLock();
 
-        QName ntName;
+        Name ntName;
         try {
             ntName = session.getQName(nodeTypeName);
         } catch (NameException e) {
@@ -4443,7 +4446,7 @@
             // new primary type
             set.add(ntName);
             // try to build new effective node type (will throw in case of conflicts)
-            ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             throw new ConstraintViolationException(ntce.getMessage());
         }
@@ -4475,8 +4478,8 @@
         addedDefs.removeAll(oldDefs);
 
         // referential integrity check
-        boolean referenceableOld = entOld.includesNodeType(QName.MIX_REFERENCEABLE);
-        boolean referenceableNew = entNew.includesNodeType(QName.MIX_REFERENCEABLE);
+        boolean referenceableOld = entOld.includesNodeType(NameConstants.MIX_REFERENCEABLE);
+        boolean referenceableNew = entNew.includesNodeType(NameConstants.MIX_REFERENCEABLE);
         if (referenceableOld && !referenceableNew) {
             // node would become non-referenceable;
             // make sure no references exist
@@ -4496,7 +4499,7 @@
         thisState.setNodeTypeName(ntName);
 
         // set jcr:primaryType property
-        internalSetProperty(QName.JCR_PRIMARYTYPE, InternalValue.create(ntName));
+        internalSetProperty(NameConstants.JCR_PRIMARYTYPE, InternalValue.create(ntName));
 
         // walk through properties and child nodes and remove those that
         // are not included in the new node type
@@ -4504,7 +4507,7 @@
             // use temp set to avoid ConcurrentModificationException
             HashSet set = new HashSet(thisState.getPropertyNames());
             for (Iterator iter = set.iterator(); iter.hasNext();) {
-                QName propName = (QName) iter.next();
+                Name propName = (Name) iter.next();
                 try {
                     PropertyState propState =
                             (PropertyState) stateMgr.getItemState(
Index: src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/NamespaceRegistryImpl.java	(working copy)
@@ -20,16 +20,10 @@
 import org.apache.jackrabbit.core.cluster.NamespaceEventListener;
 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.CachingNameResolver;
-import org.apache.jackrabbit.name.CachingPathResolver;
-import org.apache.jackrabbit.name.NameCache;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NameResolver;
-import org.apache.jackrabbit.name.ParsingNameResolver;
-import org.apache.jackrabbit.name.ParsingPathResolver;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.AbstractNamespaceResolver;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.XMLChar;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +45,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);
 
@@ -63,23 +57,23 @@
 
     static {
         // reserved prefixes
-        reservedPrefixes.add(QName.NS_XML_PREFIX);
-        reservedPrefixes.add(QName.NS_XMLNS_PREFIX);
+        reservedPrefixes.add(Name.NS_XML_PREFIX);
+        reservedPrefixes.add(Name.NS_XMLNS_PREFIX);
         // predefined (e.g. built-in) prefixes
-        reservedPrefixes.add(QName.NS_REP_PREFIX);
-        reservedPrefixes.add(QName.NS_JCR_PREFIX);
-        reservedPrefixes.add(QName.NS_NT_PREFIX);
-        reservedPrefixes.add(QName.NS_MIX_PREFIX);
-        reservedPrefixes.add(QName.NS_SV_PREFIX);
+        reservedPrefixes.add(Name.NS_REP_PREFIX);
+        reservedPrefixes.add(Name.NS_JCR_PREFIX);
+        reservedPrefixes.add(Name.NS_NT_PREFIX);
+        reservedPrefixes.add(Name.NS_MIX_PREFIX);
+        reservedPrefixes.add(Name.NS_SV_PREFIX);
         // reserved namespace URI's
-        reservedURIs.add(QName.NS_XML_URI);
-        reservedURIs.add(QName.NS_XMLNS_URI);
+        reservedURIs.add(Name.NS_XML_URI);
+        reservedURIs.add(Name.NS_XMLNS_URI);
         // predefined (e.g. built-in) namespace URI's
-        reservedURIs.add(QName.NS_REP_URI);
-        reservedURIs.add(QName.NS_JCR_URI);
-        reservedURIs.add(QName.NS_NT_URI);
-        reservedURIs.add(QName.NS_MIX_URI);
-        reservedURIs.add(QName.NS_SV_URI);
+        reservedURIs.add(Name.NS_REP_URI);
+        reservedURIs.add(Name.NS_JCR_URI);
+        reservedURIs.add(Name.NS_NT_URI);
+        reservedURIs.add(Name.NS_MIX_URI);
+        reservedURIs.add(Name.NS_SV_URI);
     }
 
     private HashMap prefixToURI = new HashMap();
@@ -112,7 +106,6 @@
         super(true); // enable listener support
         this.nsRegStore = nsRegStore;
         load();
-        evictAllNames();
     }
 
     /**
@@ -169,21 +162,21 @@
                 clear();
 
                 // default namespace (if no prefix is specified)
-                map(QName.NS_EMPTY_PREFIX, QName.NS_DEFAULT_URI);
+                map(Name.NS_EMPTY_PREFIX, Name.NS_DEFAULT_URI);
 
                 // declare the predefined mappings
                 // rep:
-                map(QName.NS_REP_PREFIX, QName.NS_REP_URI);
+                map(Name.NS_REP_PREFIX, Name.NS_REP_URI);
                 // jcr:
-                map(QName.NS_JCR_PREFIX, QName.NS_JCR_URI);
+                map(Name.NS_JCR_PREFIX, Name.NS_JCR_URI);
                 // nt:
-                map(QName.NS_NT_PREFIX, QName.NS_NT_URI);
+                map(Name.NS_NT_PREFIX, Name.NS_NT_URI);
                 // mix:
-                map(QName.NS_MIX_PREFIX, QName.NS_MIX_URI);
+                map(Name.NS_MIX_PREFIX, Name.NS_MIX_URI);
                 // sv:
-                map(QName.NS_SV_PREFIX, QName.NS_SV_URI);
+                map(Name.NS_SV_PREFIX, Name.NS_SV_URI);
                 // xml:
-                map(QName.NS_XML_PREFIX, QName.NS_XML_URI);
+                map(Name.NS_XML_PREFIX, Name.NS_XML_URI);
 
                 // persist mappings
                 store();
@@ -342,7 +335,7 @@
             // ... it is not, try to find a unique prefix.
 
             // First, check and replace troublesome prefix hints.
-            if (prefixHint.toLowerCase().startsWith(QName.NS_XML_PREFIX)
+            if (prefixHint.toLowerCase().startsWith(Name.NS_XML_PREFIX)
                     || !XMLChar.isValidNCName(prefixHint)) {
                 prefixHint = "_pre";
             }
@@ -413,7 +406,7 @@
         if (prefix == null || uri == null) {
             throw new IllegalArgumentException("prefix/uri can not be null");
         }
-        if (QName.NS_EMPTY_PREFIX.equals(prefix) || QName.NS_DEFAULT_URI.equals(uri)) {
+        if (Name.NS_EMPTY_PREFIX.equals(prefix) || Name.NS_DEFAULT_URI.equals(uri)) {
             throw new NamespaceException("default namespace is reserved and can not be changed");
         }
         if (reservedURIs.contains(uri)) {
@@ -425,7 +418,7 @@
                     + prefix + " -> " + uri + ": reserved prefix");
         }
         // special case: prefixes xml*
-        if (prefix.toLowerCase().startsWith(QName.NS_XML_PREFIX)) {
+        if (prefix.toLowerCase().startsWith(Name.NS_XML_PREFIX)) {
             throw new NamespaceException("failed to register namespace "
                     + prefix + " -> " + uri + ": reserved prefix");
         }
@@ -462,9 +455,6 @@
         // add new prefix mapping
         map(prefix, uri);
 
-        // Clear cache
-        evictAllNames();
-
         if (eventChannel != null) {
             eventChannel.remapped(oldPrefix, prefix, uri);
         }
@@ -541,37 +531,6 @@
         return prefix;
     }
 
-    //------------------------------------------------------------< NameCache >
-    /**
-     * {@inheritDoc}
-     */
-    public QName retrieveName(String jcrName) {
-        try {
-            return nameResolver.getQName(jcrName);
-        } catch (NameException e) {
-            return null;
-        } catch (NamespaceException e) {
-            return null;
-        }
-    }
-
-    public String retrieveName(QName name) {
-        try {
-            return nameResolver.getJCRName(name);
-        } catch (NamespaceException e) {
-            return null;
-        }
-    }
-
-    public void cacheName(String jcrName, QName name) {
-    }
-
-    public void evictAllNames() {
-        nameResolver = new CachingNameResolver(new ParsingNameResolver(this));
-        pathResolver =
-            new CachingPathResolver(new ParsingPathResolver(nameResolver));
-    }
-
     //-----------------------------------------------< NamespaceEventListener >
 
     /**
@@ -598,9 +557,6 @@
         // add new prefix mapping
         map(newPrefix, uri);
 
-        // Clear cache
-        evictAllNames();
-
         // persist mappings
         store();
 
Index: src/main/java/org/apache/jackrabbit/core/lock/LockManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/lock/LockManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/lock/LockManager.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Path;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
Index: src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/lock/LockManagerImpl.java	(working copy)
@@ -21,7 +21,7 @@
 import org.apache.jackrabbit.core.ItemId;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.NodeImpl;
-import org.apache.jackrabbit.util.PathMap;
+import org.apache.jackrabbit.name.PathMap;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.SessionListener;
 import org.apache.jackrabbit.core.util.Dumpable;
@@ -33,11 +33,10 @@
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.observation.EventImpl;
 import org.apache.jackrabbit.core.observation.SynchronousEventListener;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.PathFormat;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -103,7 +102,7 @@
     /**
      * Namespace resolver
      */
-    private final NamespaceResolver nsResolver;
+    private final NamePathResolver resolver;
 
     /**
      * Lock event channel.
@@ -121,7 +120,7 @@
             throws RepositoryException {
 
         this.session = session;
-        this.nsResolver = session.getNamespaceResolver();
+        this.resolver = session.getNamePathResolver();
         this.locksFile = new FileSystemResource(fs, FileSystem.SEPARATOR + LOCKS_FILE);
 
         session.getWorkspace().getObservationManager().
@@ -185,8 +184,8 @@
             Path path = getPath(lockToken.id);
 
             LockInfo info = new LockInfo(lockToken, false,
-                    node.getProperty(QName.JCR_LOCKISDEEP).getBoolean(),
-                    node.getProperty(QName.JCR_LOCKOWNER).getString());
+                    node.getProperty(NameConstants.JCR_LOCKISDEEP).getBoolean(),
+                    node.getProperty(NameConstants.JCR_LOCKOWNER).getString());
             info.setLive(true);
             lockMap.put(path, info);
         } catch (RepositoryException e) {
@@ -826,7 +825,7 @@
 
             try {
                 he = new HierarchyEvent(event.getChildId(),
-                        PathFormat.parse(event.getPath(), nsResolver).getNormalizedPath(),
+                        resolver.getQPath(event.getPath()).getNormalizedPath(),
                         event.getType());
             } catch (MalformedPathException e) {
                 log.info("Unable to get event's path: " + e.getMessage());
@@ -954,7 +953,7 @@
 
     /**
      * Contains information about a lock and gets placed inside the child
-     * information of a {@link org.apache.jackrabbit.util.PathMap}.
+     * information of a {@link org.apache.jackrabbit.name.PathMap}.
      */
     class LockInfo extends AbstractLockInfo implements SessionListener {
 
Index: src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/lock/XALockManager.java	(working copy)
@@ -21,7 +21,7 @@
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.TransactionContext;
 import org.apache.jackrabbit.core.TransactionException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Path;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
Index: src/main/java/org/apache/jackrabbit/core/HierarchyManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/HierarchyManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/HierarchyManager.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core;
 
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.RepositoryException;
@@ -57,7 +57,7 @@
      * @throws ItemNotFoundException
      * @throws RepositoryException
      */
-    QName getName(ItemId id) throws ItemNotFoundException, RepositoryException;
+    Name getName(ItemId id) throws ItemNotFoundException, RepositoryException;
 
     /**
      * Returns the depth of the specified item which is equivalent to
Index: src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java	(working copy)
@@ -35,10 +35,11 @@
 import org.apache.jackrabbit.core.util.ReferenceChangeTracker;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.version.VersionManager;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -272,7 +273,7 @@
 
         NodeState srcState = getNodeState(srcStateMgr, srcHierMgr, srcPath);
 
-        Path.PathElement destName = destPath.getNameElement();
+        Path.Element destName = destPath.getNameElement();
         Path destParentPath = destPath.getAncestor(1);
         NodeState destParentState = getNodeState(destParentPath);
         int ind = destName.getIndex();
@@ -395,12 +396,12 @@
             throw new RepositoryException(msg, mpe);
         }
 
-        Path.PathElement srcName = srcPath.getNameElement();
+        Path.Element srcName = srcPath.getNameElement();
         Path srcParentPath = srcPath.getAncestor(1);
         NodeState target = getNodeState(srcPath);
         NodeState srcParent = getNodeState(srcParentPath);
 
-        Path.PathElement destName = destPath.getNameElement();
+        Path.Element destName = destPath.getNameElement();
         Path destParentPath = destPath.getAncestor(1);
         NodeState destParent = getNodeState(destParentPath);
 
@@ -529,8 +530,8 @@
      * @throws ItemExistsException
      * @throws RepositoryException
      */
-    public void checkAddNode(NodeState parentState, QName nodeName,
-                             QName nodeTypeName, int options)
+    public void checkAddNode(NodeState parentState, Name nodeName,
+                             Name nodeTypeName, int options)
             throws ConstraintViolationException, AccessDeniedException,
             VersionException, LockException, ItemNotFoundException,
             ItemExistsException, RepositoryException {
@@ -755,7 +756,7 @@
 
         if ((options & CHECK_REFERENCES) == CHECK_REFERENCES) {
             EffectiveNodeType ent = getEffectiveNodeType(targetState);
-            if (ent.includesNodeType(QName.MIX_REFERENCEABLE)) {
+            if (ent.includesNodeType(NameConstants.MIX_REFERENCEABLE)) {
                 NodeReferencesId refsId = new NodeReferencesId(targetState.getNodeId());
                 if (stateMgr.hasNodeReferences(refsId)) {
                     try {
@@ -870,8 +871,8 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    public NodeDef findApplicableNodeDefinition(QName name,
-                                                QName nodeTypeName,
+    public NodeDef findApplicableNodeDefinition(Name name,
+                                                Name nodeTypeName,
                                                 NodeState parentState)
             throws RepositoryException, ConstraintViolationException {
         EffectiveNodeType entParent = getEffectiveNodeType(parentState);
@@ -898,7 +899,7 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    public PropDef findApplicablePropertyDefinition(QName name,
+    public PropDef findApplicablePropertyDefinition(Name name,
                                                     int type,
                                                     boolean multiValued,
                                                     NodeState parentState)
@@ -910,7 +911,7 @@
     /**
      * Helper method that finds the applicable definition for a property with
      * the given name, type in the parent node's node type and mixin types.
-     * Other than <code>{@link #findApplicablePropertyDefinition(QName, int, boolean, NodeState)}</code>
+     * Other than <code>{@link #findApplicablePropertyDefinition(Name, int, boolean, NodeState)}</code>
      * this method does not take the multiValued flag into account in the
      * selection algorithm. If there more than one applicable definitions then
      * the following rules are applied:
@@ -929,7 +930,7 @@
      *                                      could be found
      * @throws RepositoryException          if another error occurs
      */
-    public PropDef findApplicablePropertyDefinition(QName name,
+    public PropDef findApplicablePropertyDefinition(Name name,
                                                     int type,
                                                     NodeState parentState)
             throws RepositoryException, ConstraintViolationException {
@@ -957,9 +958,9 @@
      * @throws IllegalStateException        if the state mananger is not in edit mode
      */
     public NodeState createNodeState(NodeState parent,
-                                     QName nodeName,
-                                     QName nodeTypeName,
-                                     QName[] mixinNames,
+                                     Name nodeName,
+                                     Name nodeTypeName,
+                                     Name[] mixinNames,
                                      NodeId id)
             throws ItemExistsException, ConstraintViolationException,
             RepositoryException, IllegalStateException {
@@ -993,9 +994,9 @@
      * @throws IllegalStateException
      */
     public NodeState createNodeState(NodeState parent,
-                                     QName nodeName,
-                                     QName nodeTypeName,
-                                     QName[] mixinNames,
+                                     Name nodeName,
+                                     Name nodeTypeName,
+                                     Name[] mixinNames,
                                      NodeId id,
                                      NodeDef def)
             throws ItemExistsException, ConstraintViolationException,
@@ -1040,7 +1041,7 @@
 
         if (!node.getMixinTypeNames().isEmpty()) {
             // create jcr:mixinTypes property
-            PropDef pd = ent.getApplicablePropertyDef(QName.JCR_MIXINTYPES,
+            PropDef pd = ent.getApplicablePropertyDef(NameConstants.JCR_MIXINTYPES,
                     PropertyType.NAME, true);
             createPropertyState(node, pd.getName(), pd.getRequiredType(), pd);
         }
@@ -1086,7 +1087,7 @@
      * @throws IllegalStateException        if the state mananger is not in edit mode
      */
     public PropertyState createPropertyState(NodeState parent,
-                                             QName propName,
+                                             Name propName,
                                              int type,
                                              int numValues)
             throws ItemExistsException, ConstraintViolationException,
@@ -1135,7 +1136,7 @@
      * @throws RepositoryException
      */
     public PropertyState createPropertyState(NodeState parent,
-                                             QName propName,
+                                             Name propName,
                                              int type,
                                              PropDef def)
             throws ItemExistsException, RepositoryException {
@@ -1296,7 +1297,7 @@
          * this would have a negative impact on performance though...
          */
         NodeState nodeState = getNodeState(nodePath);
-        while (!nodeState.hasPropertyName(QName.JCR_ISCHECKEDOUT)) {
+        while (!nodeState.hasPropertyName(NameConstants.JCR_ISCHECKEDOUT)) {
             if (nodePath.denotesRoot()) {
                 return;
             }
@@ -1304,7 +1305,7 @@
             nodeState = getNodeState(nodePath);
         }
         PropertyId propId =
-                new PropertyId(nodeState.getNodeId(), QName.JCR_ISCHECKEDOUT);
+                new PropertyId(nodeState.getNodeId(), NameConstants.JCR_ISCHECKEDOUT);
         PropertyState propState;
         try {
             propState = (PropertyState) stateMgr.getItemState(propId);
@@ -1428,45 +1429,45 @@
          */
 
         // compute system generated values
-        QName declaringNT = def.getDeclaringNodeType();
-        QName name = def.getName();
-        if (QName.MIX_REFERENCEABLE.equals(declaringNT)) {
+        Name declaringNT = def.getDeclaringNodeType();
+        Name name = def.getName();
+        if (NameConstants.MIX_REFERENCEABLE.equals(declaringNT)) {
             // mix:referenceable node type
-            if (QName.JCR_UUID.equals(name)) {
+            if (NameConstants.JCR_UUID.equals(name)) {
                 // jcr:uuid property
                 genValues = new InternalValue[]{InternalValue.create(
                         parent.getNodeId().getUUID().toString())};
             }
-        } else if (QName.NT_BASE.equals(declaringNT)) {
+        } else if (NameConstants.NT_BASE.equals(declaringNT)) {
             // nt:base node type
-            if (QName.JCR_PRIMARYTYPE.equals(name)) {
+            if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
                 // jcr:primaryType property
                 genValues = new InternalValue[]{InternalValue.create(parent.getNodeTypeName())};
-            } else if (QName.JCR_MIXINTYPES.equals(name)) {
+            } else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
                 // jcr:mixinTypes property
                 Set mixins = parent.getMixinTypeNames();
                 ArrayList values = new ArrayList(mixins.size());
                 Iterator iter = mixins.iterator();
                 while (iter.hasNext()) {
-                    values.add(InternalValue.create((QName) iter.next()));
+                    values.add(InternalValue.create((Name) iter.next()));
                 }
                 genValues = (InternalValue[]) values.toArray(new InternalValue[values.size()]);
             }
-        } else if (QName.NT_HIERARCHYNODE.equals(declaringNT)) {
+        } else if (NameConstants.NT_HIERARCHYNODE.equals(declaringNT)) {
             // nt:hierarchyNode node type
-            if (QName.JCR_CREATED.equals(name)) {
+            if (NameConstants.JCR_CREATED.equals(name)) {
                 // jcr:created property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
-        } else if (QName.NT_RESOURCE.equals(declaringNT)) {
+        } else if (NameConstants.NT_RESOURCE.equals(declaringNT)) {
             // nt:resource node type
-            if (QName.JCR_LASTMODIFIED.equals(name)) {
+            if (NameConstants.JCR_LASTMODIFIED.equals(name)) {
                 // jcr:lastModified property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
-        } else if (QName.NT_VERSION.equals(declaringNT)) {
+        } else if (NameConstants.NT_VERSION.equals(declaringNT)) {
             // nt:version node type
-            if (QName.JCR_CREATED.equals(name)) {
+            if (NameConstants.JCR_CREATED.equals(name)) {
                 // jcr:created property
                 genValues = new InternalValue[]{InternalValue.create(Calendar.getInstance())};
             }
@@ -1528,7 +1529,7 @@
         // use temp set to avoid ConcurrentModificationException
         HashSet tmp = new HashSet(targetState.getPropertyNames());
         for (Iterator iter = tmp.iterator(); iter.hasNext();) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             PropertyId propId =
                     new PropertyId(targetState.getNodeId(), propName);
             try {
@@ -1583,8 +1584,8 @@
         try {
             NodeId id;
             EffectiveNodeType ent = getEffectiveNodeType(srcState);
-            boolean referenceable = ent.includesNodeType(QName.MIX_REFERENCEABLE);
-            boolean versionable = ent.includesNodeType(QName.MIX_VERSIONABLE);
+            boolean referenceable = ent.includesNodeType(NameConstants.MIX_REFERENCEABLE);
+            boolean versionable = ent.includesNodeType(NameConstants.MIX_VERSIONABLE);
             switch (flag) {
                 case COPY:
                     // always create new uuid
@@ -1673,7 +1674,7 @@
             // copy properties
             iter = srcState.getPropertyNames().iterator();
             while (iter.hasNext()) {
-                QName propName = (QName) iter.next();
+                Name propName = (Name) iter.next();
                 PropertyId propId = new PropertyId(srcState.getNodeId(), propName);
                 if (!srcAccessMgr.isGranted(propId, AccessManager.READ)) {
                     continue;
@@ -1690,7 +1691,7 @@
                  */
                 PropDefId defId = srcChildState.getDefinitionId();
                 PropDef def = ntReg.getPropDef(defId);
-                if (def.getDeclaringNodeType().equals(QName.MIX_LOCKABLE)) {
+                if (def.getDeclaringNodeType().equals(NameConstants.MIX_LOCKABLE)) {
                     // skip properties defined by mix:lockable
                     continue;
                 }
@@ -1704,19 +1705,19 @@
                      * copied properties declared by mix:versionable need to be
                      * adjusted accordingly.
                      */
-                    if (propName.equals(QName.JCR_VERSIONHISTORY)) {
+                    if (propName.equals(NameConstants.JCR_VERSIONHISTORY)) {
                         // jcr:versionHistory
                         VersionHistory vh = getOrCreateVersionHistory(newState);
                         newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getUUID()))});
-                    } else if (propName.equals(QName.JCR_BASEVERSION)) {
+                    } else if (propName.equals(NameConstants.JCR_BASEVERSION)) {
                         // jcr:baseVersion
                         VersionHistory vh = getOrCreateVersionHistory(newState);
                         newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getRootVersion().getUUID()))});
-                    } else if (propName.equals(QName.JCR_PREDECESSORS)) {
+                    } else if (propName.equals(NameConstants.JCR_PREDECESSORS)) {
                         // jcr:predecessors
                         VersionHistory vh = getOrCreateVersionHistory(newState);
                         newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getRootVersion().getUUID()))});
-                    } else if (propName.equals(QName.JCR_ISCHECKEDOUT)) {
+                    } else if (propName.equals(NameConstants.JCR_ISCHECKEDOUT)) {
                         // jcr:isCheckedOut
                         newChildState.setValues(new InternalValue[]{InternalValue.create(true)});
                     }
@@ -1749,7 +1750,7 @@
      */
     private PropertyState copyPropertyState(PropertyState srcState,
                                             NodeId parentId,
-                                            QName propName)
+                                            Name propName)
             throws RepositoryException {
 
         PropDefId defId = srcState.getDefinitionId();
@@ -1769,8 +1770,8 @@
              *
              * todo FIXME delegate to 'node type instance handler'
              */
-            if (def.getDeclaringNodeType().equals(QName.MIX_REFERENCEABLE)
-                    && propName.equals(QName.JCR_UUID)) {
+            if (def.getDeclaringNodeType().equals(NameConstants.MIX_REFERENCEABLE)
+                    && propName.equals(NameConstants.JCR_UUID)) {
                 // set correct value of jcr:uuid property
                 newState.setValues(new InternalValue[]{InternalValue.create(parentId.getUUID().toString())});
             } else {
Index: src/main/java/org/apache/jackrabbit/core/query/QueryNodeFactory.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryNodeFactory.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryNodeFactory.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * A factory for {@link QueryNode}s.
@@ -31,7 +31,7 @@
      * @return a {@link NodeTypeQueryNode}.
      */
     public NodeTypeQueryNode createNodeTypeQueryNode(
-            QueryNode parent, QName nodeType);
+            QueryNode parent, Name nodeType);
 
     /**
      * Creates a {@link AndQueryNode} instance.
@@ -60,7 +60,7 @@
      * @return a {@link DerefQueryNode}.
      */
     public DerefQueryNode createDerefQueryNode(
-            QueryNode parent, QName nameTest, boolean descendants);
+            QueryNode parent, Name nameTest, boolean descendants);
 
     /**
      * Creates a {@link NotQueryNode} instance.
Index: src/main/java/org/apache/jackrabbit/core/query/TextsearchQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/TextsearchQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/TextsearchQueryNode.java	(working copy)
@@ -16,9 +16,10 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Implements a query node that defines a textsearch clause.
@@ -94,7 +95,7 @@
      * @return property name or <code>null</code>.
      * @deprecated Use {@link #getRelativePath()} instead.
      */
-    public QName getPropertyName() {
+    public Name getPropertyName() {
         return relPath == null ? null : relPath.getNameElement().getName();
     }
 
@@ -104,8 +105,8 @@
      * @param property the name of the property.
      * @deprecated Use {@link #setRelativePath(Path)} instead.
      */
-    public void setPropertyName(QName property) {
-        Path.PathBuilder builder = new Path.PathBuilder();
+    public void setPropertyName(Name property) {
+        PathBuilder builder = new PathBuilder();
         builder.addLast(property);
         try {
             this.relPath = builder.getPath();
@@ -149,8 +150,8 @@
      *
      * @param element the path element to append.
      */
-    public void addPathElement(Path.PathElement element) {
-        Path.PathBuilder builder = new Path.PathBuilder();
+    public void addPathElement(Path.Element element) {
+        PathBuilder builder = new PathBuilder();
         if (relPath != null) {
             builder.addAll(relPath.getElements());
         }
@@ -193,7 +194,7 @@
         }
         return false;
     }
-    
+
     /**
      * {@inheritDoc}
      */
Index: src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/PreparedQueryImpl.java	(working copy)
@@ -20,8 +20,8 @@
 import org.apache.jackrabbit.core.query.qom.QueryObjectModelTree;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.ItemManager;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.Value;
 import javax.jcr.RepositoryException;
@@ -73,11 +73,11 @@
         this.node = node;
         this.handler = handler;
 
-        if (!node.isNodeType(session.getJCRName(QName.NT_QUERY))) {
+        if (!node.isNodeType(session.getJCRName(NameConstants.NT_QUERY))) {
             throw new InvalidQueryException("node is not of type nt:query");
         }
-        this.statement = node.getProperty(session.getJCRName(QName.JCR_STATEMENT)).getString();
-        this.language = node.getProperty(session.getJCRName(QName.JCR_LANGUAGE)).getString();
+        this.statement = node.getProperty(session.getJCRName(NameConstants.JCR_STATEMENT)).getString();
+        this.language = node.getProperty(session.getJCRName(NameConstants.JCR_LANGUAGE)).getString();
         setExecutableQuery(handler.createExecutablePreparedQuery(
                 session, itemMgr, createQOMTree(statement, language)));
         setInitialized();
Index: src/main/java/org/apache/jackrabbit/core/query/QueryRootNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryRootNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryRootNode.java	(working copy)
@@ -16,11 +16,11 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
-
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.jackrabbit.spi.Name;
+
 /**
  * Implements the root node of a query tree.
  */
@@ -32,7 +32,7 @@
     private PathQueryNode locationNode;
 
     /**
-     * The list of property names (as {@link org.apache.jackrabbit.name.QName}s
+     * The list of property names (as {@link org.apache.jackrabbit.spi.Name}s
      * to select.
      */
     private List selectProperties = new ArrayList();
@@ -74,7 +74,7 @@
      *
      * @param propName the name of the property to select.
      */
-    public void addSelectProperty(QName propName) {
+    public void addSelectProperty(Name propName) {
         selectProperties.add(propName);
     }
 
@@ -83,8 +83,8 @@
      *
      * @return an array of select properties.
      */
-    public QName[] getSelectProperties() {
-        return (QName[]) selectProperties.toArray(new QName[selectProperties.size()]);
+    public Name[] getSelectProperties() {
+        return (Name[]) selectProperties.toArray(new Name[selectProperties.size()]);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/query/PathQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/PathQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/PathQueryNode.java	(working copy)
@@ -18,7 +18,8 @@
 
 import java.util.List;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Implements a query node that defines a path restriction.
@@ -52,7 +53,7 @@
     }
 
     /**
-     * Returns a list of valid node types under /jcr:system. List&lt;QName>.
+     * Returns a list of valid node types under /jcr:system. List&lt;Name>.
      *
      * @return a list of valid node types under /jcr:system.
      */
@@ -142,7 +143,7 @@
             return true;
         }
 
-        QName firstPathStepName = pathSteps[0].getNameTest();
+        Name firstPathStepName = pathSteps[0].getNameTest();
         if (firstPathStepName == null) {
             // If the first operand of the path steps is a node type query
             // we do not need to include the system index if the node type is
@@ -163,7 +164,7 @@
         
         // Calculate the first workspace relative location step
         LocationStepQueryNode firstWorkspaceRelativeStep = pathSteps[0];
-        if (firstPathStepName.equals(QName.ROOT)) {
+        if (firstPathStepName.equals(NameConstants.ROOT)) {
             // path starts with "/jcr:root"
             if (pathSteps.length > 1) {
                 firstWorkspaceRelativeStep = pathSteps[1];
@@ -176,9 +177,9 @@
 
         // If the first workspace relative location step is jcr:system we need 
         // to include the system tree
-        QName firstWorkspaceRelativeName = firstWorkspaceRelativeStep.getNameTest();
+        Name firstWorkspaceRelativeName = firstWorkspaceRelativeStep.getNameTest();
         if (firstWorkspaceRelativeName == null
-                || firstWorkspaceRelativeName.equals(QName.JCR_SYSTEM)) {
+                || firstWorkspaceRelativeName.equals(NameConstants.JCR_SYSTEM)) {
             return true;
         }
         
Index: src/main/java/org/apache/jackrabbit/core/query/ExecutablePreparedQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/ExecutablePreparedQuery.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/ExecutablePreparedQuery.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.Value;
 import javax.jcr.RepositoryException;
@@ -37,6 +37,6 @@
      *                                       valid variable in this query.
      * @throws javax.jcr.RepositoryException if an error occurs.
      */
-    public void bindValue(QName varName, Value value)
+    public void bindValue(Name varName, Value value)
             throws IllegalArgumentException, RepositoryException;
 }
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/AggregateRuleImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/AggregateRuleImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/AggregateRuleImpl.java	(working copy)
@@ -16,13 +16,13 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.UnknownPrefixException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameResolver;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.ItemStateException;
@@ -34,6 +34,7 @@
 import org.w3c.dom.CharacterData;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
@@ -48,14 +49,14 @@
 class AggregateRuleImpl implements AggregateRule {
 
     /**
-     * A namespace resolver for parsing QNames in the configuration.
+     * A name resolver for parsing QNames in the configuration.
      */
-    private final NamespaceResolver nsResolver;
+    private final NameResolver resolver;
 
     /**
      * The node type of the root node of the indexing aggregate.
      */
-    private final QName nodeTypeName;
+    private final Name nodeTypeName;
 
     /**
      * The rules that define this indexing aggregate.
@@ -76,23 +77,22 @@
      * Creates a new indexing aggregate using the given <code>config</code>.
      *
      * @param config     the configuration for this indexing aggregate.
-     * @param nsResolver the namespace resolver for parsing QNames within the
-     *                   config.
+     * @param resolver   the name resolver for parsing Names within the config.
      * @param ism        the item state manager of the workspace.
      * @param hmgr       a hierarchy manager for the item state manager.
      * @throws MalformedPathException if a path in the configuration is
      *                                malformed.
      * @throws IllegalNameException   if a node type name contains illegal
      *                                characters.
-     * @throws UnknownPrefixException if a node type contains an unknown
+     * @throws NamespaceException if a node type contains an unknown
      *                                prefix.
      */
     AggregateRuleImpl(Node config,
-                      NamespaceResolver nsResolver,
+                      NameResolver resolver,
                       ItemStateManager ism,
                       HierarchyManager hmgr)
-            throws MalformedPathException, IllegalNameException, UnknownPrefixException {
-        this.nsResolver = nsResolver;
+            throws MalformedPathException, IllegalNameException, NamespaceException {
+        this.resolver = resolver;
         this.nodeTypeName = getNodeTypeName(config);
         this.rules = getRules(config);
         this.ism = ism;
@@ -155,13 +155,13 @@
      * @return the name of the node type.
      * @throws IllegalNameException   if the node type name contains illegal
      *                                characters.
-     * @throws UnknownPrefixException if the node type contains an unknown
+     * @throws NamespaceException if the node type contains an unknown
      *                                prefix.
      */
-    private QName getNodeTypeName(Node config)
-            throws IllegalNameException, UnknownPrefixException {
+    private Name getNodeTypeName(Node config)
+            throws IllegalNameException, NamespaceException {
         String ntString = config.getAttributes().getNamedItem("primaryType").getNodeValue();
-        return NameFormat.parse(ntString, nsResolver);
+        return resolver.getQName(ntString);
     }
 
     /**
@@ -173,28 +173,28 @@
      *                                malformed.
      * @throws IllegalNameException   if the node type name contains illegal
      *                                characters.
-     * @throws UnknownPrefixException if the node type contains an unknown
+     * @throws NamespaceException if the node type contains an unknown
      *                                prefix.
      */
     private Rule[] getRules(Node config)
-            throws MalformedPathException, IllegalNameException, UnknownPrefixException {
+            throws MalformedPathException, IllegalNameException, NamespaceException {
         List rules = new ArrayList();
         NodeList childNodes = config.getChildNodes();
         for (int i = 0; i < childNodes.getLength(); i++) {
             Node n = childNodes.item(i);
             if (n.getNodeName().equals("include")) {
-                QName ntName = null;
+                Name ntName = null;
                 Node ntAttr = n.getAttributes().getNamedItem("primaryType");
                 if (ntAttr != null) {
-                    ntName = NameFormat.parse(ntAttr.getNodeValue(), nsResolver);
+                    ntName = resolver.getQName(ntAttr.getNodeValue());
                 }
                 String[] elements = Text.explode(getTextContent(n), '/');
-                Path.PathBuilder builder = new Path.PathBuilder();
+                PathBuilder builder = new PathBuilder();
                 for (int j = 0; j < elements.length; j++) {
                     if (elements[j].equals("*")) {
-                        builder.addLast(new QName("", "*"));
+                        builder.addLast(NameConstants.ANY_NAME);
                     } else {
-                        builder.addLast(NameFormat.parse(elements[j], nsResolver));
+                        builder.addLast(resolver.getQName(elements[j]));
                     }
                 }
                 rules.add(new Rule(builder.getPath(), ntName));
@@ -226,7 +226,7 @@
         /**
          * Optional node type name.
          */
-        private final QName nodeTypeName;
+        private final Name nodeTypeName;
 
         /**
          * A relative path pattern.
@@ -241,7 +241,7 @@
          *                     types are allowed.
          * @param pattern      a relative path pattern.
          */
-        private Rule(Path pattern, QName nodeTypeName) {
+        private Rule(Path pattern, Name nodeTypeName) {
             this.nodeTypeName = nodeTypeName;
             this.pattern = pattern;
         }
@@ -261,7 +261,7 @@
             if (nodeTypeName == null ||
                     nodeState.getNodeTypeName().equals(nodeTypeName)) {
                 // check pattern
-                Path.PathElement[] elements = pattern.getElements();
+                Path.Element[] elements = pattern.getElements();
                 for (int e = elements.length - 1; e >= 0; e--) {
                     NodeId parentId = nodeState.getParentId();
                     if (parentId == null) {
@@ -274,7 +274,7 @@
                         nodeState = parent;
                     } else {
                         // check name
-                        QName name = hmgr.getName(nodeState.getId());
+                        Name name = hmgr.getName(nodeState.getId());
                         if (elements[e].getName().equals(name)) {
                             nodeState = parent;
                         } else {
@@ -317,7 +317,7 @@
          */
         private void resolve(NodeState nodeState, List collector, int offset)
                 throws ItemStateException {
-            QName currentName = pattern.getElement(offset).getName();
+            Name currentName = pattern.getElements()[offset].getName();
             List cne;
             if (currentName.getLocalName().equals("*")) {
                 // matches all
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java	(working copy)
@@ -16,16 +16,12 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NameResolver;
-import org.apache.jackrabbit.name.ParsingNameResolver;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.ParsingPathResolver;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.conversion.ParsingNameResolver;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.conversion.ParsingPathResolver;
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.ItemStateException;
@@ -37,7 +33,11 @@
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.query.QueryHandlerContext;
 import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO9075;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
 import org.slf4j.Logger;
@@ -50,6 +50,7 @@
 import org.w3c.dom.Element;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Iterator;
@@ -73,14 +74,9 @@
     /**
      * A namespace resolver for parsing QNames in the configuration.
      */
-    private NamespaceResolver nsResolver;
+    private NameResolver resolver;
 
     /**
-     * The node type registry.
-     */
-    private NodeTypeRegistry ntReg;
-
-    /**
      * The item state manager to retrieve additional item states.
      */
     private ItemStateManager ism;
@@ -109,15 +105,18 @@
      * {@inheritDoc}
      */
     public void init(Element config, QueryHandlerContext context, NamespaceMappings nsMappings) throws Exception {
-        ntReg = context.getNodeTypeRegistry();
         ism = context.getItemStateManager();
-        NameResolver nameResolver = new ParsingNameResolver(
+        NameResolver nameResolver = new ParsingNameResolver(NameFactoryImpl.getInstance(),
                 context.getNamespaceRegistry());
-        PathResolver pathResolver = new ParsingPathResolver(nameResolver);
+        PathResolver pathResolver = new ParsingPathResolver(PathFactoryImpl.getInstance(),
+                nameResolver);
         hmgr = new HierarchyManagerImpl(context.getRootId(), ism, pathResolver);
-        nsResolver = new AdditionalNamespaceResolver(getNamespaces(config));
+        
+        NamespaceResolver nsResolver = new AdditionalNamespaceResolver(getNamespaces(config));
+        resolver = new ParsingNameResolver(NameFactoryImpl.getInstance(), nsResolver);
 
-        QName[] ntNames = ntReg.getRegisteredNodeTypes();
+        NodeTypeRegistry ntReg = context.getNodeTypeRegistry();
+        Name[] ntNames = ntReg.getRegisteredNodeTypes();
         List idxAggregates = new ArrayList();
         NodeList indexingConfigs = config.getChildNodes();
         for (int i = 0; i < indexingConfigs.getLength(); i++) {
@@ -138,7 +137,7 @@
                 }
             } else if (configNode.getNodeName().equals("aggregate")) {
                 idxAggregates.add(new AggregateRuleImpl(
-                        configNode, nsResolver, ism, hmgr));
+                        configNode, resolver, ism, hmgr));
             } else if (configNode.getNodeName().equals("analyzers")) {
                 NodeList childNodes = configNode.getChildNodes();
                 for (int j = 0; j < childNodes.getLength(); j++) {
@@ -158,8 +157,8 @@
                                     Node propertyNode = propertyChildNodes.item(k);
                                     if (propertyNode.getNodeName().equals("property")) {
                                         // get property name
-                                        QName propName = NameFormat.parse(getTextContent(propertyNode), nsResolver);
-                                        String fieldName = NameFormat.format(propName, nsMappings);
+                                        Name propName = resolver.getQName(getTextContent(propertyNode));
+                                        String fieldName = nsMappings.translatePropertyName(propName);
                                         // set analyzer for the fulltext property fieldname
                                         int idx = fieldName.indexOf(':');
                                         fieldName = fieldName.substring(0, idx + 1)
@@ -206,7 +205,7 @@
      * @return <code>true</code> if the property is fulltext indexed;
      *         <code>false</code> otherwise.
      */
-    public boolean isIndexed(NodeState state, QName propertyName) {
+    public boolean isIndexed(NodeState state, Name propertyName) {
         IndexingRule rule = getApplicableIndexingRule(state);
         if (rule != null) {
             return rule.isIndexed(propertyName);
@@ -224,7 +223,7 @@
      * @param propertyName the name of a property.
      * @return the boost value for the property.
      */
-    public float getPropertyBoost(NodeState state, QName propertyName) {
+    public float getPropertyBoost(NodeState state, Name propertyName) {
         IndexingRule rule = getApplicableIndexingRule(state);
         if (rule != null) {
             return rule.getBoost(propertyName);
@@ -257,7 +256,7 @@
      *         scope fulltext index.
      */
     public boolean isIncludedInNodeScopeIndex(NodeState state,
-                                              QName propertyName) {
+                                              Name propertyName) {
         IndexingRule rule = getApplicableIndexingRule(state);
         if (rule != null) {
             return rule.isIncludedInNodeScopeIndex(propertyName);
@@ -269,13 +268,13 @@
     
     /**
      * Returns the analyzer configured for the property with this fieldName 
-     * (the string representation ,JCR-style name, of the given <code>QName</code>
+     * (the string representation ,JCR-style name, of the given <code>Name</code>
      * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>)), 
      * and <code>null</code> if none is configured, or the configured analyzer
      * cannot be found. If <code>null</code> is returned, the default Analyzer
      * is used.
      * 
-     * @param fieldName the string representation ,JCR-style name, of the given <code>QName</code>
+     * @param fieldName the string representation ,JCR-style name, of the given <code>Name</code>
      * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>))
      * @return the <code>analyzer</code> to use for indexing this property 
      */
@@ -351,11 +350,11 @@
      * @return the property configurations defined in the <code>config</code>.
      * @throws IllegalNameException   if the node type name contains illegal
      *                                characters.
-     * @throws UnknownPrefixException if the node type contains an unknown
+     * @throws NamespaceException if the node type contains an unknown
      *                                prefix.
      */
     private Map getPropertyConfigs(Node config)
-            throws IllegalNameException, UnknownPrefixException {
+            throws IllegalNameException, NamespaceException {
         Map configs = new HashMap();
         NodeList childNodes = config.getChildNodes();
         for (int i = 0; i < childNodes.getLength(); i++) {
@@ -382,7 +381,7 @@
                 }
 
                 // get property name
-                QName propName = NameFormat.parse(getTextContent(n), nsResolver);
+                Name propName = resolver.getQName(getTextContent(n));
 
                 configs.put(propName, new PropertyConfig(boost, nodeScopeIndex));
             }
@@ -398,10 +397,10 @@
      *         condition set on the <code>config</code>.
      * @throws MalformedPathException if the condition string is malformed.
      * @throws IllegalNameException   if a name contains illegal characters.
-     * @throws UnknownPrefixException if a name contains an unknown prefix.
+     * @throws NamespaceException if a name contains an unknown prefix.
      */
     private PathExpression getCondition(Node config)
-            throws MalformedPathException, IllegalNameException, UnknownPrefixException {
+            throws MalformedPathException, IllegalNameException, NamespaceException {
         Node conditionAttr = config.getAttributes().getNamedItem("condition");
         if (conditionAttr == null) {
             return null;
@@ -409,9 +408,9 @@
         String conditionString = conditionAttr.getNodeValue();
         int idx;
         int axis;
-        QName elementTest = null;
-        QName nameTest = null;
-        QName propertyName;
+        Name elementTest = null;
+        Name nameTest = null;
+        Name propertyName;
         String propertyValue;
 
         // parse axis
@@ -436,11 +435,11 @@
                 String name = conditionString.substring(
                         idx + "element(".length(), colon).trim();
                 if (!name.equals("*")) {
-                    nameTest = NameFormat.parse(ISO9075.decode(name), nsResolver);
+                    nameTest = resolver.getQName(ISO9075.decode(name));
                 }
                 idx = conditionString.indexOf(")/@", colon);
                 String type = conditionString.substring(colon + 1, idx).trim();
-                elementTest = NameFormat.parse(ISO9075.decode(type), nsResolver);
+                elementTest = resolver.getQName(ISO9075.decode(type));
                 idx += ")/@".length();
             } else {
                 if (axis == PathExpression.ANCESTOR ||
@@ -450,7 +449,7 @@
                     String name = conditionString.substring(idx,
                             conditionString.indexOf('/', idx));
                     if (!name.equals("*")) {
-                        nameTest = NameFormat.parse(ISO9075.decode(name), nsResolver);
+                        nameTest = resolver.getQName(ISO9075.decode(name));
                     }
                     idx += name.length() + "/@".length();
                 }
@@ -459,7 +458,7 @@
             // parse property name
             int eq = conditionString.indexOf('=', idx);
             String name = conditionString.substring(idx, eq).trim();
-            propertyName = NameFormat.parse(ISO9075.decode(name), nsResolver);
+            propertyName = resolver.getQName(ISO9075.decode(name));
 
             // parse string value
             int quote = conditionString.indexOf('\'', eq) + 1;
@@ -494,10 +493,10 @@
         /**
          * The node type of this fulltext indexing rule.
          */
-        private final QName nodeTypeName;
+        private final Name nodeTypeName;
 
         /**
-         * Map of {@link PropertyConfig}. Key=QName of property.
+         * Map of {@link PropertyConfig}. Key=Name of property.
          */
         private final Map propConfigs;
 
@@ -516,10 +515,10 @@
          * @param config the configuration for this rule.
          * @throws MalformedPathException if the condition expression is malformed.
          * @throws IllegalNameException   if a name contains illegal characters.
-         * @throws UnknownPrefixException if a name contains an unknown prefix.
+         * @throws NamespaceException if a name contains an unknown prefix.
          */
         IndexingRule(Node config)
-                throws MalformedPathException, IllegalNameException, UnknownPrefixException {
+                throws MalformedPathException, IllegalNameException, NamespaceException {
             this.nodeTypeName = getNodeTypeName(config);
             this.propConfigs = getPropertyConfigs(config);
             this.condition = getCondition(config);
@@ -531,7 +530,7 @@
          *
          * @return name of the node type.
          */
-        public QName getNodeTypeName() {
+        public Name getNodeTypeName() {
             return nodeTypeName;
         }
 
@@ -550,7 +549,7 @@
          * @return <code>true</code> if the property is indexed;
          *         <code>false</code> otherwise.
          */
-        public boolean isIndexed(QName propertyName) {
+        public boolean isIndexed(Name propertyName) {
             return propConfigs.containsKey(propertyName);
         }
 
@@ -562,7 +561,7 @@
          * @param propertyName the name of a property.
          * @return the boost value for the property.
          */
-        public float getBoost(QName propertyName) {
+        public float getBoost(Name propertyName) {
             PropertyConfig config = (PropertyConfig) propConfigs.get(propertyName);
             if (config != null) {
                 return config.boost;
@@ -580,7 +579,7 @@
          * @return <code>true</code> if the property should be included in the
          *         node scope fulltext index.
          */
-        public boolean isIncludedInNodeScopeIndex(QName propertyName) {
+        public boolean isIncludedInNodeScopeIndex(Name propertyName) {
             PropertyConfig config = (PropertyConfig) propConfigs.get(propertyName);
             if (config != null) {
                 return config.nodeScopeIndex;
@@ -617,13 +616,13 @@
          * @return the name of the node type.
          * @throws IllegalNameException   if the node type name contains illegal
          *                                characters.
-         * @throws UnknownPrefixException if the node type contains an unknown
+         * @throws NamespaceException if the node type contains an unknown
          *                                prefix.
          */
-        private QName getNodeTypeName(Node config)
-                throws IllegalNameException, UnknownPrefixException {
+        private Name getNodeTypeName(Node config)
+                throws IllegalNameException, NamespaceException {
             String ntString = config.getAttributes().getNamedItem("nodeType").getNodeValue();
-            return NameFormat.parse(ntString, nsResolver);
+            return resolver.getQName(ntString);
         }
 
         /**
@@ -680,16 +679,16 @@
 
         private final int axis;
 
-        private final QName elementTest;
+        private final Name elementTest;
 
-        private final QName nameTest;
+        private final Name nameTest;
 
-        private final QName propertyName;
+        private final Name propertyName;
 
         private final String propertyValue;
 
-        PathExpression(int axis, QName elementTest, QName nameTest,
-                       QName propertyName, String propertyValue) {
+        PathExpression(int axis, Name elementTest, Name nameTest,
+                       Name propertyName, String propertyValue) {
             this.axis = axis;
             this.elementTest = elementTest;
             this.nameTest = nameTest;
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/NamespaceMappings.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/NamespaceMappings.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/NamespaceMappings.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.UnknownPrefixException;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * The class <code>NamespaceMappings</code> holds a namespace mapping that is
@@ -31,11 +31,8 @@
      * Translates a property name from a session local namespace mapping into a
      * search index private namespace mapping.
      *
-     * @param name     the property name to translate
-     * @param resolver the <code>NamespaceResolver</code> of the local session.
-     * @return the translated property name
+     * @param qName     the property name to translate
+     * @return the translated JCR property name
      */
-    public String translatePropertyName(String name,
-                                        NamespaceResolver resolver)
-            throws IllegalNameException, UnknownPrefixException;
+    public String translatePropertyName(Name qName) throws IllegalNameException;
 }
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfiguration.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfiguration.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfiguration.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.query.QueryHandlerContext;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.lucene.analysis.Analyzer;
 import org.w3c.dom.Element;
 
@@ -62,7 +62,7 @@
      * @return <code>true</code> if the property is indexed; <code>false</code>
      *         otherwise.
      */
-    boolean isIndexed(NodeState state, QName propertyName);
+    boolean isIndexed(NodeState state, Name propertyName);
 
     /**
      * Returns <code>true</code> if the property with the given name should be
@@ -74,7 +74,7 @@
      * @return <code>true</code> if the property should be included in the node
      *         scope fulltext index.
      */
-    boolean isIncludedInNodeScopeIndex(NodeState state, QName propertyName);
+    boolean isIncludedInNodeScopeIndex(NodeState state, Name propertyName);
 
     /**
      * Returns the boost value for the given property name. If there is no
@@ -85,7 +85,7 @@
      * @param propertyName the name of a property.
      * @return the boost value for the property.
      */
-    float getPropertyBoost(NodeState state, QName propertyName);
+    float getPropertyBoost(NodeState state, Name propertyName);
 
     /**
      * Returns the boost for the node scope fulltext index field.
@@ -97,13 +97,13 @@
     
     /**
      * Returns the analyzer configured for the property with this fieldName 
-     * (the string representation ,JCR-style name, of the given <code>QName</code> 
+     * (the string representation ,JCR-style name, of the given <code>Name</code>
      * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>), 
      * and <code>null</code> if none is configured, or the configured analyzer
      * cannot be found. If <code>null</code> is returned, the default Analyzer
      * is used.
      * 
-     * @param fieldName the string representation ,JCR-style name, of the given <code>QName</code>, 
+     * @param fieldName the string representation ,JCR-style name, of the given <code>Name</code>,
      * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>)
      * @return the <code>analyzer</code> to use for indexing this property 
      */
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/SimpleExcerptProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/SimpleExcerptProvider.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/SimpleExcerptProvider.java	(working copy)
@@ -24,7 +24,7 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.state.ItemStateException;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.PropertyType;
 import java.io.IOException;
@@ -62,7 +62,7 @@
             String separator = "";
             for (Iterator it = nodeState.getPropertyNames().iterator();
                  it.hasNext() && text.length() < maxFragmentSize; ) {
-                PropertyId propId = new PropertyId(id, (QName) it.next());
+                PropertyId propId = new PropertyId(id, (Name) it.next());
                 PropertyState propState = (PropertyState) ism.getItemState(propId);
                 if (propState.getType() == PropertyType.STRING) {
                     text.append(separator);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/NSRegistryBasedNamespaceMappings.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/NSRegistryBasedNamespaceMappings.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/NSRegistryBasedNamespaceMappings.java	(working copy)
@@ -16,14 +16,11 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
-import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.NameResolver;
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
+import org.apache.jackrabbit.namespace.AbstractNamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.NamespaceException;
 
@@ -40,6 +37,11 @@
      */
     private final NamespaceRegistryImpl nsReg;
 
+        /**
+     * The name resolver used to translate the qualified name to JCR name
+     */
+    private final NameResolver nameResolver;
+
     /**
      * Creates a new <code>NSRegistryBasedNamespaceMappings</code>.
      *
@@ -47,6 +49,7 @@
      */
     NSRegistryBasedNamespaceMappings(NamespaceRegistryImpl nsReg) {
         this.nsReg = nsReg;
+        this.nameResolver = NamePathResolverImpl.create(this);
     }
 
     //-------------------------------< NamespaceResolver >----------------------
@@ -75,13 +78,11 @@
     /**
      * {@inheritDoc}
      */
-    public String translatePropertyName(String name,
-                                        NamespaceResolver resolver)
-            throws IllegalNameException, UnknownPrefixException {
-        QName qName = NameFormat.parse(name, resolver);
+    public String translatePropertyName(Name qName)
+            throws IllegalNameException {
         try {
-            return NameFormat.format(qName, this);
-        } catch (NoPrefixDeclaredException e) {
+            return nameResolver.getJCRName(qName);
+        } catch (NamespaceException e) {
             // should never happen actually, there is always a stable index
             // prefix for a known namespace uri
             throw new IllegalNameException("Internal error.", e);
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java	(working copy)
@@ -20,10 +20,8 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.security.AccessManager;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.lucene.search.Query;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,6 +30,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
+import javax.jcr.NamespaceException;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.RowIterator;
 import java.io.IOException;
@@ -60,9 +59,9 @@
     private final ItemManager itemMgr;
 
     /**
-     * The namespace resolver of the session executing the query
+     * The name and path resolver of the session executing the query
      */
-    protected final NamespaceResolver resolver;
+    protected final NamePathResolver resolver;
 
     /**
      * The access manager of the session that executes the query.
@@ -82,12 +81,12 @@
     /**
      * The select properties
      */
-    protected final QName[] selectProps;
+    protected final Name[] selectProps;
 
     /**
      * The names of properties to use for ordering the result set.
      */
-    protected final QName[] orderProps;
+    protected final Name[] orderProps;
 
     /**
      * The order specifier for each of the order properties.
@@ -156,12 +155,12 @@
      */
     public QueryResultImpl(SearchIndex index,
                            ItemManager itemMgr,
-                           NamespaceResolver resolver,
+                           NamePathResolver resolver,
                            AccessManager accessMgr,
                            AbstractQueryImpl queryImpl,
                            Query query,
-                           QName[] selectProps,
-                           QName[] orderProps,
+                           Name[] selectProps,
+                           Name[] orderProps,
                            boolean[] orderSpecs,
                            boolean documentOrder,
                            long offset,
@@ -189,14 +188,13 @@
         try {
             String[] propNames = new String[selectProps.length];
             for (int i = 0; i < selectProps.length; i++) {
-                propNames[i] = NameFormat.format(selectProps[i], resolver);
+                propNames[i] = resolver.getJCRName(selectProps[i]);
             }
             return propNames;
-        } catch (NoPrefixDeclaredException npde) {
+        } catch (NamespaceException npde) {
             String msg = "encountered invalid property name";
             log.debug(msg);
             throw new RepositoryException(msg, npde);
-
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/QueryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/QueryImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/QueryImpl.java	(working copy)
@@ -31,7 +31,8 @@
 import org.apache.jackrabbit.core.query.QueryRootNode;
 import org.apache.jackrabbit.core.query.AndQueryNode;
 import org.apache.jackrabbit.core.query.QueryNodeFactory;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.lucene.search.Query;
@@ -88,7 +89,7 @@
         // parse query according to language
         // build query tree using the passed factory
         this.root = QueryParser.parse(statement, language,
-                session.getNamespaceResolver(), factory);
+                session.getNamePathResolver(), factory);
         allNodesQueryNode = createMatchAllNodesQuery(factory);
     }
     
@@ -108,8 +109,8 @@
         // check for special query
         if (allNodesQueryNode.equals(root)) {
             return new WorkspaceTraversalResult(session,
-                    new QName[] { QName.JCR_PRIMARYTYPE, QName.JCR_PATH, QName.JCR_SCORE },
-                    session.getNamespaceResolver());
+                    new Name[] { NameConstants.JCR_PRIMARYTYPE, NameConstants.JCR_PATH, NameConstants.JCR_SCORE },
+                    session.getNamePathResolver());
         }
 
         // build lucene query
@@ -127,7 +128,7 @@
         } else {
             orderSpecs = new OrderQueryNode.OrderSpec[0];
         }
-        QName[] orderProperties = new QName[orderSpecs.length];
+        Name[] orderProperties = new Name[orderSpecs.length];
         boolean[] ascSpecs = new boolean[orderSpecs.length];
         for (int i = 0; i < orderSpecs.length; i++) {
             orderProperties[i] = orderSpecs[i].getProperty();
@@ -135,7 +136,7 @@
         }
 
         return new QueryResultImpl(index, itemMgr,
-                session.getNamespaceResolver(), session.getAccessManager(),
+                session.getNamePathResolver(), session.getAccessManager(),
                 this, query, getSelectProperties(), orderProperties, ascSpecs,
                 getRespectDocumentOrder(), offset, limit);
     }
@@ -146,14 +147,14 @@
      * @return array of select property names.
      * @throws RepositoryException if an error occurs.
      */
-    protected QName[] getSelectProperties() throws RepositoryException {
+    protected Name[] getSelectProperties() throws RepositoryException {
         // get select properties
         List selectProps = new ArrayList();
         selectProps.addAll(Arrays.asList(root.getSelectProperties()));
         if (selectProps.size() == 0) {
             // use node type constraint
             LocationStepQueryNode[] steps = root.getLocationNode().getPathSteps();
-            final QName[] ntName = new QName[1];
+            final Name[] ntName = new Name[1];
             steps[steps.length - 1].acceptOperands(new DefaultQueryNodeVisitor() {
 
                 public Object visit(AndQueryNode node, Object data) {
@@ -166,7 +167,7 @@
                 }
             }, null);
             if (ntName[0] == null) {
-                ntName[0] = QName.NT_BASE;
+                ntName[0] = NameConstants.NT_BASE;
             }
             NodeTypeImpl nt = session.getNodeTypeManager().getNodeType(ntName[0]);
             PropertyDefinition[] propDefs = nt.getPropertyDefinitions();
@@ -179,14 +180,14 @@
         }
 
         // add jcr:path and jcr:score if not selected already
-        if (!selectProps.contains(QName.JCR_PATH)) {
-            selectProps.add(QName.JCR_PATH);
+        if (!selectProps.contains(NameConstants.JCR_PATH)) {
+            selectProps.add(NameConstants.JCR_PATH);
         }
-        if (!selectProps.contains(QName.JCR_SCORE)) {
-            selectProps.add(QName.JCR_SCORE);
+        if (!selectProps.contains(NameConstants.JCR_SCORE)) {
+            selectProps.add(NameConstants.JCR_SCORE);
         }
 
-        return (QName[]) selectProps.toArray(new QName[selectProps.size()]);
+        return (Name[]) selectProps.toArray(new Name[selectProps.size()]);
     }
     
     /**
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/ChildAxisQuery.java	(working copy)
@@ -25,7 +25,7 @@
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
@@ -389,7 +389,7 @@
                                 return false;
                             } else {
                                 // only use the last one
-                                QName name = entry.getName();
+                                Name name = entry.getName();
                                 List childNodes = state.getChildNodeEntries(name);
                                 if (childNodes.size() == 0
                                         || !((NodeState.ChildNodeEntry) childNodes.get(childNodes.size() - 1))
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/NamePathResolverImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/NamePathResolverImpl.java	(revision 0)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/NamePathResolverImpl.java	(revision 0)
@@ -0,0 +1,113 @@
+/*
+ * 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.query.lucene;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.NameParser;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.conversion.ParsingPathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+
+import javax.jcr.NamespaceException;
+
+/**
+ * <code>NamePathResolverImpl</code>...
+ */
+public class NamePathResolverImpl extends DefaultNamePathResolver {
+
+    private static Logger log = LoggerFactory.getLogger(NamePathResolverImpl.class);
+
+    private static final NameFactory NAME_FACTORY = NameFactoryImpl.getInstance();
+    private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
+
+    private NamePathResolverImpl(NameResolver nResolver, PathResolver pResolver) {
+        super(nResolver, pResolver);
+    }
+
+    public static NamePathResolver create(NamespaceMappings nsMappings) {
+        NameResolver nResolver = new NameResolverImpl(nsMappings);
+        PathResolver pResolver = new ParsingPathResolver(PATH_FACTORY, nResolver);
+        return new NamePathResolverImpl(nResolver, pResolver);
+    }
+
+
+    //--------------------------------------------------------< inner class >---
+    /**
+     * Query specific NameResolver that does not assume an empty prefix for the
+     * default namespace URI. Instead the prefix is always retrieved from the
+     * NamespaceResolver.
+     */
+    private static class NameResolverImpl implements NameResolver {
+
+        /**
+         * Namespace resolver.
+         */
+        private final NamespaceResolver resolver;
+
+        /**
+         * Creates a parsing name resolver.
+         *
+         * @param resolver namespace resolver
+         */
+        public NameResolverImpl(NamespaceResolver resolver) {
+            this.resolver = resolver;
+        }
+
+        //-------------------------------------------------------< NameResolver >---
+        /**
+         * Parses the prefixed JCR name and returns the resolved qualified name.
+         *
+         * @param name prefixed JCR name
+         * @return qualified name
+         * @throws IllegalNameException if the JCR name format is invalid
+         * @throws NamespaceException if the namespace prefix can not be resolved
+         */
+        public Name getQName(String name) throws IllegalNameException, NamespaceException {
+            return NameParser.parse(name, resolver, NAME_FACTORY);
+        }
+
+        /**
+         * Returns the prefixed JCR name for the given qualified name.
+         * Note, that the JCR prefix is always retrieved from the NamespaceResolver
+         * even if the name is in the defaut namespace. This is a special treatement
+         * for query specific implementation, which defines a prefix for all namespace
+         * URIs including the default namespace.
+         *
+         * @param name qualified name
+         * @return prefixed JCR name
+         * @throws NamespaceException if the namespace URI can not be resolved
+         */
+        public String getJCRName(Name name) throws NamespaceException {
+            String uri = name.getNamespaceURI();
+            if (resolver.getPrefix(uri).length() == 0) {
+                return name.getLocalName();
+            } else {
+                return resolver.getPrefix(uri) + ":" + name.getLocalName();
+            }
+        }
+    }
+}
\ No newline at end of file

Property changes on: src\main\java\org\apache\jackrabbit\core\query\lucene\NamePathResolverImpl.java
___________________________________________________________________
Name: svn:keywords
   + author date id revision url
Name: svn:eol-style
   + native

Index: src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java	(working copy)
@@ -26,11 +26,10 @@
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.extractor.TextExtractor;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.PathFormat;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.apache.jackrabbit.uuid.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -80,6 +79,11 @@
     protected final NamespaceMappings mappings;
 
     /**
+     * Name and Path resolver.
+     */
+    protected final NamePathResolver resolver;
+
+    /**
      * Content extractor.
      */
     protected final TextExtractor extractor;
@@ -115,6 +119,7 @@
         this.node = node;
         this.stateProvider = stateProvider;
         this.mappings = mappings;
+        this.resolver = NamePathResolverImpl.create(mappings);
         this.extractor = extractor;
     }
 
@@ -185,21 +190,21 @@
                     throw new RepositoryException("Missing child node entry " +
                             "for node with id: " + node.getNodeId());
                 }
-                String name = NameFormat.format(child.getName(), mappings);
+                String name = resolver.getJCRName(child.getName());
                 doc.add(new Field(FieldNames.LABEL, name, Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO));
             }
         } catch (NoSuchItemStateException e) {
             throwRepositoryException(e);
         } catch (ItemStateException e) {
             throwRepositoryException(e);
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             // will never happen, because this.mappings will dynamically add
             // unknown uri<->prefix mappings
         }
 
         Set props = node.getPropertyNames();
         for (Iterator it = props.iterator(); it.hasNext();) {
-            QName propName = (QName) it.next();
+            Name propName = (Name) it.next();
             PropertyId id = new PropertyId(node.getNodeId(), propName);
             try {
                 PropertyState propState = (PropertyState) stateProvider.getItemState(id);
@@ -248,11 +253,11 @@
      * @param doc  the lucene document.
      * @param name the name of the multi-value property.
      */
-    private void addMVPName(Document doc, QName name) {
+    private void addMVPName(Document doc, Name name) {
         try {
-            String propName = NameFormat.format(name, mappings);
+            String propName = resolver.getJCRName(name);
             doc.add(new Field(FieldNames.MVP, propName, Field.Store.NO, Field.Index.UN_TOKENIZED, Field.TermVector.NO));
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             // will never happen, prefixes are created dynamically
         }
     }
@@ -264,11 +269,11 @@
      * @param value the internal jackrabbit value.
      * @param name  the name of the property.
      */
-    private void addValue(Document doc, InternalValue value, QName name) {
+    private void addValue(Document doc, InternalValue value, Name name) {
         String fieldName = name.getLocalName();
         try {
-            fieldName = NameFormat.format(name, mappings);
-        } catch (NoPrefixDeclaredException e) {
+            fieldName = resolver.getJCRName(name);
+        } catch (NamespaceException e) {
             // will never happen
         }
         switch (value.getType()) {
@@ -310,7 +315,7 @@
             case PropertyType.STRING:
                 if (isIndexed(name)) {
                     // never fulltext index jcr:uuid String
-                    if (name.equals(QName.JCR_UUID)) {
+                    if (name.equals(NameConstants.JCR_UUID)) {
                         addStringValue(doc, fieldName, value.getString(),
                                 false, false, DEFAULT_BOOST);
                     } else {
@@ -324,8 +329,8 @@
                 // jcr:primaryType and jcr:mixinTypes are required for correct
                 // node type resolution in queries
                 if (isIndexed(name) ||
-                        name.equals(QName.JCR_PRIMARYTYPE) ||
-                        name.equals(QName.JCR_MIXINTYPES)) {
+                        name.equals(NameConstants.JCR_PRIMARYTYPE) ||
+                        name.equals(NameConstants.JCR_MIXINTYPES)) {
                     addNameValue(doc, fieldName, value.getQName());
                 }
                 break;
@@ -340,11 +345,11 @@
      * @param doc  the document.
      * @param name the name of the property.
      */
-    private void addPropertyName(Document doc, QName name) {
+    private void addPropertyName(Document doc, Name name) {
         String fieldName = name.getLocalName();
         try {
-            fieldName = NameFormat.format(name, mappings);
-        } catch (NoPrefixDeclaredException e) {
+            fieldName = resolver.getJCRName(name);
+        } catch (NamespaceException e) {
             // will never happen
         }
         doc.add(new Field(FieldNames.PROPERTIES_SET, fieldName, Field.Store.NO, Field.Index.NO_NORMS));
@@ -366,19 +371,19 @@
                                   Object internalValue) {
         // 'check' if node is of type nt:resource
         try {
-            String jcrData = mappings.getPrefix(QName.NS_JCR_URI) + ":data";
+            String jcrData = mappings.getPrefix(Name.NS_JCR_URI) + ":data";
             if (!jcrData.equals(fieldName)) {
                 // don't know how to index
                 return;
             }
 
-            InternalValue typeValue = getValue(QName.JCR_MIMETYPE);
+            InternalValue typeValue = getValue(NameConstants.JCR_MIMETYPE);
             if (typeValue != null) {
                 String type = typeValue.getString();
 
                 // jcr:encoding is not mandatory
                 String encoding = null;
-                InternalValue encodingValue = getValue(QName.JCR_ENCODING);
+                InternalValue encodingValue = getValue(NameConstants.JCR_ENCODING);
                 if (encodingValue != null) {
                     encoding = encodingValue.getString();
                 }
@@ -404,7 +409,7 @@
      * @return value of the named property, or <code>null</code>
      * @throws ItemStateException if the property can not be accessed
      */
-    protected InternalValue getValue(QName name) throws ItemStateException {
+    protected InternalValue getValue(Name name) throws ItemStateException {
         try {
             PropertyId id = new PropertyId(node.getNodeId(), name);
             PropertyState property =
@@ -524,8 +529,8 @@
         Path path = (Path) internalValue;
         String pathString = path.toString();
         try {
-            pathString = PathFormat.format(path, mappings);
-        } catch (NoPrefixDeclaredException e) {
+            pathString = resolver.getJCRPath(path);
+        } catch (NamespaceException e) {
             // will never happen
         }
         doc.add(createFieldWithoutNorms(fieldName, pathString, false));
@@ -617,7 +622,7 @@
      * @param internalValue The value for the field to add to the document.
      */
     protected void addNameValue(Document doc, String fieldName, Object internalValue) {
-        QName qualiName = (QName) internalValue;
+        Name qualiName = (Name) internalValue;
         String normValue = qualiName.toString();
         try {
             normValue = mappings.getPrefix(qualiName.getNamespaceURI())
@@ -692,7 +697,7 @@
      * @return <code>true</code> if the property should be fulltext indexed;
      *         <code>false</code> otherwise.
      */
-    protected boolean isIndexed(QName propertyName) {
+    protected boolean isIndexed(Name propertyName) {
         if (indexingConfig == null) {
             return true;
         } else {
@@ -708,7 +713,7 @@
      * @return <code>true</code> if it should be added to the node scope index;
      *         <code>false</code> otherwise.
      */
-    protected boolean isIncludedInNodeIndex(QName propertyName) {
+    protected boolean isIncludedInNodeIndex(Name propertyName) {
         if (indexingConfig == null) {
             return true;
         } else {
@@ -722,7 +727,7 @@
      * @param propertyName the name of a property.
      * @return the boost value for the given property name.
      */
-    protected float getPropertyBoost(QName propertyName) {
+    protected float getPropertyBoost(Name propertyName) {
         if (indexingConfig == null) {
             return DEFAULT_BOOST;
         } else {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/PreparedQueryImpl.java	(working copy)
@@ -26,7 +26,7 @@
 import org.apache.jackrabbit.core.query.qom.OrderingImpl;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.ItemManager;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.lucene.search.Query;
 
 import javax.jcr.Value;
@@ -50,12 +50,12 @@
     private final QueryObjectModelTree qomTree;
 
     /**
-     * Set&lt;QName>, where QName is a variable name in the QOM tree.
+     * Set&lt;Name>, where Name is a variable name in the QOM tree.
      */
     private final Set variableNames = new HashSet();
 
     /**
-     * Binding of variable name to value. Maps {@link QName} to {@link Value}.
+     * Binding of variable name to value. Maps {@link Name} to {@link Value}.
      */
     private final Map bindValues = new HashMap();
 
@@ -108,19 +108,19 @@
                 propReg, index.getSynonymProvider(), bindValues);
 
         ColumnImpl[] columns = qomTree.getColumns();
-        QName[] selectProps = new QName[columns.length];
+        Name[] selectProps = new Name[columns.length];
         for (int i = 0; i < columns.length; i++) {
             selectProps[i] = columns[i].getPropertyQName();
         }
         OrderingImpl[] orderings = qomTree.getOrderings();
         // TODO: there are many kinds of DynamicOperand that can be ordered by
-        QName[] orderProps = new QName[orderings.length];
+        Name[] orderProps = new Name[orderings.length];
         boolean[] orderSpecs = new boolean[orderings.length];
         for (int i = 0; i < orderings.length; i++) {
             orderSpecs[i] = orderings[i].getOrder() == QueryObjectModelConstants.ORDER_ASCENDING;
         }
         return new QueryResultImpl(index, itemMgr,
-                session.getNamespaceResolver(), session.getAccessManager(),
+                session.getNamePathResolver(), session.getAccessManager(),
                 this, query, selectProps, orderProps, orderSpecs,
                 getRespectDocumentOrder(), offset, limit);
     }
@@ -137,7 +137,7 @@
      *                                  variable in this query.
      * @throws RepositoryException      if an error occurs.
      */
-    public void bindValue(QName varName, Value value)
+    public void bindValue(Name varName, Value value)
             throws IllegalArgumentException, RepositoryException {
         if (!variableNames.contains(varName)) {
             throw new IllegalArgumentException("not a valid variable in this query");
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java	(working copy)
@@ -32,9 +32,9 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.extractor.DefaultTextExtractor;
 import org.apache.jackrabbit.extractor.TextExtractor;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.apache.jackrabbit.uuid.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,6 +55,7 @@
 import org.w3c.dom.Element;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import javax.jcr.query.InvalidQueryException;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.DocumentBuilder;
@@ -78,21 +79,21 @@
 public class SearchIndex extends AbstractQueryHandler {
 
     public static final List VALID_SYSTEM_INDEX_NODE_TYPE_NAMES
-        = Collections.unmodifiableList(Arrays.asList(new QName[]{
-            QName.NT_CHILDNODEDEFINITION,
-            QName.NT_FROZENNODE,
-            QName.NT_NODETYPE,
-            QName.NT_PROPERTYDEFINITION,
-            QName.NT_VERSION,
-            QName.NT_VERSIONEDCHILD,
-            QName.NT_VERSIONHISTORY,
-            QName.NT_VERSIONLABELS,
-            QName.REP_NODETYPES,
-            QName.REP_SYSTEM,
-            QName.REP_VERSIONSTORAGE,
+        = Collections.unmodifiableList(Arrays.asList(new Name[]{
+            NameConstants.NT_CHILDNODEDEFINITION,
+            NameConstants.NT_FROZENNODE,
+            NameConstants.NT_NODETYPE,
+            NameConstants.NT_PROPERTYDEFINITION,
+            NameConstants.NT_VERSION,
+            NameConstants.NT_VERSIONEDCHILD,
+            NameConstants.NT_VERSIONHISTORY,
+            NameConstants.NT_VERSIONLABELS,
+            NameConstants.REP_NODETYPES,
+            NameConstants.REP_SYSTEM,
+            NameConstants.REP_VERSIONSTORAGE,
             // Supertypes
-            QName.NT_BASE,
-            QName.MIX_REFERENCEABLE
+            NameConstants.NT_BASE,
+            NameConstants.MIX_REFERENCEABLE
         }));
 
     private static final DefaultQueryNodeFactory DEFAULT_QUERY_NODE_FACTORY = new DefaultQueryNodeFactory(
@@ -172,6 +173,11 @@
     private NamespaceMappings nsMappings;
 
     /**
+     * The name and path resolver used internally.
+     */
+    private NamePathResolver npResolver;
+
+    /**
      * The location of the search index.
      * <p/>
      * Note: This is a <b>mandatory</b> parameter!
@@ -383,7 +389,8 @@
                         context.getNamespaceRegistry());
             }
         }
-        
+        npResolver = NamePathResolverImpl.create(nsMappings);
+
         indexingConfig = createIndexingConfiguration(nsMappings);
         analyzer.setIndexingConfig(indexingConfig);
         
@@ -599,7 +606,7 @@
      */
     public QueryHits executeQuery(AbstractQueryImpl queryImpl,
                                   Query query,
-                                  QName[] orderProps,
+                                  Name[] orderProps,
                                   boolean[] orderSpecs) throws IOException {
         checkOpen();
         SortField[] sortFields = createSortFields(orderProps, orderSpecs);
@@ -759,12 +766,12 @@
      * @param orderSpecs the order specs for the properties.
      * @return an array of sort fields
      */
-    protected SortField[] createSortFields(QName[] orderProps,
+    protected SortField[] createSortFields(Name[] orderProps,
                                            boolean[] orderSpecs) {
         List sortFields = new ArrayList();
         for (int i = 0; i < orderProps.length; i++) {
             String prop = null;
-            if (QName.JCR_SCORE.equals(orderProps[i])) {
+            if (NameConstants.JCR_SCORE.equals(orderProps[i])) {
                 // order on jcr:score does not use the natural order as
                 // implemented in lucene. score ascending in lucene means that
                 // higher scores are first. JCR specs that lower score values
@@ -772,8 +779,8 @@
                 sortFields.add(new SortField(null, SortField.SCORE, orderSpecs[i]));
             } else {
                 try {
-                    prop = NameFormat.format(orderProps[i], getNamespaceMappings());
-                } catch (NoPrefixDeclaredException e) {
+                    prop = npResolver.getJCRName(orderProps[i]);
+                } catch (NamespaceException e) {
                     // will never happen
                 }
                 sortFields.add(new SortField(prop, SharedFieldSortComparator.PROPERTIES, !orderSpecs[i]));
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.ItemManager;
 import org.apache.jackrabbit.core.NodeImpl;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -192,8 +192,8 @@
                                 invalidIDs.add(n2.getNodeId());
                                 throw new SortFailedException();
                             }
-                            Path.PathElement[] path1 = node1.getPrimaryPath().getElements();
-                            Path.PathElement[] path2 = node2.getPrimaryPath().getElements();
+                            Path.Element[] path1 = node1.getPrimaryPath().getElements();
+                            Path.Element[] path2 = node2.getPrimaryPath().getElements();
 
                             // find nearest common ancestor
                             int commonDepth = 0; // root
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/RowIteratorImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/RowIteratorImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/RowIteratorImpl.java	(working copy)
@@ -19,11 +19,11 @@
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.PropertyImpl;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.jackrabbit.value.LongValue;
 import org.apache.jackrabbit.value.PathValue;
 import org.apache.jackrabbit.value.StringValue;
@@ -37,6 +37,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.PathNotFoundException;
+import javax.jcr.NamespaceException;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
 import java.util.Arrays;
@@ -62,10 +63,10 @@
     private static final String EXCERPT_FUNC_LPAR = "excerpt(";
 
     /**
-     * The start QName for the rep:excerpt function: rep:excerpt(
+     * The start Name for the rep:excerpt function: rep:excerpt(
      */
-    private static final QName REP_EXCERPT_LPAR = new QName(
-            QName.NS_REP_URI, EXCERPT_FUNC_LPAR);
+    private static final Name REP_EXCERPT_LPAR = NameFactoryImpl.getInstance().create(
+            Name.NS_REP_URI, EXCERPT_FUNC_LPAR);
 
     /**
      * Iterator over nodes, that constitute the result set.
@@ -75,12 +76,12 @@
     /**
      * Array of select property names
      */
-    private final QName[] properties;
+    private final Name[] properties;
 
     /**
-     * The <code>NamespaceResolver</code> of the user <code>Session</code>.
+     * The <code>NamePathResolver</code> of the user <code>Session</code>.
      */
-    private final NamespaceResolver resolver;
+    private final NamePathResolver resolver;
 
     /**
      * The excerpt provider.
@@ -93,11 +94,10 @@
      *
      * @param nodes      a <code>ScoreNodeIterator</code> that contains the nodes of
      *                   the query result.
-     * @param properties <code>QName</code> of the select properties.
+     * @param properties <code>Name</code> of the select properties.
      * @param resolver   <code>NamespaceResolver</code> of the user
-     *                   <code>Session</code>.
      */
-    RowIteratorImpl(ScoreNodeIterator nodes, QName[] properties, NamespaceResolver resolver) {
+    RowIteratorImpl(ScoreNodeIterator nodes, Name[] properties, NamePathResolver resolver) {
         this(nodes, properties, resolver, null);
     }
 
@@ -107,15 +107,14 @@
      *
      * @param nodes      a <code>ScoreNodeIterator</code> that contains the
      *                   nodes of the query result.
-     * @param properties <code>QName</code> of the select properties.
+     * @param properties <code>Name</code> of the select properties.
      * @param resolver   <code>NamespaceResolver</code> of the user
      *                   <code>Session</code>.
      * @param exProvider the excerpt provider associated with the query result
-     *                   that created this row iterator.
      */
     RowIteratorImpl(ScoreNodeIterator nodes,
-                    QName[] properties,
-                    NamespaceResolver resolver,
+                    Name[] properties,
+                    NamePathResolver resolver,
                     ExcerptProvider exProvider) {
         this.nodes = nodes;
         this.properties = properties;
@@ -220,7 +219,7 @@
         private Value[] values;
 
         /**
-         * Set of select property <code>QName</code>s.
+         * Set of select property <code>Name</code>s.
          */
         private Set propertySet;
 
@@ -262,9 +261,9 @@
                         }
                     } else {
                         // property not set or jcr:path / jcr:score / jcr:highlight
-                        if (QName.JCR_PATH.equals(properties[i])) {
+                        if (NameConstants.JCR_PATH.equals(properties[i])) {
                             tmp[i] = PathValue.valueOf(node.getPath());
-                        } else if (QName.JCR_SCORE.equals(properties[i])) {
+                        } else if (NameConstants.JCR_SCORE.equals(properties[i])) {
                             tmp[i] = new LongValue(Math.round(score * 1000f));
                         } else if (isExcerptFunction(properties[i])) {
                             tmp[i] = getExcerpt();
@@ -301,7 +300,7 @@
                 propertySet = tmp;
             }
             try {
-                QName prop = NameFormat.parse(propertyName, resolver);
+                Name prop = resolver.getQName(propertyName);
                 if (!propertySet.contains(prop)) {
                     if (isExcerptFunction(propertyName)) {
                         // excerpt function with parameter
@@ -319,9 +318,9 @@
                     }
                 } else {
                     // either jcr:score, jcr:path or not set
-                    if (QName.JCR_PATH.equals(prop)) {
+                    if (NameConstants.JCR_PATH.equals(prop)) {
                         return PathValue.valueOf(node.getPath());
-                    } else if (QName.JCR_SCORE.equals(prop)) {
+                    } else if (NameConstants.JCR_SCORE.equals(prop)) {
                         return new LongValue(Math.round(score * 1000f));
                     } else if (isExcerptFunction(prop)) {
                         return getExcerpt();
@@ -340,12 +339,12 @@
         }
 
         /**
-         * @param name a QName.
+         * @param name a Name.
          * @return <code>true</code> if <code>name</code> is the rep:excerpt
          *         function, <code>false</code> otherwise.
          */
-        private boolean isExcerptFunction(QName name) {
-            return name.getNamespaceURI().equals(QName.NS_REP_URI) &&
+        private boolean isExcerptFunction(Name name) {
+            return name.getNamespaceURI().equals(Name.NS_REP_URI) &&
                     name.getLocalName().startsWith(EXCERPT_FUNC_LPAR);
         }
 
@@ -357,8 +356,8 @@
         private boolean isExcerptFunction(String name) {
             try {
                 return name.startsWith(
-                        NameFormat.format(REP_EXCERPT_LPAR, resolver));
-            } catch (NoPrefixDeclaredException e) {
+                        resolver.getJCRName(REP_EXCERPT_LPAR));
+            } catch (NamespaceException e) {
                 // will never happen
                 return false;
             }
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryBuilder.java	(working copy)
@@ -44,13 +44,13 @@
 import org.apache.jackrabbit.core.query.lucene.fulltext.QueryParser;
 import org.apache.jackrabbit.core.query.lucene.fulltext.ParseException;
 import org.apache.jackrabbit.core.state.ItemStateManager;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.PathFormat;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.MalformedPathException;
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.util.XMLChar;
 import org.apache.jackrabbit.util.ISO9075;
@@ -115,6 +115,11 @@
     private NamespaceMappings nsMappings;
 
     /**
+     * Name and Path resolver
+     */
+    private NamePathResolver resolver;
+
+    /**
      * The analyzer instance to use for contains function query parsing
      */
     private Analyzer analyzer;
@@ -173,6 +178,8 @@
         this.propRegistry = propReg;
         this.synonymProvider = synonymProvider;
         this.indexFormatVersion = indexFormatVersion;
+
+        this.resolver = NamePathResolverImpl.create(nsMappings);
     }
 
     /**
@@ -285,9 +292,9 @@
         String field = "";
         String value = "";
         try {
-            field = NameFormat.format(node.getPropertyName(), nsMappings);
-            value = NameFormat.format(node.getValue(), nsMappings);
-        } catch (NoPrefixDeclaredException e) {
+            field = resolver.getJCRName(node.getPropertyName());
+            value = resolver.getJCRName(node.getValue());
+        } catch (NamespaceException e) {
             // will never happen, prefixes are created when unknown
         }
         return new TermQuery(new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, value)));
@@ -297,8 +304,8 @@
 
         List terms = new ArrayList();
         try {
-            String mixinTypesField = NameFormat.format(QName.JCR_MIXINTYPES, nsMappings);
-            String primaryTypeField = NameFormat.format(QName.JCR_PRIMARYTYPE, nsMappings);
+            String mixinTypesField = resolver.getJCRName(NameConstants.JCR_MIXINTYPES);
+            String primaryTypeField = resolver.getJCRName(NameConstants.JCR_PRIMARYTYPE);
 
             NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
             NodeType base = ntMgr.getNodeType(session.getJCRName(node.getValue()));
@@ -307,13 +314,13 @@
                 // search for nodes where jcr:mixinTypes is set to this mixin
                 Term t = new Term(FieldNames.PROPERTIES,
                         FieldNames.createNamedValue(mixinTypesField,
-                                NameFormat.format(node.getValue(), nsMappings)));
+                                resolver.getJCRName(node.getValue())));
                 terms.add(t);
             } else {
                 // search for nodes where jcr:primaryType is set to this type
                 Term t = new Term(FieldNames.PROPERTIES,
                         FieldNames.createNamedValue(primaryTypeField,
-                                NameFormat.format(node.getValue(), nsMappings)));
+                                resolver.getJCRName(node.getValue())));
                 terms.add(t);
             }
 
@@ -323,8 +330,8 @@
                 NodeType nt = allTypes.nextNodeType();
                 NodeType[] superTypes = nt.getSupertypes();
                 if (Arrays.asList(superTypes).contains(base)) {
-                    String ntName = nsMappings.translatePropertyName(nt.getName(),
-                            session.getNamespaceResolver());
+                    Name n = session.getQName(nt.getName());
+                    String ntName = nsMappings.translatePropertyName(n);
                     Term t;
                     if (nt.isMixin()) {
                         // search on jcr:mixinTypes
@@ -366,7 +373,7 @@
                 fieldname = FieldNames.FULLTEXT;
             } else {
                 // final path element is a property name
-                QName propName = relPath.getNameElement().getName();
+                Name propName = relPath.getNameElement().getName();
                 StringBuffer tmp = new StringBuffer();
                 tmp.append(nsMappings.getPrefix(propName.getNamespaceURI()));
                 tmp.append(":").append(FieldNames.FULLTEXT_PREFIX);
@@ -408,11 +415,11 @@
             Query context = parser.parse(query.toString());
             if (relPath != null && (!node.getReferencesProperty() || relPath.getLength() > 1)) {
                 // text search on some child axis
-                Path.PathElement[] elements = relPath.getElements();
+                Path.Element[] elements = relPath.getElements();
                 for (int i = elements.length - 1; i >= 0; i--) {
                     String name = null;
                     if (!elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
-                        name = NameFormat.format(elements[i].getName(), nsMappings);;
+                        name = resolver.getJCRName(elements[i].getName());
                     }
                     // join text search with name test
                     // if path references property that's elements.length - 2
@@ -439,8 +446,6 @@
             exceptions.add(e);
         } catch (ParseException e) {
             exceptions.add(e);
-        } catch (NoPrefixDeclaredException e) {
-            exceptions.add(e);
         }
         return null;
     }
@@ -451,7 +456,7 @@
         if (steps.length > 0) {
             if (node.isAbsolute() && !steps[0].getIncludeDescendants()) {
                 // eat up first step
-                QName nameTest = steps[0].getNameTest();
+                Name nameTest = steps[0].getNameTest();
                 if (nameTest == null) {
                     // this is equivalent to the root node
                     context = new TermQuery(new Term(FieldNames.PARENT, ""));
@@ -463,8 +468,8 @@
                     // will never match anything!
                     String name = "";
                     try {
-                        name = NameFormat.format(nameTest, nsMappings);
-                    } catch (NoPrefixDeclaredException e) {
+                        name = resolver.getJCRName(nameTest);
+                    } catch (NamespaceException e) {
                         exceptions.add(e);
                     }
                     BooleanQuery and = new BooleanQuery();
@@ -525,9 +530,9 @@
         TermQuery nameTest = null;
         if (node.getNameTest() != null) {
             try {
-                String internalName = NameFormat.format(node.getNameTest(), nsMappings);
+                String internalName = resolver.getJCRName(node.getNameTest());
                 nameTest = new TermQuery(new Term(FieldNames.LABEL, internalName));
-            } catch (NoPrefixDeclaredException e) {
+            } catch (NamespaceException e) {
                 // should never happen
                 exceptions.add(e);
             }
@@ -554,8 +559,8 @@
                     // todo this will traverse the whole index, optimize!
                     Query subQuery = null;
                     try {
-                        subQuery = createMatchAllQuery(NameFormat.format(QName.JCR_PRIMARYTYPE, nsMappings));
-                    } catch (NoPrefixDeclaredException e) {
+                        subQuery = createMatchAllQuery(resolver.getJCRName(NameConstants.JCR_PRIMARYTYPE));
+                    } catch (NamespaceException e) {
                         // will never happen, prefixes are created when unknown
                     }
                     // only use descendant axis if path is not //*
@@ -588,10 +593,10 @@
         }
 
         try {
-            String refProperty = NameFormat.format(node.getRefProperty(), nsMappings);
+            String refProperty = resolver.getJCRName(node.getRefProperty());
             String nameTest = null;
             if (node.getNameTest() != null) {
-                nameTest = NameFormat.format(node.getNameTest(), nsMappings);
+                nameTest = resolver.getJCRName(node.getNameTest());
             }
 
             if (node.getIncludeDescendants()) {
@@ -612,7 +617,7 @@
                 context = andQuery;
             }
 
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             // should never happen
             exceptions.add(e);
         }
@@ -642,7 +647,7 @@
                         || node.getOperation() == QueryConstants.OPERATION_NE_GENERAL
                         || node.getOperation() == QueryConstants.OPERATION_NE_VALUE) {
                     // only use coercing on non-range operations
-                    QName propertyName = node.getRelativePath().getNameElement().getName();
+                    Name propertyName = node.getRelativePath().getNameElement().getName();
                     stringValues = getStringValues(propertyName, node.getStringValue());
                 } else {
                     stringValues[0] = node.getStringValue();
@@ -681,13 +686,13 @@
             // add the name of a dummy property because relPath actually
             // references a property. whereas the relPath of the similar
             // operation references a node
-            Path.PathBuilder builder;
+            PathBuilder builder;
             if (relPath == null) {
-                builder = new Path.PathBuilder();
+                builder = new PathBuilder();
             } else {
-                builder = new Path.PathBuilder(relPath);
+                builder = new PathBuilder(relPath);
             }
-            builder.addLast(QName.JCR_PRIMARYTYPE);
+            builder.addLast(NameConstants.JCR_PRIMARYTYPE);
             try {
                 relPath = builder.getPath();
             } catch (MalformedPathException e) {
@@ -696,14 +701,14 @@
         }
         String field = "";
         try {
-            field = NameFormat.format(relPath.getNameElement().getName(), nsMappings);
-        } catch (NoPrefixDeclaredException e) {
+            field = resolver.getJCRName(relPath.getNameElement().getName());
+        } catch (NamespaceException e) {
             // should never happen
             exceptions.add(e);
         }
 
         // support for fn:name()
-        QName propName = relPath.getNameElement().getName();
+        Name propName = relPath.getNameElement().getName();
         if (propName.getNamespaceURI().equals(SearchManager.NS_FN_URI) &&
                 propName.getLocalName().equals("name()")) {
             if (node.getValueType() != QueryConstants.TYPE_STRING) {
@@ -717,18 +722,20 @@
                         "only be used in conjunction with an equals operator"));
                 return data;
             }
-            // check if string literal is a valid XML QName
+            // check if string literal is a valid XML Name
             if (XMLChar.isValidName(node.getStringValue())) {
-                // parse string literal as JCR QName
+                // parse string literal as JCR Name
                 try {
-                    String translatedQName = nsMappings.translatePropertyName(
-                            ISO9075.decode(node.getStringValue()),
-                            session.getNamespaceResolver());
+                    Name n = session.getQName(ISO9075.decode(node.getStringValue()));
+                    String translatedQName = nsMappings.translatePropertyName(n);
                     Term t = new Term(FieldNames.LABEL, translatedQName);
                     query = new TermQuery(t);
                 } catch (NameException e) {
                     exceptions.add(e);
                     return data;
+                } catch (NamespaceException e) {
+                    exceptions.add(e);
+                    return data;
                 }
             } else {
                 // will never match -> create dummy query
@@ -896,13 +903,13 @@
         if (relPath.getLength() > 1) {
             try {
                 // child axis in relation
-                Path.PathElement[] elements = relPath.getElements();
+                Path.Element[] elements = relPath.getElements();
                 // elements.length - 1 = property name
                 // elements.length - 2 = last child axis name test
                 for (int i = elements.length - 2; i >= 0; i--) {
                     String name = null;
                     if (!elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
-                        name = NameFormat.format(elements[i].getName(), nsMappings);
+                        name = resolver.getJCRName(elements[i].getName());
                     }
                     if (i == elements.length - 2) {
                         // join name test with property query if there is one
@@ -919,7 +926,7 @@
                         query = new ParentAxisQuery(query, name);
                     }
                 }
-            } catch (NoPrefixDeclaredException e) {
+            } catch (NamespaceException e) {
                 // should never happen
                 exceptions.add(e);
             }
@@ -976,7 +983,7 @@
      * @param literal      the String literal in the relation.
      * @return the String values to use as term for the query.
      */
-    private String[] getStringValues(QName propertyName, String literal) {
+    private String[] getStringValues(Name propertyName, String literal) {
         PropertyTypeRegistry.TypeMapping[] types = propRegistry.getPropertyTypes(propertyName);
         List values = new ArrayList();
         for (int i = 0; i < types.length; i++) {
@@ -984,17 +991,20 @@
                 case PropertyType.NAME:
                     // try to translate name
                     try {
-                        values.add(nsMappings.translatePropertyName(literal, session.getNamespaceResolver()));
+                        Name n = session.getQName(literal);
+                        values.add(nsMappings.translatePropertyName(n));
                         log.debug("Coerced " + literal + " into NAME.");
                     } catch (NameException e) {
                         log.warn("Unable to coerce '" + literal + "' into a NAME: " + e.toString());
+                    } catch (NamespaceException e) {
+                        log.warn("Unable to coerce '" + literal + "' into a NAME: " + e.toString());
                     }
                     break;
                 case PropertyType.PATH:
                     // try to translate path
                     try {
                         Path p = session.getQPath(literal);
-                        values.add(PathFormat.format(p, nsMappings));
+                        values.add(resolver.getJCRPath(p));
                         log.debug("Coerced " + literal + " into PATH.");
                     } catch (NameException e) {
                         log.warn("Unable to coerce '" + literal + "' into a PATH: " + e.toString());
@@ -1046,8 +1056,7 @@
             if (literal.indexOf('/') > -1) {
                 // might be a path
                 try {
-                    values.add(PathFormat.format(
-                            session.getQPath(literal), nsMappings));
+                    values.add(resolver.getJCRPath(session.getQPath(literal)));
                     log.debug("Coerced " + literal + " into PATH.");
                 } catch (Exception e) {
                     // not a path
@@ -1056,7 +1065,8 @@
             if (XMLChar.isValidName(literal)) {
                 // might be a name
                 try {
-                    values.add(nsMappings.translatePropertyName(literal, session.getNamespaceResolver()));
+                    Name n = session.getQName(literal);
+                    values.add(nsMappings.translatePropertyName(n));
                     log.debug("Coerced " + literal + " into NAME.");
                 } catch (Exception e) {
                     // not a name
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/WorkspaceTraversalResult.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/WorkspaceTraversalResult.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/WorkspaceTraversalResult.java	(working copy)
@@ -18,10 +18,8 @@
 
 import org.apache.commons.collections.iterators.IteratorChain;
 import org.apache.jackrabbit.core.NodeImpl;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.RowIterator;
@@ -29,6 +27,7 @@
 import javax.jcr.NodeIterator;
 import javax.jcr.Session;
 import javax.jcr.Node;
+import javax.jcr.NamespaceException;
 import java.util.Iterator;
 import java.util.Arrays;
 import java.util.ArrayList;
@@ -49,12 +48,12 @@
     /**
      * The select properties.
      */
-    private final QName[] properties;
+    private final Name[] properties;
 
     /**
      * The namespace resolver of the session.
      */
-    private final NamespaceResolver resolver;
+    private final NamePathResolver resolver;
 
     /**
      * Creates a new <code>WorkspaceTraversalResult</code>.
@@ -64,8 +63,8 @@
      * @param resolver   the namespace resolver of the session.
      */
     public WorkspaceTraversalResult(Session session,
-                             QName[] properties,
-                             NamespaceResolver resolver) {
+                             Name[] properties,
+                             NamePathResolver resolver) {
         this.session = session;
         this.properties = properties;
         this.resolver = resolver;
@@ -78,12 +77,12 @@
         try {
             String[] propNames = new String[properties.length];
             for (int i = 0; i < properties.length; i++) {
-                propNames[i] = NameFormat.format(properties[i], resolver);
+                propNames[i] = resolver.getJCRName(properties[i]);
             }
             return propNames;
-        } catch (NoPrefixDeclaredException npde) {
+        } catch (NamespaceException e) {
             String msg = "encountered invalid property name";
-            throw new RepositoryException(msg, npde);
+            throw new RepositoryException(msg, e);
 
         }
     }
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java	(working copy)
@@ -57,10 +57,10 @@
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.HierarchyManagerImpl;
 import org.apache.jackrabbit.core.state.ItemStateManager;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathFormat;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.BooleanQuery;
@@ -121,6 +121,11 @@
     private final NamespaceMappings nsMappings;
 
     /**
+     * NamePathResolver to map namespace mappings to internal prefixes
+     */
+    private final NamePathResolver npResolver;
+
+    /**
      * The analyzer instance to use for contains function query parsing
      */
     private final Analyzer analyzer;
@@ -142,7 +147,7 @@
 
     /**
      * The selector queries that have already been translated into lucene
-     * queries. Key=QName (selectorName).
+     * queries. Key=Name (selectorName).
      */
     private final Map selectors = new HashMap();
 
@@ -176,6 +181,7 @@
         this.sharedItemMgr = sharedItemMgr;
         this.hmgr = hmgr;
         this.nsMappings = nsMappings;
+        this.npResolver = NamePathResolverImpl.create(nsMappings);
         this.analyzer = analyzer;
         this.propRegistry = propReg;
         this.synonymProvider = synonymProvider;
@@ -292,12 +298,12 @@
                 stringValue = LongField.longToString(v.getLong());
                 break;
             case PropertyType.NAME:
-                stringValue = nsMappings.translatePropertyName(
-                        v.getString(), session.getNamespaceResolver());
+                Name n = session.getQName(v.getString());
+                stringValue = nsMappings.translatePropertyName(n);
                 break;
             case PropertyType.PATH:
-                Path p = PathFormat.parse(v.getString(), session.getNamespaceResolver());
-                stringValue = PathFormat.format(p, nsMappings);
+                Path p = session.getQPath(v.getString());
+                stringValue = npResolver.getJCRPath(p);
                 break;
             case PropertyType.REFERENCE:
                 stringValue = v.getString();
@@ -316,7 +322,7 @@
         return ((DynamicOperandImpl) node.getOperand1()).accept(
                 new DefaultTraversingQOMTreeVisitor() {
             public Object visit(PropertyValueImpl node, Object data) throws Exception {
-                String propName = NameFormat.format(node.getPropertyQName(), nsMappings);
+                String propName = npResolver.getJCRName(node.getPropertyQName());
                 String text = FieldNames.createNamedValue(propName, stringValue);
                 switch (operator) {
                     case QueryObjectModelConstants.OPERATOR_EQUAL_TO:
@@ -446,7 +452,7 @@
             fieldname = FieldNames.FULLTEXT;
         } else {
             // final path element is a property name
-            QName propName = node.getPropertyQName();
+            Name propName = node.getPropertyQName();
             StringBuffer tmp = new StringBuffer();
             tmp.append(nsMappings.getPrefix(propName.getNamespaceURI()));
             tmp.append(":").append(FieldNames.FULLTEXT_PREFIX);
@@ -545,7 +551,7 @@
     }
 
     public Object visit(PropertyExistenceImpl node, Object data) throws Exception {
-        String propName = NameFormat.format(node.getPropertyQName(), nsMappings);
+        String propName = npResolver.getJCRName(node.getPropertyQName());
         return new MatchAllQuery(propName);
     }
 
@@ -580,8 +586,8 @@
 
     public Object visit(SelectorImpl node, Object data) throws Exception {
         List terms = new ArrayList();
-        String mixinTypesField = NameFormat.format(QName.JCR_MIXINTYPES, nsMappings);
-        String primaryTypeField = NameFormat.format(QName.JCR_PRIMARYTYPE, nsMappings);
+        String mixinTypesField = npResolver.getJCRName(NameConstants.JCR_MIXINTYPES);
+        String primaryTypeField = npResolver.getJCRName(NameConstants.JCR_PRIMARYTYPE);
 
         NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
         NodeType base = null;
@@ -595,13 +601,13 @@
             // search for nodes where jcr:mixinTypes is set to this mixin
             Term t = new Term(FieldNames.PROPERTIES,
                     FieldNames.createNamedValue(mixinTypesField,
-                            NameFormat.format(node.getNodeTypeQName(), nsMappings)));
+                            npResolver.getJCRName(node.getNodeTypeQName())));
             terms.add(t);
         } else {
             // search for nodes where jcr:primaryType is set to this type
             Term t = new Term(FieldNames.PROPERTIES,
                     FieldNames.createNamedValue(primaryTypeField,
-                            NameFormat.format(node.getNodeTypeQName(), nsMappings)));
+                            npResolver.getJCRName(node.getNodeTypeQName())));
             terms.add(t);
         }
 
@@ -612,8 +618,8 @@
                 NodeType nt = allTypes.nextNodeType();
                 NodeType[] superTypes = nt.getSupertypes();
                 if (Arrays.asList(superTypes).contains(base)) {
-                    String ntName = nsMappings.translatePropertyName(nt.getName(),
-                            session.getNamespaceResolver());
+                    Name n = session.getQName(nt.getName());
+                    String ntName = nsMappings.translatePropertyName(n);
                     Term t;
                     if (nt.isMixin()) {
                         // search on jcr:mixinTypes
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/ExcerptProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/ExcerptProvider.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/ExcerptProvider.java	(working copy)
@@ -17,7 +17,8 @@
 package org.apache.jackrabbit.core.query.lucene;
 
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 import org.apache.lucene.search.Query;
 
 import java.io.IOException;
@@ -29,9 +30,9 @@
 public interface ExcerptProvider {
 
     /**
-     * QName of the rep:excerpt function.
+     * Name of the rep:excerpt function.
      */
-    public final QName REP_EXCERPT = new QName(QName.NS_REP_URI, "excerpt(.)");
+    public final Name REP_EXCERPT = NameFactoryImpl.getInstance().create(Name.NS_REP_URI, "excerpt(.)");
 
     /**
      * Initializes this excerpt provider.
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/FileBasedNamespaceMappings.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/FileBasedNamespaceMappings.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/FileBasedNamespaceMappings.java	(working copy)
@@ -16,13 +16,10 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-import org.apache.jackrabbit.name.AbstractNamespaceResolver;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.namespace.AbstractNamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,6 +61,11 @@
     private final File storage;
 
     /**
+     * The name resolver used to translate the qualified name to JCR name
+     */
+    private final NameResolver nameResolver;
+
+    /**
      * Map of uris indexed by prefixes
      */
     private Map prefixToURI = new HashMap();
@@ -89,6 +91,7 @@
     public FileBasedNamespaceMappings(File file) throws IOException {
         storage = file;
         load();
+        nameResolver = NamePathResolverImpl.create(this);
     }
 
     /**
@@ -142,16 +145,14 @@
      * Translates a property name from a session local namespace mapping
      * into a search index private namespace mapping.
      *
-     * @param name     the property name to translate
-     * @param resolver the <code>NamespaceResolver</code> of the local session.
+     * @param qName     the property name to translate
      * @return the translated property name
      */
-    public String translatePropertyName(String name, NamespaceResolver resolver)
-            throws IllegalNameException, UnknownPrefixException {
-        QName qName = NameFormat.parse(name, resolver);
+    public String translatePropertyName(Name qName)
+            throws IllegalNameException {
         try {
-            return NameFormat.format(qName, this);
-        } catch (NoPrefixDeclaredException e) {
+            return nameResolver.getJCRName(qName);
+        } catch (NamespaceException e) {
             // should never happen actually, because we create yet unknown
             // uri mappings on the fly.
             throw new IllegalNameException("Internal error.", e);
Index: src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java	(working copy)
@@ -16,10 +16,10 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
-
 import javax.jcr.query.InvalidQueryException;
 
+import org.apache.jackrabbit.conversion.NameResolver;
+
 /**
  * Specifies an interface for a query tree builder.
  */
@@ -30,14 +30,14 @@
      * query node factory.
      *
      * @param statement the statement.
-     * @param resolver  the namespace resolver to use.
+     * @param resolver  the name resolver to use.
      * @param factory   the query node factory to use.
      * @return the <code>QueryNode</code> tree for the statement.
      * @throws javax.jcr.query.InvalidQueryException
      *          if the statement is malformed.
      */
     QueryRootNode createQueryTree(String statement,
-                                  NamespaceResolver resolver,
+                                  NameResolver resolver,
                                   QueryNodeFactory factory)
             throws InvalidQueryException;
 
@@ -50,7 +50,7 @@
      *         <code>false</code> otherwise.
      */
     boolean canHandle(String language);
-    
+
     /**
      * Returns the set of query languages supported by this builder.
      * 
@@ -63,13 +63,13 @@
      * <code>QueryTreeBuilder</code> can handle.
      *
      * @param root     the root of the query node tree.
-     * @param resolver to resolve QNames.
+     * @param resolver to resolve Names.
      * @return a String representation of the query node tree.
      * @throws InvalidQueryException if the query node tree cannot be converted
      *                               into a String representation due to
      *                               restrictions in this syntax.
      */
-    String toString(QueryRootNode root, NamespaceResolver resolver)
+    String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException;
 
 }
Index: src/main/java/org/apache/jackrabbit/core/query/ExactQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/ExactQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/ExactQueryNode.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Implements a query node that defines an exact match of a property and a
@@ -27,12 +27,12 @@
     /**
      * The name of the property to match
      */
-    private final QName property;
+    private final Name property;
 
     /**
      * The value of the property to match
      */
-    private final QName value;
+    private final Name value;
 
     /**
      * Creates a new <code>ExactQueryNode</code> instance.
@@ -41,7 +41,7 @@
      * @param property the name of the property to match.
      * @param value    the value of the property to match.
      */
-    public ExactQueryNode(QueryNode parent, QName property, QName value) {
+    public ExactQueryNode(QueryNode parent, Name property, Name value) {
         super(parent);
         if (parent == null) {
             throw new NullPointerException("parent");
@@ -69,7 +69,7 @@
      *
      * @return the name of the property to match.
      */
-    public QName getPropertyName() {
+    public Name getPropertyName() {
         return property;
     }
 
@@ -78,7 +78,7 @@
      *
      * @return the value of the property to match.
      */
-    public QName getValue() {
+    public Name getValue() {
         return value;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/LocationStepQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/LocationStepQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/LocationStepQueryNode.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Defines a location step for querying the path of a node.
@@ -42,7 +43,7 @@
      * specific constant as the empty name is not a valid JCR name.
      * TODO: The root location step should be refactored somehow
      */
-    public static final QName EMPTY_NAME = new QName("", "");
+    public static final Name EMPTY_NAME = NameFactoryImpl.getInstance().create("", "");
 
     /** Empty <code>QueryNode</code> array for us as return value */
     private static final QueryNode[] EMPTY = new QueryNode[0];
@@ -51,7 +52,7 @@
      * Name test for this location step. A <code>null</code> value indicates
      * a '*' name test.
      */
-    private QName nameTest;
+    private Name nameTest;
 
     /**
      * If set to <code>true</code> this location step uses the descendant-or-self
@@ -80,7 +81,7 @@
      * if the name test is '*'.
      * @return the label of the node for this location step.
      */
-    public QName getNameTest() {
+    public Name getNameTest() {
         return nameTest;
     }
 
@@ -88,7 +89,7 @@
      * Sets a new name test.
      * @param nameTest the name test or <code>null</code> to match all names.
      */
-    public void setNameTest(QName nameTest) {
+    public void setNameTest(Name nameTest) {
         this.nameTest = nameTest;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java	(working copy)
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.xpath;
 
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameResolver;
 import org.apache.jackrabbit.core.query.DerefQueryNode;
 import org.apache.jackrabbit.core.query.LocationStepQueryNode;
 import org.apache.jackrabbit.core.query.NAryQueryNode;
@@ -31,18 +33,21 @@
 import org.apache.jackrabbit.core.query.PropertyFunctionQueryNode;
 import org.apache.jackrabbit.core.query.DefaultQueryNodeVisitor;
 import org.apache.jackrabbit.core.query.QueryNodeFactory;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.PathFactory;
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.util.ISO9075;
 import org.apache.commons.collections.map.ReferenceMap;
 
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -54,105 +59,108 @@
  */
 public class XPathQueryBuilder implements XPathVisitor, XPathTreeConstants {
 
+    private static final NameFactory NAME_FACTORY = NameFactoryImpl.getInstance();
+    private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
+
     /**
      * Namespace uri for xpath functions. See also class SearchManager
      */
     static final String NS_FN_URI = "http://www.w3.org/2005/xpath-functions";
 
     /**
-     * QName for 'fn:not'
+     * Name for 'fn:not'
      */
-    static final QName FN_NOT = new QName(NS_FN_URI, "not");
+    static final Name FN_NOT = NAME_FACTORY.create(NS_FN_URI, "not");
 
     /**
-     * QName for 'fn:lower-case'
+     * Name for 'fn:lower-case'
      */
-    static final QName FN_LOWER_CASE = new QName(NS_FN_URI, "lower-case");
+    static final Name FN_LOWER_CASE = NAME_FACTORY.create(NS_FN_URI, "lower-case");
 
     /**
-     * QName for 'fn:upper-case'
+     * Name for 'fn:upper-case'
      */
-    static final QName FN_UPPER_CASE = new QName(NS_FN_URI, "upper-case");
+    static final Name FN_UPPER_CASE = NAME_FACTORY.create(NS_FN_URI, "upper-case");
 
     /**
-     * QName for 'not' as defined in XPath 1.0 (no prefix)
+     * Name for 'not' as defined in XPath 1.0 (no prefix)
      */
-    static final QName FN_NOT_10 = new QName("", "not");
+    static final Name FN_NOT_10 = NAME_FACTORY.create("", "not");
 
     /**
-     * QName for true function.
+     * Name for true function.
      */
-    static final QName FN_TRUE = new QName("", "true");
+    static final Name FN_TRUE = NAME_FACTORY.create("", "true");
 
     /**
-     * QName for false function.
+     * Name for false function.
      */
-    static final QName FN_FALSE = new QName("", "false");
+    static final Name FN_FALSE = NAME_FACTORY.create("", "false");
 
     /**
-     * QName for position function.
+     * Name for position function.
      */
-    static final QName FN_POSITION = new QName("", "position");
+    static final Name FN_POSITION = NAME_FACTORY.create("", "position");
 
     /**
-     * QName for element function.
+     * Name for element function.
      */
-    static final QName FN_ELEMENT = new QName("", "element");
+    static final Name FN_ELEMENT = NAME_FACTORY.create("", "element");
 
     /**
-     * QName for the full position function including bracket
+     * Name for the full position function including bracket
      */
-    static final QName FN_POSITION_FULL = new QName("", "position()");
+    static final Name FN_POSITION_FULL = NAME_FACTORY.create("", "position()");
 
     /**
-     * QName for jcr:xmltext
+     * Name for jcr:xmltext
      */
-    static final QName JCR_XMLTEXT = new QName(QName.NS_JCR_URI, "xmltext");
+    static final Name JCR_XMLTEXT = NAME_FACTORY.create(Name.NS_JCR_URI, "xmltext");
 
     /**
-     * QName for last function.
+     * Name for last function.
      */
-    static final QName FN_LAST = new QName("", "last");
+    static final Name FN_LAST = NAME_FACTORY.create("", "last");
 
     /**
-     * QName for first function.
+     * Name for first function.
      */
-    static final QName FN_FIRST = new QName("", "first");
+    static final Name FN_FIRST = NAME_FACTORY.create("", "first");
 
     /**
-     * QName for xs:dateTime
+     * Name for xs:dateTime
      */
-    static final QName XS_DATETIME = new QName("http://www.w3.org/2001/XMLSchema", "dateTime");
+    static final Name XS_DATETIME = NAME_FACTORY.create("http://www.w3.org/2001/XMLSchema", "dateTime");
 
     /**
-     * QName for jcr:like
+     * Name for jcr:like
      */
-    static final QName JCR_LIKE = new QName(QName.NS_JCR_URI, "like");
+    static final Name JCR_LIKE = NAME_FACTORY.create(Name.NS_JCR_URI, "like");
 
     /**
-     * QName for jcr:deref
+     * Name for jcr:deref
      */
-    static final QName JCR_DEREF = new QName(QName.NS_JCR_URI, "deref");
+    static final Name JCR_DEREF = NAME_FACTORY.create(Name.NS_JCR_URI, "deref");
 
     /**
-     * QName for jcr:contains
+     * Name for jcr:contains
      */
-    static final QName JCR_CONTAINS = new QName(QName.NS_JCR_URI, "contains");
+    static final Name JCR_CONTAINS = NAME_FACTORY.create(Name.NS_JCR_URI, "contains");
 
     /**
-     * QName for jcr:root
+     * Name for jcr:root
      */
-    static final QName JCR_ROOT = new QName(QName.NS_JCR_URI, "root");
+    static final Name JCR_ROOT = NAME_FACTORY.create(Name.NS_JCR_URI, "root");
 
     /**
-     * QName for jcr:score
+     * Name for jcr:score
      */
-    static final QName JCR_SCORE = new QName(QName.NS_JCR_URI, "score");
+    static final Name JCR_SCORE = NAME_FACTORY.create(Name.NS_JCR_URI, "score");
 
     /**
-     * QName for rep:similar
+     * Name for rep:similar
      */
-    static final QName REP_SIMILAR = new QName(QName.NS_REP_URI, "similar");
+    static final Name REP_SIMILAR = NAME_FACTORY.create(Name.NS_REP_URI, "similar");
 
     /**
      * String constant for operator 'eq'
@@ -225,9 +233,9 @@
     private final QueryRootNode root;
 
     /**
-     * The {@link NamespaceResolver} in use
+     * The {@link NameResolver} in use
      */
-    private final NamespaceResolver resolver;
+    private final NameResolver resolver;
 
     /**
      * List of exceptions that are created while building the query tree
@@ -237,7 +245,7 @@
     /**
      * Temporary relative path
      */
-    private Path.PathBuilder tmpRelPath;
+    private PathBuilder tmpRelPath;
 
     /**
      * The query node factory.
@@ -248,12 +256,12 @@
      * Creates a new <code>XPathQueryBuilder</code> instance.
      *
      * @param statement the XPath statement.
-     * @param resolver  the namespace resolver to use.
+     * @param resolver  the name resolver to use.
      * @param factory   the query node factory.
      * @throws InvalidQueryException if the XPath statement is malformed.
      */
     private XPathQueryBuilder(String statement,
-                              NamespaceResolver resolver,
+                              NameResolver resolver,
                               QueryNodeFactory factory)
             throws InvalidQueryException {
         this.resolver = resolver;
@@ -304,13 +312,13 @@
      * passed query node <code>factory</code>.
      *
      * @param statement the XPath statement.
-     * @param resolver  the namespace resolver to use.
+     * @param resolver  the name resolver to use.
      * @param factory   the query node factory.
      * @return the <code>QueryNode</code> tree for the XPath statement.
      * @throws InvalidQueryException if the XPath statement is malformed.
      */
     public static QueryRootNode createQuery(String statement,
-                                            NamespaceResolver resolver,
+                                            NameResolver resolver,
                                             QueryNodeFactory factory)
             throws InvalidQueryException {
         return new XPathQueryBuilder(statement, resolver, factory).getRootNode();
@@ -320,12 +328,12 @@
      * Creates a String representation of the query node tree in XPath syntax.
      *
      * @param root     the root of the query node tree.
-     * @param resolver to resolve QNames.
+     * @param resolver to resolve <code>Name</code>s.
      * @return a String representation of the query node tree.
      * @throws InvalidQueryException if the query node tree cannot be converted
      *                               into a String representation due to restrictions in XPath.
      */
-    public static String toString(QueryRootNode root, NamespaceResolver resolver)
+    public static String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return QueryFormat.toString(root, resolver);
     }
@@ -406,7 +414,7 @@
                                 null, RelationQueryNode.OPERATION_NOT_NULL);
                         node.childrenAccept(this, tmp);
                         if (tmpRelPath == null) {
-                            tmpRelPath = new Path.PathBuilder();
+                            tmpRelPath = new PathBuilder();
                         }
                         tmpRelPath.addLast(tmp.getRelativePath().getNameElement());
                     }
@@ -445,11 +453,13 @@
                     LocationStepQueryNode loc = (LocationStepQueryNode) queryNode;
                     String ntName = ((SimpleNode) node.jjtGetChild(0)).getValue();
                     try {
-                        QName nt = NameFormat.parse(ntName, resolver);
+                        Name nt = resolver.getQName(ntName);
                         NodeTypeQueryNode nodeType = factory.createNodeTypeQueryNode(loc, nt);
                         loc.addPredicate(nodeType);
                     } catch (NameException e) {
                         exceptions.add(new InvalidQueryException("Not a valid name: " + ntName));
+                    } catch (NamespaceException e) {
+                        exceptions.add(new InvalidQueryException("Not a valid name: " + ntName));
                     }
                 }
                 break;
@@ -549,7 +559,7 @@
             try {
                 Path relPath = tmpRelPath.getPath();
                 for (int i = 0; i < relPath.getLength(); i++) {
-                    node.addPathElement(relPath.getElement(i));
+                    node.addPathElement(relPath.getElements()[i]);
                 }
             } catch (MalformedPathException e) {
                 // should never happen
@@ -589,7 +599,7 @@
     }
 
     /**
-     * Assigns a QName to one of the follwing QueryNodes:
+     * Assigns a Name to one of the follwing QueryNodes:
      * {@link RelationQueryNode}, {@link DerefQueryNode}, {@link RelationQueryNode},
      * {@link PathQueryNode}, {@link OrderQueryNode}, {@link TextsearchQueryNode}.
      *
@@ -601,7 +611,7 @@
             SimpleNode child = (SimpleNode) node.jjtGetChild(0);
             if (child.getId() == JJTQNAME || child.getId() == JJTQNAMEFORITEMTYPE) {
                 try {
-                    QName name = ISO9075.decode(NameFormat.parse(child.getValue(), resolver));
+                    Name name = decode(resolver.getQName(child.getValue()));
                     if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
                         if (name.equals(JCR_ROOT)) {
                             name = LocationStepQueryNode.EMPTY_NAME;
@@ -610,7 +620,7 @@
                     } else if (queryNode.getType() == QueryNode.TYPE_DEREF) {
                         ((DerefQueryNode) queryNode).setRefProperty(name);
                     } else if (queryNode.getType() == QueryNode.TYPE_RELATION) {
-                        Path.PathElement element = Path.PathElement.create(name);
+                        Path.Element element = PATH_FACTORY.createElement(name);
                         ((RelationQueryNode) queryNode).addPathElement(element);
                     } else if (queryNode.getType() == QueryNode.TYPE_PATH) {
                         root.addSelectProperty(name);
@@ -618,12 +628,12 @@
                         root.getOrderNode().addOrderSpec(name, true);
                     } else if (queryNode.getType() == QueryNode.TYPE_TEXTSEARCH) {
                         TextsearchQueryNode ts = (TextsearchQueryNode) queryNode;
-                        ts.addPathElement(Path.PathElement.create(name));
+                        ts.addPathElement(PATH_FACTORY.createElement(name));
                         if (isAttributeNameTest(node)) {
                             ts.setReferencesProperty(true);
                         }
                     }
-                } catch (NameException e) {
+                } catch (RepositoryException e) {
                     exceptions.add(new InvalidQueryException("Illegal name: " + child.getValue()));
                 }
             } else if (child.getId() == JJTSTAR) {
@@ -631,10 +641,10 @@
                     ((LocationStepQueryNode) queryNode).setNameTest(null);
                 } else if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     ((RelationQueryNode) queryNode).addPathElement(
-                            Path.PathElement.create(RelationQueryNode.STAR_NAME_TEST));
+                            PATH_FACTORY.createElement(RelationQueryNode.STAR_NAME_TEST));
                 } else if (queryNode.getType() == QueryNode.TYPE_TEXTSEARCH) {
                     ((TextsearchQueryNode) queryNode).addPathElement(
-                            Path.PathElement.create(RelationQueryNode.STAR_NAME_TEST));
+                            PATH_FACTORY.createElement(RelationQueryNode.STAR_NAME_TEST));
                 }
             } else {
                 exceptions.add(new InvalidQueryException("Unsupported location for name test: " + child));
@@ -757,8 +767,8 @@
         String fName = ((SimpleNode) node.jjtGetChild(0)).getValue();
         fName = fName.substring(0, fName.length() - 1);
         try {
-            if (NameFormat.format(FN_NOT, resolver).equals(fName)
-                    || NameFormat.format(FN_NOT_10, resolver).equals(fName)) {
+            if (resolver.getJCRName(FN_NOT).equals(fName)
+                    || resolver.getJCRName(FN_NOT_10).equals(fName)) {
                 if (queryNode instanceof NAryQueryNode) {
                     QueryNode not = factory.createNotQueryNode(queryNode);
                     ((NAryQueryNode) queryNode).addOperand(not);
@@ -773,7 +783,7 @@
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for function fn:not"));
                 }
-            } else if (NameFormat.format(XS_DATETIME, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(XS_DATETIME).equals(fName)) {
                 // check arguments
                 if (node.jjtGetNumChildren() == 2) {
                     if (queryNode instanceof RelationQueryNode) {
@@ -799,7 +809,7 @@
                     // wrong number of arguments
                     exceptions.add(new InvalidQueryException("Wrong number of arguments for xs:dateTime"));
                 }
-            } else if (NameFormat.format(JCR_CONTAINS, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(JCR_CONTAINS).equals(fName)) {
                 // check number of arguments
                 if (node.jjtGetNumChildren() == 3) {
                     if (queryNode instanceof NAryQueryNode) {
@@ -819,7 +829,7 @@
                     // wrong number of arguments
                     exceptions.add(new InvalidQueryException("Wrong number of arguments for jcr:contains"));
                 }
-            } else if (NameFormat.format(JCR_LIKE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(JCR_LIKE).equals(fName)) {
                 // check number of arguments
                 if (node.jjtGetNumChildren() == 3) {
                     if (queryNode instanceof NAryQueryNode) {
@@ -847,35 +857,35 @@
                     // wrong number of arguments
                     exceptions.add(new InvalidQueryException("Wrong number of arguments for jcr:like"));
                 }
-            } else if (NameFormat.format(FN_TRUE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_TRUE).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     RelationQueryNode rel = (RelationQueryNode) queryNode;
                     rel.setStringValue("true");
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for true()"));
                 }
-            } else if (NameFormat.format(FN_FALSE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_FALSE).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     RelationQueryNode rel = (RelationQueryNode) queryNode;
                     rel.setStringValue("false");
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for false()"));
                 }
-            } else if (NameFormat.format(FN_POSITION, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_POSITION).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     RelationQueryNode rel = (RelationQueryNode) queryNode;
                     if (rel.getOperation() == RelationQueryNode.OPERATION_EQ_GENERAL) {
                         // set dummy value to set type of relation query node
                         // will be overwritten when the tree is furhter parsed.
                         rel.setPositionValue(1);
-                        rel.addPathElement(Path.PathElement.create(FN_POSITION_FULL));
+                        rel.addPathElement(PATH_FACTORY.createElement(FN_POSITION_FULL));
                     } else {
                         exceptions.add(new InvalidQueryException("Unsupported expression with position(). Only = is supported."));
                     }
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for position()"));
                 }
-            } else if (NameFormat.format(FN_FIRST, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_FIRST).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     ((RelationQueryNode) queryNode).setPositionValue(1);
                 } else if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
@@ -883,7 +893,7 @@
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for first()"));
                 }
-            } else if (NameFormat.format(FN_LAST, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_LAST).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                     ((RelationQueryNode) queryNode).setPositionValue(LocationStepQueryNode.LAST);
                 } else if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
@@ -891,7 +901,7 @@
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for last()"));
                 }
-            } else if (NameFormat.format(JCR_DEREF, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(JCR_DEREF).equals(fName)) {
                 // check number of arguments
                 if (node.jjtGetNumChildren() == 3) {
                     boolean descendant = false;
@@ -919,9 +929,9 @@
                             // strip quotes
                             value = value.substring(1, value.length() - 1);
                             if (!value.equals("*")) {
-                                QName name = null;
+                                Name name = null;
                                 try {
-                                    name = ISO9075.decode(NameFormat.parse(value, resolver));
+                                    name = decode(resolver.getQName(value));
                                 } catch (NameException e) {
                                     exceptions.add(new InvalidQueryException("Illegal name: " + value));
                                 }
@@ -949,13 +959,13 @@
                         exceptions.add(new InvalidQueryException("Unsupported location for jcr:deref()"));
                     }
                 }
-            } else if (NameFormat.format(JCR_SCORE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(JCR_SCORE).equals(fName)) {
                 if (queryNode.getType() == QueryNode.TYPE_ORDER) {
                     createOrderSpec(node, (OrderQueryNode) queryNode);
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for jcr:score()"));
                 }
-            } else if (NameFormat.format(FN_LOWER_CASE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_LOWER_CASE).equals(fName)) {
                 if (node.jjtGetNumChildren() == 2) {
                     if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                         RelationQueryNode relNode = (RelationQueryNode) queryNode;
@@ -969,7 +979,7 @@
                 } else {
                     exceptions.add(new InvalidQueryException("Wrong number of argument for fn:lower-case()"));
                 }
-            } else if (NameFormat.format(FN_UPPER_CASE, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(FN_UPPER_CASE).equals(fName)) {
                 if (node.jjtGetNumChildren() == 2) {
                     if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                         RelationQueryNode relNode = (RelationQueryNode) queryNode;
@@ -983,7 +993,7 @@
                 } else {
                     exceptions.add(new InvalidQueryException("Unsupported location for fn:upper-case()"));
                 }
-            } else if (NameFormat.format(REP_SIMILAR, resolver).equals(fName)) {
+            } else if (resolver.getJCRName(REP_SIMILAR).equals(fName)) {
                 if (node.jjtGetNumChildren() == 3) {
                     if (queryNode instanceof NAryQueryNode) {
                         NAryQueryNode parent = (NAryQueryNode) queryNode;
@@ -1011,8 +1021,8 @@
             } else if (queryNode.getType() == QueryNode.TYPE_RELATION) {
                 // use function name as name of a pseudo property in a relation
                 try {
-                    QName name = NameFormat.parse(fName + "()", resolver);
-                    Path.PathElement element = Path.PathElement.create(name);
+                    Name name = resolver.getQName(fName + "()");
+                    Path.Element element = PATH_FACTORY.createElement(name);
                     RelationQueryNode relNode = (RelationQueryNode) queryNode;
                     relNode.addPathElement(element);
                 } catch (NameException e) {
@@ -1021,7 +1031,7 @@
             } else if (queryNode.getType() == QueryNode.TYPE_PATH) {
                 // use function name as name of a pseudo property in select clause
                 try {
-                    QName name = NameFormat.parse(fName + "()", resolver);
+                    Name name = resolver.getQName(fName + "()");
                     root.addSelectProperty(name);
                 } catch (NameException e) {
                     exceptions.add(e);
@@ -1029,7 +1039,7 @@
             } else {
                 exceptions.add(new InvalidQueryException("Unsupported function: " + fName));
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return queryNode;
@@ -1046,11 +1056,13 @@
                 // cut off left parenthesis at end
                 propName = propName.substring(0, propName.length() - 1);
             }
-            QName name = ISO9075.decode(NameFormat.parse(propName, resolver));
+            Name name = decode(resolver.getQName(propName));
             spec = new OrderQueryNode.OrderSpec(name, true);
             queryNode.addOrderSpec(spec);
         } catch (NameException e) {
             exceptions.add(new InvalidQueryException("Illegal name: " + child.getValue()));
+        } catch (NamespaceException e) {
+            exceptions.add(new InvalidQueryException("Illegal name: " + child.getValue()));
         }
         return spec;
     }
@@ -1080,7 +1092,7 @@
      *     At @
      *     NodeTest
      *         NameTest
-     *             QName foo
+     *             Name foo
      * </pre>
      * @param node a node with type {@link #JJTNAMETEST}.
      * @return <code>true</code> if the name test <code>node</code> is on the
@@ -1121,4 +1133,13 @@
         }
         return value;
     }
+
+    private static Name decode(Name name) {
+        String decodedLN = ISO9075.decode(name.getLocalName());
+        if (decodedLN.equals(name.getLocalName())) {
+            return name;
+        } else {
+            return NAME_FACTORY.create(name.getNamespaceURI(), decodedLN);
+        }
+    }
 }
Index: src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java	(working copy)
@@ -19,7 +19,7 @@
 import org.apache.jackrabbit.core.query.QueryTreeBuilder;
 import org.apache.jackrabbit.core.query.QueryRootNode;
 import org.apache.jackrabbit.core.query.QueryNodeFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NameResolver;
 
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.query.Query;
@@ -33,7 +33,7 @@
      * @inheritDoc
      */
     public QueryRootNode createQueryTree(String statement,
-                                         NamespaceResolver resolver,
+                                         NameResolver resolver,
                                          QueryNodeFactory factory)
             throws InvalidQueryException {
         return XPathQueryBuilder.createQuery(statement, resolver, factory);
@@ -57,7 +57,7 @@
     /**
      * @inheritDoc
      */
-    public String toString(QueryRootNode root, NamespaceResolver resolver)
+    public String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return XPathQueryBuilder.toString(root, resolver);
     }
Index: src/main/java/org/apache/jackrabbit/core/query/xpath/QueryFormat.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/xpath/QueryFormat.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/xpath/QueryFormat.java	(working copy)
@@ -33,15 +33,15 @@
 import org.apache.jackrabbit.core.query.TextsearchQueryNode;
 import org.apache.jackrabbit.core.query.PropertyFunctionQueryNode;
 import org.apache.jackrabbit.core.query.DefaultQueryNodeVisitor;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.util.ISO9075;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.NamespaceException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
@@ -55,7 +55,7 @@
     /**
      * Will be used to resolve QNames
      */
-    private final NamespaceResolver resolver;
+    private final NameResolver resolver;
 
     /**
      * The String representation of the query node tree
@@ -67,7 +67,7 @@
      */
     private List exceptions = new ArrayList();
 
-    private QueryFormat(QueryRootNode root, NamespaceResolver resolver)
+    private QueryFormat(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         this.resolver = resolver;
         statement = root.accept(this, new StringBuffer()).toString();
@@ -87,7 +87,7 @@
      * @throws InvalidQueryException the query node tree cannot be represented
      *                               as a XPath <code>String</code>.
      */
-    public static String toString(QueryRootNode root, NamespaceResolver resolver)
+    public static String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return new QueryFormat(root, resolver).toString();
     }
@@ -109,7 +109,7 @@
         if (node.getOrderNode() != null) {
             node.getOrderNode().accept(this, data);
         }
-        QName[] selectProps = node.getSelectProperties();
+        Name[] selectProps = node.getSelectProperties();
         if (selectProps.length > 0) {
             sb.append('/');
             boolean union = selectProps.length > 1;
@@ -121,9 +121,9 @@
                 try {
                     sb.append(pipe);
                     sb.append('@');
-                    NameFormat.format(ISO9075.encode(selectProps[i]), resolver, sb);
+                    sb.append(resolver.getJCRName(encode(selectProps[i])));
                     pipe = "|";
-                } catch (NoPrefixDeclaredException e) {
+                } catch (NamespaceException e) {
                     exceptions.add(e);
                 }
             }
@@ -173,11 +173,11 @@
         QueryNode[] operands = node.getOperands();
         if (operands.length > 0) {
             try {
-                NameFormat.format(XPathQueryBuilder.FN_NOT_10, resolver, sb);
+                sb.append(resolver.getJCRName(XPathQueryBuilder.FN_NOT_10));
                 sb.append("(");
                 operands[0].accept(this, sb);
                 sb.append(")");
-            } catch (NoPrefixDeclaredException e) {
+            } catch (NamespaceException e) {
                 exceptions.add(e);
             }
         }
@@ -188,10 +188,11 @@
         StringBuffer sb = (StringBuffer) data;
         sb.append("@");
         try {
-            NameFormat.format(ISO9075.encode(node.getPropertyName()), resolver, sb);
+            Name name = encode(node.getPropertyName());
+            sb.append(resolver.getJCRName(name));
             sb.append("='");
-            NameFormat.format(node.getValue(), resolver, sb);
-        } catch (NoPrefixDeclaredException e) {
+            sb.append(resolver.getJCRName(node.getValue()));
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         sb.append("'");
@@ -206,13 +207,13 @@
     public Object visit(TextsearchQueryNode node, Object data) {
         StringBuffer sb = (StringBuffer) data;
         try {
-            NameFormat.format(XPathQueryBuilder.JCR_CONTAINS, resolver, sb);
+            sb.append(resolver.getJCRName(XPathQueryBuilder.JCR_CONTAINS));
             sb.append("(");
             Path relPath = node.getRelativePath();
             if (relPath == null) {
                 sb.append(".");
             } else {
-                Path.PathElement[] elements = relPath.getElements();
+                Path.Element[] elements = relPath.getElements();
                 String slash = "";
                 for (int i = 0; i < elements.length; i++) {
                     sb.append(slash);
@@ -223,7 +224,8 @@
                     if (elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
                         sb.append("*");
                     } else {
-                        NameFormat.format(ISO9075.encode(elements[i].getName()), resolver, sb);
+                        Name n = encode(elements[i].getName());
+                        sb.append(resolver.getJCRName(n));
                     }
                     if (elements[i].getIndex() != 0) {
                         sb.append("[").append(elements[i].getIndex()).append("]");
@@ -233,7 +235,7 @@
             sb.append(", '");
             sb.append(node.getQuery().replaceAll("'", "''"));
             sb.append("')");
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -259,7 +261,7 @@
         if (node.getIncludeDescendants()) {
             sb.append('/');
         }
-        final QName[] nodeType = new QName[1];
+        final Name[] nodeType = new Name[1];
         node.acceptOperands(new DefaultQueryNodeVisitor() {
             public Object visit(NodeTypeQueryNode node, Object data) {
                 nodeType[0] = node.getValue();
@@ -276,11 +278,11 @@
         } else {
             try {
                 if (node.getNameTest().getLocalName().length() == 0) {
-                    NameFormat.format(XPathQueryBuilder.JCR_ROOT, resolver, sb);
+                    sb.append(resolver.getJCRName(XPathQueryBuilder.JCR_ROOT));
                 } else {
-                    NameFormat.format(ISO9075.encode(node.getNameTest()), resolver, sb);
+                    sb.append(resolver.getJCRName(encode(node.getNameTest())));
                 }
-            } catch (NoPrefixDeclaredException e) {
+            } catch (NamespaceException e) {
                 exceptions.add(e);
             }
         }
@@ -288,8 +290,8 @@
         if (nodeType[0] != null) {
             sb.append(", ");
             try {
-                NameFormat.format(ISO9075.encode(nodeType[0]), resolver, sb);
-            } catch (NoPrefixDeclaredException e) {
+                sb.append(resolver.getJCRName(encode(nodeType[0])));
+            } catch (NamespaceException e) {
                 exceptions.add(e);
             }
             sb.append(")");
@@ -314,17 +316,17 @@
     public Object visit(DerefQueryNode node, Object data) {
         StringBuffer sb = (StringBuffer) data;
         try {
-            NameFormat.format(XPathQueryBuilder.JCR_DEREF, resolver, sb);
+            sb.append(resolver.getJCRName(XPathQueryBuilder.JCR_DEREF));
             sb.append("(@");
-            NameFormat.format(ISO9075.encode(node.getRefProperty()), resolver, sb);
+            sb.append(resolver.getJCRName(encode(node.getRefProperty())));
             sb.append(", '");
             if (node.getNameTest() == null) {
                 sb.append("*");
             } else {
-                NameFormat.format(ISO9075.encode(node.getNameTest()), resolver, sb);
+                sb.append(resolver.getJCRName(encode(node.getNameTest())));
             }
             sb.append("')");
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -338,9 +340,9 @@
             // only encode if not position function
             Path relPath = node.getRelativePath();
             if (relPath.getNameElement().getName().equals(XPathQueryBuilder.FN_POSITION_FULL)) {
-                NameFormat.format(XPathQueryBuilder.FN_POSITION_FULL, resolver, propPath);
+                propPath.append(resolver.getJCRName(XPathQueryBuilder.FN_POSITION_FULL));
             } else {
-                Path.PathElement[] elements = relPath.getElements();
+                Path.Element[] elements = relPath.getElements();
                 String slash = "";
                 for (int i = 0; i < elements.length; i++) {
                     propPath.append(slash);
@@ -351,7 +353,7 @@
                     if (elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {
                         propPath.append("*");
                     } else {
-                        NameFormat.format(ISO9075.encode(elements[i].getName()), resolver, propPath);
+                        propPath.append(resolver.getJCRName(encode(elements[i].getName())));
                     }
                     if (elements[i].getIndex() != 0) {
                         propPath.append("[").append(elements[i].getIndex()).append("]");
@@ -387,7 +389,7 @@
                 sb.append(propPath).append(" le ");
                 appendValue(node, sb);
             } else if (node.getOperation() == OPERATION_LIKE) {
-                NameFormat.format(XPathQueryBuilder.JCR_LIKE, resolver, sb);
+                sb.append(resolver.getJCRName(XPathQueryBuilder.JCR_LIKE));
                 sb.append("(").append(propPath).append(", ");
                 appendValue(node, sb);
                 sb.append(")");
@@ -404,14 +406,14 @@
                 sb.append(propPath).append(" ne ");
                 appendValue(node, sb);
             } else if (node.getOperation() == OPERATION_NULL) {
-                NameFormat.format(XPathQueryBuilder.FN_NOT, resolver, sb);
+                sb.append(resolver.getJCRName(XPathQueryBuilder.FN_NOT));
                 sb.append("(").append(propPath).append(")");
             } else if (node.getOperation() == OPERATION_NOT_NULL) {
                 sb.append(propPath);
             } else {
                 exceptions.add(new InvalidQueryException("Invalid operation: " + node.getOperation()));
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -425,15 +427,15 @@
         try {
             for (int i = 0; i < specs.length; i++) {
                 sb.append(comma);
-                QName prop = ISO9075.encode(specs[i].getProperty());
+                Name prop = encode(specs[i].getProperty());
                 sb.append(" @");
-                NameFormat.format(prop, resolver, sb);
+                sb.append(resolver.getJCRName(prop));
                 if (!specs[i].isAscending()) {
                     sb.append(" descending");
                 }
                 comma = ",";
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return data;
@@ -444,15 +446,15 @@
         String functionName = node.getFunctionName();
         try {
             if (functionName.equals(PropertyFunctionQueryNode.LOWER_CASE)) {
-                sb.insert(0, NameFormat.format(XPathQueryBuilder.FN_LOWER_CASE, resolver) + "(");
+                sb.insert(0, resolver.getJCRName(XPathQueryBuilder.FN_LOWER_CASE) + "(");
                 sb.append(")");
             } else if (functionName.equals(PropertyFunctionQueryNode.UPPER_CASE)) {
-                sb.insert(0, NameFormat.format(XPathQueryBuilder.FN_UPPER_CASE, resolver) + "(");
+                sb.insert(0, resolver.getJCRName(XPathQueryBuilder.FN_UPPER_CASE) + "(");
                 sb.append(")");
             } else {
                 exceptions.add(new InvalidQueryException("Unsupported function: " + functionName));
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -466,11 +468,11 @@
      *
      * @param node the relation node.
      * @param b    where to append the value.
-     * @throws NoPrefixDeclaredException if a prefix declaration is missing for
+     * @throws NamespaceException if a prefix declaration is missing for
      *                                   a namespace URI.
      */
     private void appendValue(RelationQueryNode node, StringBuffer b)
-            throws NoPrefixDeclaredException {
+            throws NamespaceException {
         if (node.getValueType() == TYPE_LONG) {
             b.append(node.getLongValue());
         } else if (node.getValueType() == TYPE_DOUBLE) {
@@ -480,7 +482,7 @@
         } else if (node.getValueType() == TYPE_DATE || node.getValueType() == TYPE_TIMESTAMP) {
             Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
             cal.setTime(node.getDateValue());
-            NameFormat.format(XPathQueryBuilder.XS_DATETIME, resolver, b);
+            b.append(resolver.getJCRName(XPathQueryBuilder.XS_DATETIME));
             b.append("('").append(ISO8601.format(cal)).append("')");
         } else if (node.getValueType() == TYPE_POSITION) {
             if (node.getPositionValue() == LocationStepQueryNode.LAST) {
@@ -492,4 +494,13 @@
             exceptions.add(new InvalidQueryException("Invalid type: " + node.getValueType()));
         }
     }
+
+    private static Name encode(Name name) {
+        String encoded = ISO9075.encode(name.getLocalName());
+        if (encoded.equals(name.getLocalName())) {
+            return name;
+        } else {
+            return NameFactoryImpl.getInstance().create(name.getNamespaceURI(), encoded);
+        }
+    }
 }
Index: src/main/java/org/apache/jackrabbit/core/query/OrderQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/OrderQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/OrderQueryNode.java	(working copy)
@@ -16,11 +16,11 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
-
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.jackrabbit.spi.Name;
+
 /**
  * Implements a query node that defines the order of nodes according to the
  * values of properties.
@@ -58,7 +58,7 @@
      * @param ascending if <code>true</code> values of this properties are
      *                  ordered ascending; descending if <code>false</code>.
      */
-    public void addOrderSpec(QName property, boolean ascending) {
+    public void addOrderSpec(Name property, boolean ascending) {
         specs.add(new OrderSpec(property, ascending));
     }
 
@@ -123,7 +123,7 @@
         /**
          * The name of the property
          */
-        private QName property;
+        private Name property;
 
         /**
          * If <code>true</code> this property is orderd ascending
@@ -137,7 +137,7 @@
          * @param ascending if <code>true</code> the property is ordered
          *                  ascending, otherwise descending.
          */
-        public OrderSpec(QName property, boolean ascending) {
+        public OrderSpec(Name property, boolean ascending) {
             this.property = property;
             this.ascending = ascending;
         }
@@ -147,7 +147,7 @@
          *
          * @return the name of the property.
          */
-        public QName getProperty() {
+        public Name getProperty() {
             return property;
         }
 
Index: src/main/java/org/apache/jackrabbit/core/query/DefaultQueryNodeFactory.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/DefaultQueryNodeFactory.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/DefaultQueryNodeFactory.java	(working copy)
@@ -18,7 +18,7 @@
 
 import java.util.List;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Default implementetation of a {@link QueryNodeFactory}.
@@ -43,7 +43,7 @@
      * {@inheritDoc}
      */
     public NodeTypeQueryNode createNodeTypeQueryNode(QueryNode parent,
-                                                     QName nodeType) {
+                                                     Name nodeType) {
         return new NodeTypeQueryNode(parent, nodeType);
     }
 
@@ -65,7 +65,7 @@
      * {@inheritDoc}
      */
     public DerefQueryNode createDerefQueryNode(QueryNode parent,
-                                               QName nameTest,
+                                               Name nameTest,
                                                boolean descendants) {
         return new DerefQueryNode(parent, nameTest, descendants);
     }
Index: src/main/java/org/apache/jackrabbit/core/query/RelationQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/RelationQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/RelationQueryNode.java	(working copy)
@@ -16,12 +16,16 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.MalformedPathException;
-
 import java.util.Date;
 
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+
 /**
  * Implements a query node that defines property value relation.
  */
@@ -29,10 +33,10 @@
 
     /**
      * Acts as an syntetic placeholder for a location step that matches any
-     * name. This is required becase a JCR path does not allow a QName with
+     * name. This is required becase a JCR path does not allow a Name with
      * a single '*' (star) character.
      */
-    public static final QName STAR_NAME_TEST = new QName(QName.NS_REP_URI, "__star__");
+    public static final Name STAR_NAME_TEST = NameFactoryImpl.getInstance().create(Name.NS_REP_URI, "__star__");
 
     /**
      * The relative path to the property.
@@ -141,7 +145,7 @@
      * @return the name of the property in this relation query node.
      * @deprecated Use {@link #getRelativePath()} instead.
      */
-    public QName getProperty() {
+    public Name getProperty() {
         return relPath == null ? null : relPath.getNameElement().getName();
     }
 
@@ -151,8 +155,8 @@
      * @param name the new property name.
      * @deprecated Use {@link #setRelativePath(Path)} instead.
      */
-    public void setProperty(QName name) {
-        Path.PathBuilder builder = new Path.PathBuilder();
+    public void setProperty(Name name) {
+        PathBuilder builder = new PathBuilder();
         builder.addLast(name);
         try {
             this.relPath = builder.getPath();
@@ -187,21 +191,22 @@
      *
      * @param element the path element to append.
      */
-    public void addPathElement(Path.PathElement element) {
-        Path.PathBuilder builder = new Path.PathBuilder();
+    public void addPathElement(Path.Element element) {
+        PathBuilder builder = new PathBuilder();
         if (relPath != null) {
             builder.addAll(relPath.getElements());
         }
         builder.addLast(element);
         try {
             relPath = builder.getPath();
-        } catch (MalformedPathException e) {
+        } 
+        catch (MalformedPathException e) {
             // path is always valid
         }
         // try to normalize the path
         try {
-            relPath = relPath.getNormalizedPath();
-        } catch (MalformedPathException e) {
+          relPath = relPath.getNormalizedPath();
+        } catch (RepositoryException e) {
             // just keep the original in that case
         }
     }
Index: src/main/java/org/apache/jackrabbit/core/query/QueryTreeDump.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryTreeDump.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryTreeDump.java	(working copy)
@@ -16,11 +16,11 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
-
 import java.util.Arrays;
 
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+
 /**
  * Utility class to dump a {@link QueryNode} tree to a StringBuffer.
  */
@@ -68,7 +68,7 @@
         buffer.append("+ Root node");
         buffer.append("\n");
         // select properties
-        QName[] select = node.getSelectProperties();
+        Name[] select = node.getSelectProperties();
         buffer.append("+ Select properties: ");
         if (select.length == 0) {
             buffer.append("*");
@@ -147,7 +147,7 @@
         if (relPath == null) {
             buffer.append(".");
         } else {
-            Path.PathElement[] elements = relPath.getElements();
+            Path.Element[] elements = relPath.getElements();
             String slash = "";
             for (int i = 0; i < elements.length; i++) {
                 buffer.append(slash);
@@ -244,7 +244,7 @@
         if (relPath == null) {
             buffer.append(relPath);
         } else {
-            Path.PathElement[] elements = relPath.getElements();
+            Path.Element[] elements = relPath.getElements();
             String slash = "";
             for (int i = 0; i < elements.length; i++) {
                 buffer.append(slash);
Index: src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/OrImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Or;
 import org.apache.jackrabbit.core.query.jsr283.qom.Constraint;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/SelectorImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/SelectorImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/SelectorImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Selector;
 
@@ -29,16 +29,16 @@
     /**
      * The name of the required node type.
      */
-    private final QName nodeTypeName;
+    private final Name nodeTypeName;
 
     /**
      * The selector name.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     SelectorImpl(NamePathResolver resolver,
-                 QName nodeTypeName,
-                 QName selectorName) {
+                 Name nodeTypeName,
+                 Name selectorName) {
         super(resolver);
         this.nodeTypeName = nodeTypeName;
         this.selectorName = selectorName;
@@ -49,7 +49,7 @@
      *
      * @return the node type name; non-null
      */
-    public QName getNodeTypeQName() {
+    public Name getNodeTypeQName() {
         return nodeTypeName;
     }
 
@@ -61,7 +61,7 @@
      *
      * @return the selector name; non-null
      */
-    public QName getSelectorQName() {
+    public Name getSelectorQName() {
         return selectorName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/PropertyValueImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.PropertyValue;
 
@@ -31,16 +31,16 @@
     /**
      * The name of the selector against which to apply this constraint.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * The name of the property.
      */
-    private final QName propertyName;
+    private final Name propertyName;
 
     PropertyValueImpl(NamePathResolver resolver,
-                      QName selectorName,
-                      QName propertyName) {
+                      Name selectorName,
+                      Name propertyName) {
         super(resolver);
         this.selectorName = selectorName;
         this.propertyName = propertyName;
@@ -51,7 +51,7 @@
      *
      * @return the selector name; non-null
      */
-    public QName getSelectorQName() {
+    public Name getSelectorQName() {
         return selectorName;
     }
 
@@ -60,7 +60,7 @@
      *
      * @return the property name; non-null
      */
-    public QName getPropertyQName() {
+    public Name getPropertyQName() {
         return propertyName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeJoinConditionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeJoinConditionImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeJoinConditionImpl.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.SameNodeJoinCondition;
 
@@ -32,12 +32,12 @@
     /**
      * The name of the first selector.
      */
-    private final QName selector1Name;
+    private final Name selector1Name;
 
     /**
      * The name of the second selector.
      */
-    private final QName selector2Name;
+    private final Name selector2Name;
 
     /**
      * The path relative to the second selector.
@@ -45,8 +45,8 @@
     private final Path selector2Path;
 
     SameNodeJoinConditionImpl(NamePathResolver resolver,
-                              QName selector1Name,
-                              QName selector2Name,
+                              Name selector1Name,
+                              Name selector2Name,
                               Path selector2Path) {
         super(resolver);
         this.selector1Name = selector1Name;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/ConstraintImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/ConstraintImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/ConstraintImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Constraint;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/NodeNameImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.NodeName;
 
@@ -29,9 +29,9 @@
     /**
      * The name of the selector against which to evaluate this operand.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
-    NodeNameImpl(NamePathResolver resolver, QName selectorName) {
+    NodeNameImpl(NamePathResolver resolver, Name selectorName) {
         super(resolver);
         this.selectorName = selectorName;
     }
Index: src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchScoreImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.FullTextSearchScore;
 
@@ -31,9 +31,9 @@
     /**
      * Name of the selector against which to evaluate this operand.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
-    FullTextSearchScoreImpl(NamePathResolver resolver, QName selectorName) {
+    FullTextSearchScoreImpl(NamePathResolver resolver, Name selectorName) {
         super(resolver);
         this.selectorName = selectorName;
     }
Index: src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/EquiJoinConditionImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.EquiJoinCondition;
 
@@ -31,28 +31,28 @@
     /**
      * Name of the first selector.
      */
-    private final QName selector1Name;
+    private final Name selector1Name;
 
     /**
      * Property name in the first selector.
      */
-    private final QName property1Name;
+    private final Name property1Name;
 
     /**
      * Name of the second selector.
      */
-    private final QName selector2Name;
+    private final Name selector2Name;
 
     /**
      * Property name in the second selector.
      */
-    private final QName property2Name;
+    private final Name property2Name;
 
     EquiJoinConditionImpl(NamePathResolver resolver,
-                          QName selector1Name,
-                          QName property1Name,
-                          QName selector2Name,
-                          QName property2Name) {
+                          Name selector1Name,
+                          Name property1Name,
+                          Name selector2Name,
+                          Name property2Name) {
         super(resolver);
         this.selector1Name = selector1Name;
         this.property1Name = property1Name;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/SameNodeImpl.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.SameNode;
 
@@ -30,7 +30,7 @@
     /**
      * The name of a selector.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * An absolute path.
@@ -38,7 +38,7 @@
     private final Path path;
 
     SameNodeImpl(NamePathResolver resolver,
-                 QName selectorName,
+                 Name selectorName,
                  Path path) {
         super(resolver);
         this.selectorName = selectorName;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/LiteralImpl.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.query.qom;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Literal;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import javax.jcr.Value;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/DynamicOperandImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/DynamicOperandImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/DynamicOperandImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.DynamicOperand;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/NodeLocalNameImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.NodeLocalName;
 
@@ -31,9 +31,9 @@
     /**
      * The name of the selector against which to evaluate this operand.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
-    NodeLocalNameImpl(NamePathResolver resolver, QName selectorName) {
+    NodeLocalNameImpl(NamePathResolver resolver, Name selectorName) {
         super(resolver);
         this.selectorName = selectorName;
     }
Index: src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/AbstractQOMNode.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 
 import javax.jcr.NamespaceException;
 
@@ -52,7 +52,7 @@
      * @return the prefixed JCR name or <code>name.toString()</code> if an
      *         unknown namespace URI is encountered.
      */
-    protected String getJCRName(QName name) {
+    protected String getJCRName(Name name) {
         if (name == null) {
             return null;
         }
Index: src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelFactoryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelFactoryImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelFactoryImpl.java	(working copy)
@@ -16,10 +16,10 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Path;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.QueryObjectModelFactory;
 import org.apache.jackrabbit.core.query.jsr283.qom.QueryObjectModel;
@@ -213,7 +213,7 @@
      */
     public Selector selector(String nodeTypeName)                                 // CM
             throws InvalidQueryException, RepositoryException {
-        QName ntName = checkNodeTypeName(nodeTypeName);
+        Name ntName = checkNodeTypeName(nodeTypeName);
         return new SelectorImpl(resolver, ntName, ntName);
     }
 
@@ -533,7 +533,7 @@
                                          String fullTextSearchExpression)
             throws InvalidQueryException, RepositoryException                          // CM
     {
-        QName propName = null;
+        Name propName = null;
         if (propertyName != null) {
             propName = checkPropertyName(propertyName);
         }
@@ -559,7 +559,7 @@
                                          String propertyName,
                                          String fullTextSearchExpression)
             throws InvalidQueryException, RepositoryException {
-        QName propName = null;
+        Name propName = null;
         if (propertyName != null) {
             propName = checkPropertyName(propertyName);
         }
@@ -941,7 +941,7 @@
      */
     public Column column(String propertyName)                                     // CM
             throws InvalidQueryException, RepositoryException {
-        QName propName = null;
+        Name propName = null;
         if (propertyName != null) {
             try {
                 propName = resolver.getQName(propertyName);
@@ -974,7 +974,7 @@
             throw new RepositoryException(
                     "columnName must be null if propertyName is null");
         }
-        QName propName = null;
+        Name propName = null;
         if (propertyName != null) {
             try {
                 propName = resolver.getQName(propertyName);
@@ -982,7 +982,7 @@
                 throw new InvalidQueryException(e.getMessage());
             }
         }
-        QName colName = null;
+        Name colName = null;
         if (columnName != null) {
             try {
                 colName = resolver.getQName(columnName);
@@ -1016,7 +1016,7 @@
             throw new RepositoryException(
                     "columnName must be null if propertyName is null");
         }
-        QName propName = null;
+        Name propName = null;
         if (propertyName != null) {
             try {
                 propName = resolver.getQName(propertyName);
@@ -1024,7 +1024,7 @@
                 throw new InvalidQueryException(e.getMessage());
             }
         }
-        QName colName = null;
+        Name colName = null;
         if (columnName != null) {
             try {
                 colName = resolver.getQName(columnName);
@@ -1038,7 +1038,7 @@
 
     //------------------------------< internal >--------------------------------
 
-    private QName checkSelectorName(String selectorName)
+    private Name checkSelectorName(String selectorName)
             throws RepositoryException {
         if (selectorName == null) {
             // TODO: correct exception?
@@ -1051,7 +1051,7 @@
         }
     }
 
-    private QName checkNodeTypeName(String nodeTypeName)
+    private Name checkNodeTypeName(String nodeTypeName)
             throws RepositoryException {
         if (nodeTypeName == null) {
             // TODO: correct exception?
@@ -1076,7 +1076,7 @@
         }
     }
 
-    private QName checkPropertyName(String propertyName)
+    private Name checkPropertyName(String propertyName)
             throws RepositoryException {
         if (propertyName == null) {
             // TODO: correct exception?
Index: src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/OrderingImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Ordering;
 import org.apache.jackrabbit.core.query.jsr283.qom.DynamicOperand;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/ComparisonImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Comparison;
 import org.apache.jackrabbit.core.query.jsr283.qom.DynamicOperand;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelTree.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelTree.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/QueryObjectModelTree.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import javax.jcr.query.InvalidQueryException;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeImpl.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.DescendantNode;
 
@@ -32,7 +32,7 @@
     /**
      * A selector name.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * An absolute path.
@@ -40,7 +40,7 @@
     private final Path path;
 
     DescendantNodeImpl(NamePathResolver resolver,
-                       QName selectorName,
+                       Name selectorName,
                        Path path) {
         super(resolver);
         this.selectorName = selectorName;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/BindVariableValueImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.BindVariableValue;
 
@@ -31,9 +31,9 @@
     /**
      * The name of the bind variable.
      */
-    private final QName variableName;
+    private final Name variableName;
 
-    BindVariableValueImpl(NamePathResolver resolver, QName variableName) {
+    BindVariableValueImpl(NamePathResolver resolver, Name variableName) {
         super(resolver);
         this.variableName = variableName;
     }
@@ -43,7 +43,7 @@
      *
      * @return the bind variable name; non-null
      */
-    public QName getBindVariableQName() {
+    public Name getBindVariableQName() {
         return variableName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeJoinConditionImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.ChildNodeJoinCondition;
 
@@ -31,16 +31,16 @@
     /**
      * The name of the child selector.
      */
-    private final QName childSelectorName;
+    private final Name childSelectorName;
 
     /**
      * The name of the parent selector.
      */
-    private final QName parentSelectorName;
+    private final Name parentSelectorName;
 
     ChildNodeJoinConditionImpl(NamePathResolver resolver,
-                               QName childSelectorName,
-                               QName parentSelectorName) {
+                               Name childSelectorName,
+                               Name parentSelectorName) {
         super(resolver);
         this.childSelectorName = childSelectorName;
         this.parentSelectorName = parentSelectorName;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/LengthImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Length;
 import org.apache.jackrabbit.core.query.jsr283.qom.PropertyValue;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/LowerCaseImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.LowerCase;
 import org.apache.jackrabbit.core.query.jsr283.qom.DynamicOperand;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/UpperCaseImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/UpperCaseImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/UpperCaseImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.UpperCase;
 import org.apache.jackrabbit.core.query.jsr283.qom.DynamicOperand;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/ChildNodeImpl.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.ChildNode;
 
@@ -30,14 +30,14 @@
     /**
      * The name of a selector.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * An absolute path.
      */
     private final Path path;
 
-    ChildNodeImpl(NamePathResolver resolver, QName selectorName, Path path) {
+    ChildNodeImpl(NamePathResolver resolver, Name selectorName, Path path) {
         super(resolver);
         this.selectorName = selectorName;
         this.path = path;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/PropertyExistenceImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.PropertyExistence;
 
@@ -31,16 +31,16 @@
     /**
      * The name of the selector against which to apply this constraint.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * The name of the property.
      */
-    private final QName propertyName;
+    private final Name propertyName;
 
     PropertyExistenceImpl(NamePathResolver resolver,
-                          QName selectorName,
-                          QName propertyName) {
+                          Name selectorName,
+                          Name propertyName) {
         super(resolver);
         this.selectorName = selectorName;
         this.propertyName = propertyName;
@@ -51,7 +51,7 @@
      *
      * @return the selector name; non-null
      */
-    public QName getSelectorQName() {
+    public Name getSelectorQName() {
         return selectorName;
     }
 
@@ -60,7 +60,7 @@
      *
      * @return the property name; non-null
      */
-    public QName getPropertyQName() {
+    public Name getPropertyQName() {
         return propertyName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/ColumnImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Column;
 
@@ -34,22 +34,22 @@
     /**
      * The name of the selector.
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * The name of the property.
      */
-    private final QName propertyName;
+    private final Name propertyName;
 
     /**
      * The name of the column.
      */
-    private final QName columnName;
+    private final Name columnName;
 
     ColumnImpl(NamePathResolver resolver,
-               QName selectorName,
-               QName propertyName,
-               QName columnName) {
+               Name selectorName,
+               Name propertyName,
+               Name columnName) {
         super(resolver);
         this.selectorName = selectorName;
         this.propertyName = propertyName;
@@ -61,7 +61,7 @@
      *
      * @return the selector name; non-null
      */
-    public QName getSelectorQName() {
+    public Name getSelectorQName() {
         return selectorName;
     }
 
@@ -71,7 +71,7 @@
      * @return the property name, or null to include a column for each
      *         single-value non-residual property of the selector's node type
      */
-    public QName getPropertyQName() {
+    public Name getPropertyQName() {
         return propertyName;
     }
 
@@ -82,7 +82,7 @@
      * @return the column name; must be null if <code>getPropertyName</code> is
      *         null and non-null otherwise
      */
-    public QName getColumnQName() {
+    public Name getColumnQName() {
         return columnName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/FullTextSearchImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.FullTextSearch;
 
@@ -31,12 +31,12 @@
     /**
      * Name of the selector against which to apply this constraint
      */
-    private final QName selectorName;
+    private final Name selectorName;
 
     /**
      * Name of the property.
      */
-    private final QName propertyName;
+    private final Name propertyName;
 
     /**
      * Full text search expression.
@@ -44,8 +44,8 @@
     private final String fullTextSearchExpression;
 
     FullTextSearchImpl(NamePathResolver resolver,
-                       QName selectorName,
-                       QName propertyName,
+                       Name selectorName,
+                       Name propertyName,
                        String fullTextSearchExpression) {
         super(resolver);
         this.selectorName = selectorName;
@@ -58,7 +58,7 @@
      *
      * @return the selector name; non-null
      */
-    public QName getSelectorQName() {
+    public Name getSelectorQName() {
         return selectorName;
     }
 
@@ -69,7 +69,7 @@
      *         otherwise null if the full-text search scope is the node (or node
      *         subtree, in some implementations).
      */
-    public QName getPropertyQName() {
+    public Name getPropertyQName() {
         return propertyName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/JoinImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Join;
 import org.apache.jackrabbit.core.query.jsr283.qom.Source;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/NotImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Not;
 import org.apache.jackrabbit.core.query.jsr283.qom.Constraint;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/SourceImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/SourceImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/SourceImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.Source;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/StaticOperandImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/StaticOperandImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/StaticOperandImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.StaticOperand;
 
Index: src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/AndImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.And;
 import org.apache.jackrabbit.core.query.jsr283.qom.Constraint;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/DescendantNodeJoinConditionImpl.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.DescendantNodeJoinCondition;
 
@@ -31,16 +31,16 @@
     /**
      * Name of the descendant selector.
      */
-    private final QName descendantSelectorName;
+    private final Name descendantSelectorName;
 
     /**
      * Name of the ancestor selector.
      */
-    private final QName ancestorSelectorName;
+    private final Name ancestorSelectorName;
 
     DescendantNodeJoinConditionImpl(NamePathResolver resolver,
-                                    QName descendantSelectorName,
-                                    QName ancestorSelectorName) {
+                                    Name descendantSelectorName,
+                                    Name ancestorSelectorName) {
         super(resolver);
         this.descendantSelectorName = descendantSelectorName;
         this.ancestorSelectorName = ancestorSelectorName;
Index: src/main/java/org/apache/jackrabbit/core/query/qom/JoinConditionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/qom/JoinConditionImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/qom/JoinConditionImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.qom;
 
-import org.apache.jackrabbit.name.NamePathResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import org.apache.jackrabbit.core.query.jsr283.qom.JoinCondition;
 
Index: src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/PropertyTypeRegistry.java	(working copy)
@@ -20,7 +20,7 @@
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener;
 import org.apache.jackrabbit.core.nodetype.PropDef;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +52,7 @@
     /** The NodeTypeRegistry */
     private final NodeTypeRegistry registry;
 
-    /** Property QName to TypeMapping[] mapping */
+    /** Property Name to TypeMapping[] mapping */
     private final Map typeMapping = new HashMap();
 
     /**
@@ -73,7 +73,7 @@
      * @param propName the name of the property.
      * @return an array of <code>TypeMapping</code> instances.
      */
-    public TypeMapping[] getPropertyTypes(QName propName) {
+    public TypeMapping[] getPropertyTypes(Name propName) {
         synchronized (typeMapping) {
             TypeMapping[] types = (TypeMapping[]) typeMapping.get(propName);
             if (types != null) {
@@ -84,7 +84,7 @@
         }
     }
 
-    public void nodeTypeRegistered(QName ntName) {
+    public void nodeTypeRegistered(Name ntName) {
         try {
             NodeTypeDef def = registry.getNodeTypeDef(ntName);
             PropDef[] propDefs = def.getPropertyDefs();
@@ -92,7 +92,7 @@
                 for (int i = 0; i < propDefs.length; i++) {
                     int type = propDefs[i].getRequiredType();
                     if (!propDefs[i].definesResidual() && type != PropertyType.UNDEFINED) {
-                        QName name = propDefs[i].getName();
+                        Name name = propDefs[i].getName();
                         // only remember defined property types
                         TypeMapping[] types = (TypeMapping[]) typeMapping.get(name);
                         if (types == null) {
@@ -112,17 +112,17 @@
         }
     }
 
-    public void nodeTypeReRegistered(QName ntName) {
+    public void nodeTypeReRegistered(Name ntName) {
         nodeTypeUnregistered(ntName);
         nodeTypeRegistered(ntName);
     }
 
-    public void nodeTypeUnregistered(QName ntName) {
+    public void nodeTypeUnregistered(Name ntName) {
         // remove all TypeMapping instances refering to this ntName
         synchronized (typeMapping) {
             Map modified = new HashMap();
             for (Iterator it = typeMapping.keySet().iterator(); it.hasNext();) {
-                QName propName = (QName) it.next();
+                Name propName = (Name) it.next();
                 TypeMapping[] mapping = (TypeMapping[]) typeMapping.get(propName);
                 List remove = null;
                 for (int i = 0; i < mapping.length; i++) {
@@ -156,7 +156,7 @@
      * from the {@link org.apache.jackrabbit.core.nodetype.NodeTypeRegistry}.
      */
     private void fillCache() {
-        QName[] ntNames = registry.getRegisteredNodeTypes();
+        Name[] ntNames = registry.getRegisteredNodeTypes();
         for (int i = 0; i < ntNames.length; i++) {
             nodeTypeRegistered(ntNames[i]);
         }
@@ -167,13 +167,13 @@
         /** The property type as an integer */
         public final int type;
 
-        /** The QName of the node type where this type mapping originated */
-        final QName ntName;
+        /** The Name of the node type where this type mapping originated */
+        final Name ntName;
 
         /** True if the property type is multi-valued */
         public final boolean isMultiValued;
 
-        private TypeMapping(QName ntName, int type, boolean isMultiValued) {
+        private TypeMapping(Name ntName, int type, boolean isMultiValued) {
             this.type = type;
             this.ntName = ntName;
             this.isMultiValued = isMultiValued;
Index: src/main/java/org/apache/jackrabbit/core/query/sql/ASTContainsExpression.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/ASTContainsExpression.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/ASTContainsExpression.java	(working copy)
@@ -16,13 +16,13 @@
  */
 package org.apache.jackrabbit.core.query.sql;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 public class ASTContainsExpression extends SimpleNode {
 
     private String query;
 
-    private QName property;
+    private Name property;
 
     public ASTContainsExpression(int id) {
         super(id);
@@ -40,11 +40,11 @@
         this.query = query;
     }
 
-    public QName getPropertyName() {
+    public Name getPropertyName() {
         return property;
     }
 
-    public void setPropertyName(QName property) {
+    public void setPropertyName(Name property) {
         this.property = property;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/sql/ASTPredicate.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/ASTPredicate.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/ASTPredicate.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.sql;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 public class ASTPredicate extends SimpleNode {
 
@@ -24,7 +24,7 @@
 
     private boolean negate = false;
 
-    private QName identifier;
+    private Name identifier;
 
     private String identifierOperand;
 
@@ -54,11 +54,11 @@
         return this.negate;
     }
 
-    public void setIdentifier(QName identifier) {
+    public void setIdentifier(Name identifier) {
         this.identifier = identifier;
     }
 
-    public QName getIdentifier() {
+    public Name getIdentifier() {
         return identifier;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/sql/ASTIdentifier.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/ASTIdentifier.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/ASTIdentifier.java	(working copy)
@@ -16,11 +16,11 @@
  */
 package org.apache.jackrabbit.core.query.sql;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 public class ASTIdentifier extends SimpleNode {
 
-    private QName name;
+    private Name name;
 
     public ASTIdentifier(int id) {
     super(id);
@@ -30,11 +30,11 @@
     super(p, id);
   }
 
-    public void setName(QName name) {
+    public void setName(Name name) {
         this.name = name;
     }
 
-    public QName getName() {
+    public Name getName() {
         return name;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java	(working copy)
@@ -31,18 +31,21 @@
 import org.apache.jackrabbit.core.query.TextsearchQueryNode;
 import org.apache.jackrabbit.core.query.PropertyFunctionQueryNode;
 import org.apache.jackrabbit.core.query.QueryNodeFactory;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameResolver;
 import org.apache.jackrabbit.util.ISO8601;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.commons.collections.map.ReferenceMap;
 
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.NamespaceException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -88,7 +91,7 @@
     /**
      * To resolve QNames
      */
-    private NamespaceResolver resolver;
+    private NameResolver resolver;
 
     /**
      * Query node to gather the constraints defined in the WHERE clause
@@ -96,9 +99,9 @@
     private final AndQueryNode constraintNode;
 
     /**
-     * The QName of the node type in the from clause.
+     * The Name of the node type in the from clause.
      */
-    private QName nodeTypeName;
+    private Name nodeTypeName;
 
     /**
      * List of PathQueryNode constraints that need to be merged
@@ -119,7 +122,7 @@
      * @param factory   the query node factory.
      */
     private JCRSQLQueryBuilder(ASTQuery statement,
-                               NamespaceResolver resolver,
+                               NameResolver resolver,
                                QueryNodeFactory factory) {
         this.stmt = statement;
         this.resolver = resolver;
@@ -137,7 +140,7 @@
      * @throws InvalidQueryException if <code>statement</code> is malformed.
      */
     public static QueryRootNode createQuery(String statement,
-                                            NamespaceResolver resolver,
+                                            NameResolver resolver,
                                             QueryNodeFactory factory)
             throws InvalidQueryException {
         try {
@@ -147,7 +150,7 @@
                 parser = (JCRSQLParser) parsers.get(resolver);
                 if (parser == null) {
                     parser = new JCRSQLParser(new StringReader(statement));
-                    parser.setNamespaceResolver(resolver);
+                    parser.setNameResolver(resolver);
                     parsers.put(resolver, parser);
                 }
             }
@@ -178,7 +181,7 @@
      * @throws InvalidQueryException if the query node tree cannot be converted
      *                               into a String representation due to restrictions in SQL.
      */
-    public static String toString(QueryRootNode root, NamespaceResolver resolver)
+    public static String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return QueryFormat.toString(root, resolver);
     }
@@ -286,7 +289,7 @@
             }
 
             public Object visit(ASTExcerptFunction node, Object data) {
-                root.addSelectProperty(new QName(QName.NS_REP_URI, "excerpt(.)"));
+                root.addSelectProperty(NameFactoryImpl.getInstance().create(Name.NS_REP_URI, "excerpt(.)"));
                 return data;
             }
         }, root);
@@ -299,7 +302,7 @@
 
         return node.childrenAccept(new DefaultParserVisitor() {
             public Object visit(ASTIdentifier node, Object data) {
-                if (!node.getName().equals(QName.NT_BASE)) {
+                if (!node.getName().equals(NameConstants.NT_BASE)) {
                     // node is either primary or mixin node type
                     nodeTypeName = node.getName();
                 }
@@ -319,7 +322,7 @@
         QueryNode predicateNode;
 
         try {
-            final QName[] tmp = new QName[2];
+            final Name[] tmp = new Name[2];
             final ASTLiteral[] value = new ASTLiteral[1];
             node.childrenAccept(new DefaultParserVisitor() {
                 public Object visit(ASTIdentifier node, Object data) {
@@ -360,9 +363,9 @@
                     }
                 }
             }, data);
-            QName identifier = tmp[0];
+            Name identifier = tmp[0];
 
-            if (identifier != null && identifier.equals(QName.JCR_PATH)) {
+            if (identifier != null && identifier.equals(NameConstants.JCR_PATH)) {
                 if (tmp[1] != null) {
                     // simply ignore, this is a join of a mixin node type
                 } else {
@@ -505,7 +508,7 @@
     public Object visit(ASTOrderSpec node, Object data) {
         OrderQueryNode order = (OrderQueryNode) data;
 
-        final QName[] identifier = new QName[1];
+        final Name[] identifier = new Name[1];
 
         // collect identifier
         node.childrenAccept(new DefaultParserVisitor() {
@@ -539,7 +542,7 @@
         try {
             Path relPath = null;
             if (node.getPropertyName() != null) {
-                Path.PathBuilder builder = new Path.PathBuilder();
+                PathBuilder builder = new PathBuilder();
                 builder.addLast(node.getPropertyName());
                 relPath = builder.getPath();
             }
@@ -592,7 +595,7 @@
      *                                  to its type. E.g. a malformed String representation of a date.
      */
     private RelationQueryNode createRelationQueryNode(QueryNode parent,
-                                                      QName propertyName,
+                                                      Name propertyName,
                                                       int operationType,
                                                       ASTLiteral literal)
             throws IllegalArgumentException {
@@ -603,7 +606,7 @@
         try {
             Path relPath = null;
             if (propertyName != null) {
-                Path.PathBuilder builder = new Path.PathBuilder();
+                PathBuilder builder = new PathBuilder();
                 builder.addLast(propertyName);
                 relPath = builder.getPath();
             }
@@ -712,10 +715,12 @@
                         index = 1;
                     }
                 }
-                QName qName = null;
+                Name qName = null;
                 if (name != null) {
                     try {
-                        qName = NameFormat.parse(name, resolver);
+                        qName = resolver.getQName(name);
+                    } catch (NamespaceException e) {
+                        throw new IllegalArgumentException("Illegal name: " + name);
                     } catch (NameException e) {
                         throw new IllegalArgumentException("Illegal name: " + name);
                     }
Index: src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java	(working copy)
@@ -19,7 +19,7 @@
 import org.apache.jackrabbit.core.query.QueryTreeBuilder;
 import org.apache.jackrabbit.core.query.QueryRootNode;
 import org.apache.jackrabbit.core.query.QueryNodeFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NameResolver;
 
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.query.Query;
@@ -33,7 +33,7 @@
      * @inheritDoc
      */
     public QueryRootNode createQueryTree(String statement,
-                                         NamespaceResolver resolver,
+                                         NameResolver resolver,
                                          QueryNodeFactory factory)
             throws InvalidQueryException {
         return JCRSQLQueryBuilder.createQuery(statement, resolver, factory);
@@ -57,7 +57,7 @@
     /**
      * @inheritDoc
      */
-    public String toString(QueryRootNode root, NamespaceResolver resolver)
+    public String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return JCRSQLQueryBuilder.toString(root, resolver);
     }
Index: src/main/java/org/apache/jackrabbit/core/query/sql/QueryFormat.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/sql/QueryFormat.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/sql/QueryFormat.java	(working copy)
@@ -32,14 +32,14 @@
 import org.apache.jackrabbit.core.query.RelationQueryNode;
 import org.apache.jackrabbit.core.query.TextsearchQueryNode;
 import org.apache.jackrabbit.core.query.PropertyFunctionQueryNode;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.util.ISO8601;
+import org.apache.jackrabbit.conversion.NameResolver;
 
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.NamespaceException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Iterator;
@@ -54,7 +54,7 @@
     /**
      * Will be used to resolve QNames
      */
-    private final NamespaceResolver resolver;
+    private final NameResolver resolver;
 
     /**
      * The String representation of the query node tree
@@ -71,7 +71,7 @@
      */
     private List nodeTypes = new ArrayList();
 
-    private QueryFormat(QueryRootNode root, NamespaceResolver resolver)
+    private QueryFormat(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         this.resolver = resolver;
         statement = root.accept(this, new StringBuffer()).toString();
@@ -91,7 +91,7 @@
      * @throws InvalidQueryException the query node tree cannot be represented
      *                               as a SQL <code>String</code>.
      */
-    public static String toString(QueryRootNode root, NamespaceResolver resolver)
+    public static String toString(QueryRootNode root, NameResolver resolver)
             throws InvalidQueryException {
         return new QueryFormat(root, resolver).toString();
     }
@@ -112,7 +112,7 @@
         try {
             sb.append("SELECT");
 
-            QName[] selectProps = node.getSelectProperties();
+            Name[] selectProps = node.getSelectProperties();
             if (selectProps.length == 0) {
                 sb.append(" *");
             } else {
@@ -151,7 +151,7 @@
             String comma = "";
             int ntCount = 0;
             for (Iterator it = nodeTypes.iterator(); it.hasNext(); ntCount++) {
-                QName nt = (QName) it.next();
+                Name nt = (Name) it.next();
                 sb.append(comma).append(" ");
                 appendName(nt, resolver, sb);
                 comma = ",";
@@ -159,7 +159,7 @@
 
             if (ntCount == 0) {
                 sb.append(" ");
-                sb.append(NameFormat.format(QName.NT_BASE, resolver));
+                sb.append(resolver.getJCRName(NameConstants.NT_BASE));
             }
 
             // append WHERE clause
@@ -181,7 +181,7 @@
                 }
                 node.getLocationNode().accept(this, sb);
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
 
@@ -259,7 +259,7 @@
         StringBuffer sb = (StringBuffer) data;
         try {
             appendName(node.getPropertyName(), resolver, sb);
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         sb.append("='").append(node.getValue()).append("'");
@@ -285,7 +285,7 @@
             } else {
                 try {
                     appendName(node.getRelativePath().getNameElement().getName(), resolver, sb);
-                } catch (NoPrefixDeclaredException e) {
+                } catch (NamespaceException e) {
                     exceptions.add(e);
                 }
             }
@@ -300,7 +300,7 @@
         try {
             if (containsDescendantOrSelf(node)) {
                 sb.append("(");
-                sb.append(NameFormat.format(QName.JCR_PATH, resolver));
+                sb.append(resolver.getJCRName(NameConstants.JCR_PATH));
                 sb.append(" LIKE '");
                 LocationStepQueryNode[] steps = node.getPathSteps();
                 for (int i = 0; i < steps.length; i++) {
@@ -315,7 +315,7 @@
                 }
                 sb.append('\'');
                 sb.append(" OR ");
-                sb.append(NameFormat.format(QName.JCR_PATH, resolver));
+                sb.append(resolver.getJCRName(NameConstants.JCR_PATH));
                 sb.append(" LIKE '");
                 for (int i = 0; i < steps.length; i++) {
                     if (steps[i].getNameTest() == null
@@ -328,7 +328,7 @@
                 }
                 sb.append("')");
             } else if (containsAllChildrenMatch(node)) {
-                sb.append(NameFormat.format(QName.JCR_PATH, resolver));
+                sb.append(resolver.getJCRName(NameConstants.JCR_PATH));
                 sb.append(" LIKE '");
                 StringBuffer path = new StringBuffer();
                 LocationStepQueryNode[] steps = node.getPathSteps();
@@ -342,12 +342,12 @@
                 sb.append(path);
                 sb.append('\'');
                 sb.append(" AND NOT ");
-                sb.append(NameFormat.format(QName.JCR_PATH, resolver));
+                sb.append(resolver.getJCRName(NameConstants.JCR_PATH));
                 sb.append(" LIKE '");
                 sb.append(path).append("/%").append('\'');
             } else {
                 // just do a best effort
-                sb.append(NameFormat.format(QName.JCR_PATH, resolver));
+                sb.append(resolver.getJCRName(NameConstants.JCR_PATH));
                 sb.append(" LIKE '");
                 LocationStepQueryNode[] steps = node.getPathSteps();
                 for (int i = 0; i < steps.length; i++) {
@@ -359,7 +359,7 @@
                 }
                 sb.append('\'');
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -372,8 +372,8 @@
         } else {
             if (node.getNameTest().getLocalName().length() > 0) {
                 try {
-                    sb.append(NameFormat.format(node.getNameTest(), resolver));
-                } catch (NoPrefixDeclaredException e) {
+                    sb.append(resolver.getJCRName(node.getNameTest()));
+                } catch (NamespaceException e) {
                     exceptions.add(e);
                 }
                 if (node.getIndex() == LocationStepQueryNode.NONE) {
@@ -441,7 +441,7 @@
             if (node.getOperation() == OPERATION_LIKE && node.getStringValue().indexOf('\\') > -1) {
                 sb.append(" ESCAPE '\\'");
             }
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             exceptions.add(e);
         }
         return sb;
@@ -462,7 +462,7 @@
                     }
                     comma = ",";
                 }
-            } catch (NoPrefixDeclaredException e) {
+            } catch (NamespaceException e) {
                 exceptions.add(e);
             }
         } else {
@@ -492,21 +492,21 @@
      * <code>resolver</code>. The <code>name</code> is put in double quotes
      * if the local part of <code>name</code> contains a space character.
      *
-     * @param name     the <code>QName</code> to print.
+     * @param name     the <code>Name</code> to print.
      * @param resolver to resolve <code>name</code>.
      * @param b        where to output the <code>name</code>.
-     * @throws NoPrefixDeclaredException if <code>name</code> contains a uri
+     * @throws NamespaceException if <code>name</code> contains a uri
      *                                   that is not declared in <code>resolver</code>.
      */
-    private static void appendName(QName name,
-                                   NamespaceResolver resolver,
+    private static void appendName(Name name,
+                                   NameResolver resolver,
                                    StringBuffer b)
-            throws NoPrefixDeclaredException {
+            throws NamespaceException {
         boolean quote = name.getLocalName().indexOf(' ') > -1;
         if (quote) {
             b.append('"');
         }
-        b.append(NameFormat.format(name, resolver));
+        b.append(resolver.getJCRName(name));
         if (quote) {
             b.append('"');
         }
Index: src/main/java/org/apache/jackrabbit/core/query/DerefQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/DerefQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/DerefQueryNode.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Represents query node that dereferences a reference property into a node and
@@ -25,7 +25,7 @@
 public class DerefQueryNode extends LocationStepQueryNode {
 
     /** The name of the reference property */
-    private QName refProperty;
+    private Name refProperty;
 
     /**
      * Creates a new <code>DerefQueryNode</code> without a name set for the
@@ -36,7 +36,7 @@
      * @param descendants if <code>true</code> this location step uses the
      *   descendant-or-self axis; otherwise the child axis.
      */
-    protected DerefQueryNode(QueryNode parent, QName nameTest, boolean descendants) {
+    protected DerefQueryNode(QueryNode parent, Name nameTest, boolean descendants) {
         super(parent);
         setNameTest(nameTest);
         setIncludeDescendants(descendants);
@@ -46,7 +46,7 @@
      * Sets a new name for the reference property.
      * @param propertyName the name of the reference property.
      */
-    public void setRefProperty(QName propertyName) {
+    public void setRefProperty(Name propertyName) {
         refProperty = propertyName;
     }
 
@@ -56,7 +56,7 @@
      * @return the name of the reference property or <code>null</code> if
      * none is set.
      */
-    public QName getRefProperty() {
+    public Name getRefProperty() {
         return refProperty;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/QueryParser.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryParser.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryParser.java	(working copy)
@@ -16,10 +16,11 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
 
 import javax.jcr.query.InvalidQueryException;
 
+import org.apache.jackrabbit.conversion.NameResolver;
+
 /**
  * This class acts as the central entry point for parsing query statements from
  * different query syntaxes into a query tree.
@@ -48,7 +49,7 @@
      */
     public static QueryRootNode parse(String statement,
                                       String language,
-                                      NamespaceResolver resolver,
+                                      NameResolver resolver,
                                       QueryNodeFactory factory)
             throws InvalidQueryException {
 
@@ -77,7 +78,7 @@
      */
     public static String toString(QueryRootNode root,
                                   String language,
-                                  NamespaceResolver resolver)
+                                  NameResolver resolver)
             throws InvalidQueryException {
 
         QueryTreeBuilder builder = QueryTreeBuilderRegistry.getQueryTreeBuilder(language);
Index: src/main/java/org/apache/jackrabbit/core/query/NodeTypeQueryNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/NodeTypeQueryNode.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/NodeTypeQueryNode.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Implements a query node that defines a node type match.
@@ -29,11 +30,11 @@
      * @param parent   the parent node for this query node.
      * @param nodeType the name of the node type.
      */
-    protected NodeTypeQueryNode(QueryNode parent, QName nodeType) {
+    protected NodeTypeQueryNode(QueryNode parent, Name nodeType) {
         // we only use the jcr primary type as a dummy value
         // the property name is actually replaced in the query builder
         // when the runtime query is created to search the index.
-        super(parent, QName.JCR_PRIMARYTYPE, nodeType);
+        super(parent, NameConstants.JCR_PRIMARYTYPE, nodeType);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java	(revision 585915)
+++ src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java	(working copy)
@@ -18,9 +18,8 @@
 
 import org.apache.jackrabbit.core.ItemManager;
 import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,6 +34,7 @@
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.query.QueryResult;
 import org.apache.jackrabbit.core.query.qom.QueryObjectModelTree;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.version.VersionException;
 import java.text.NumberFormat;
@@ -141,11 +141,11 @@
         this.node = node;
         this.handler = handler;
 
-        if (!node.isNodeType(session.getJCRName(QName.NT_QUERY))) {
+        if (!node.isNodeType(session.getJCRName(NameConstants.NT_QUERY))) {
             throw new InvalidQueryException("node is not of type nt:query");
         }
-        statement = node.getProperty(session.getJCRName(QName.JCR_STATEMENT)).getString();
-        language = node.getProperty(session.getJCRName(QName.JCR_LANGUAGE)).getString();
+        statement = node.getProperty(session.getJCRName(NameConstants.JCR_STATEMENT)).getString();
+        language = node.getProperty(session.getJCRName(NameConstants.JCR_LANGUAGE)).getString();
         query = handler.createExecutableQuery(session, itemMgr, statement, language);
         setInitialized();
     }
@@ -234,10 +234,10 @@
 
             String relPath = session.getJCRPath(p).substring(1);
             Node queryNode = session.getRootNode().addNode(
-                    relPath, session.getJCRName(QName.NT_QUERY));
+                    relPath, session.getJCRName(NameConstants.NT_QUERY));
             // set properties
-            queryNode.setProperty(session.getJCRName(QName.JCR_LANGUAGE), language);
-            queryNode.setProperty(session.getJCRName(QName.JCR_STATEMENT), statement);
+            queryNode.setProperty(session.getJCRName(NameConstants.JCR_LANGUAGE), language);
+            queryNode.setProperty(session.getJCRName(NameConstants.JCR_STATEMENT), statement);
             node = queryNode;
             return node;
         } catch (NameException e) {
Index: src/main/java/org/apache/jackrabbit/core/ItemManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/ItemManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/ItemManager.java	(working copy)
@@ -33,8 +33,9 @@
 import org.apache.jackrabbit.core.util.Dumpable;
 import org.apache.jackrabbit.core.version.VersionHistoryImpl;
 import org.apache.jackrabbit.core.version.VersionImpl;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -440,7 +441,7 @@
         Iterator iter = nodeState.getPropertyNames().iterator();
 
         while (iter.hasNext()) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             // check read access
             if (session.getAccessManager().isGranted(new PropertyId(parentId, propName), AccessManager.READ)) {
                 return true;
@@ -473,7 +474,7 @@
         Iterator iter = nodeState.getPropertyNames().iterator();
 
         while (iter.hasNext()) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             PropertyId id = new PropertyId(parentId, propName);
             // check read access
             if (session.getAccessManager().isGranted(id, AccessManager.READ)) {
@@ -519,10 +520,10 @@
         ItemLifeCycleListener[] listeners = new ItemLifeCycleListener[]{this};
 
         // check special nodes
-        if (state.getNodeTypeName().equals(QName.NT_VERSION)) {
+        if (state.getNodeTypeName().equals(NameConstants.NT_VERSION)) {
             return createVersionInstance(id, state, def, listeners);
 
-        } else if (state.getNodeTypeName().equals(QName.NT_VERSIONHISTORY)) {
+        } else if (state.getNodeTypeName().equals(NameConstants.NT_VERSIONHISTORY)) {
             return createVersionHistoryInstance(id, state, def, listeners);
 
         } else {
Index: src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/value/InternalValue.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/value/InternalValue.java	(working copy)
@@ -18,14 +18,11 @@
 
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.PathFormat;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.value.BinaryValue;
@@ -37,6 +34,8 @@
 import org.apache.jackrabbit.value.PathValue;
 import org.apache.jackrabbit.value.ReferenceValue;
 import org.apache.jackrabbit.value.StringValue;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -62,7 +61,7 @@
  * <tr>DOUBLE<td></td><td>Double</td></tr>
  * <tr>DATE<td></td><td>Calendar</td></tr>
  * <tr>BOOLEAN<td></td><td>Boolean</td></tr>
- * <tr>NAME<td></td><td>QName</td></tr>
+ * <tr>NAME<td></td><td>Name</td></tr>
  * <tr>PATH<td></td><td>Path</td></tr>
  * <tr>BINARY<td></td><td>BLOBFileValue</td></tr>
  * <tr>REFERENCE<td></td><td>UUID</td></tr>
@@ -96,12 +95,12 @@
      * Large binary values are stored in a temporary file.
      * 
      * @param value the JCR value
-     * @param nsResolver the namespace resolver
+     * @param resolver
      * @return the created internal value
      */
-    public static InternalValue create(Value value, NamespaceResolver nsResolver)
+    public static InternalValue create(Value value, NamePathResolver resolver)
             throws ValueFormatException, RepositoryException {
-        return create(value, nsResolver, null);
+        return create(value, resolver, null);
     }
 
     /**
@@ -109,11 +108,11 @@
      * If the data store is enabled, large binary values are stored in the data store.
      * 
      * @param value the JCR value
-     * @param nsResolver the namespace resolver
+     * @param resolver
      * @param store the data store
      * @return the created internal value
      */
-    public static InternalValue create(Value value, NamespaceResolver nsResolver, DataStore store)
+    public static InternalValue create(Value value, NamePathResolver resolver, DataStore store)
             throws ValueFormatException, RepositoryException {
         if (value == null) {
             throw new IllegalArgumentException("null value");
@@ -153,13 +152,13 @@
                 return create(new UUID(value.getString()));
             case PropertyType.NAME:
                 try {
-                    return create(NameFormat.parse(value.getString(), nsResolver));
+                    return create(resolver.getQName(value.getString()));
                 } catch (NameException e) {
                     throw new ValueFormatException(e.getMessage());
                 }
             case PropertyType.PATH:
                 try {
-                    return create(PathFormat.parse(value.getString(), nsResolver));
+                    return create(resolver.getQPath(value.getString()));
                 } catch (MalformedPathException mpe) {
                     throw new ValueFormatException(mpe.getMessage());
                 }
@@ -302,7 +301,7 @@
      * @param value
      * @return the created value
      */
-    public static InternalValue create(QName value) {
+    public static InternalValue create(Name value) {
         return new InternalValue(value);
     }
 
@@ -310,7 +309,7 @@
      * @param values
      * @return the created value
      */
-    public static InternalValue[] create(QName[] values) {
+    public static InternalValue[] create(Name[] values) {
         InternalValue[] ret = new InternalValue[values.length];
         for (int i = 0; i < values.length; i++) {
             ret[i] = new InternalValue(values[i]);
@@ -348,11 +347,11 @@
 
     //----------------------------------------------------< conversions, etc. >
     /**
-     * @param nsResolver
+     * @param resolver
      * @return
      * @throws RepositoryException
      */
-    public Value toJCRValue(NamespaceResolver nsResolver)
+    public Value toJCRValue(NamePathResolver resolver)
             throws RepositoryException {
         switch (type) {
             case PropertyType.BINARY:
@@ -368,14 +367,9 @@
             case PropertyType.REFERENCE:
                 return ReferenceValue.valueOf(val.toString());
             case PropertyType.PATH:
-                try {
-                    return PathValue.valueOf(PathFormat.format((Path) val, nsResolver));
-                } catch (NoPrefixDeclaredException npde) {
-                    // should never get here...
-                    throw new RepositoryException("internal error: encountered unregistered namespace", npde);
-                }
+                return PathValue.valueOf(resolver.getJCRPath((Path) val));
             case PropertyType.NAME:
-                return NameValue.valueOf((QName) val, nsResolver);
+                return NameValue.valueOf(resolver.getJCRName((Name) val));
             case PropertyType.STRING:
                 return new StringValue((String) val);
             default:
@@ -406,9 +400,9 @@
         return ((Boolean) val).booleanValue();
     }    
 
-    public QName getQName() {
+    public Name getQName() {
         assert val != null && type == PropertyType.NAME;
-        return (QName) val;
+        return (Name) val;
     }
     
     public Path getPath() {
@@ -501,9 +495,9 @@
             case PropertyType.REFERENCE:
                 return create(new UUID(s));
             case PropertyType.PATH:
-                return create(Path.valueOf(s));
+                return create(PathFactoryImpl.getInstance().create(s));
             case PropertyType.NAME:
-                return create(QName.valueOf(s));
+                return create(NameFactoryImpl.getInstance().create(s));
             case PropertyType.STRING:
                 return create(s);
 
@@ -556,7 +550,7 @@
         type = PropertyType.STRING;
     }
 
-    private InternalValue(QName value) {
+    private InternalValue(Name value) {
         val = value;
         type = PropertyType.NAME;
     }
Index: src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java	(working copy)
@@ -20,7 +20,7 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.observation.EventStateCollectionFactory;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.ReferentialIntegrityException;
 
@@ -227,7 +227,7 @@
     /**
      * {@inheritDoc}
      */
-    public NodeState createNew(NodeId id, QName nodeTypeName,
+    public NodeState createNew(NodeId id, Name nodeTypeName,
                                NodeId parentId)
             throws IllegalStateException {
         if (!editMode) {
@@ -244,7 +244,7 @@
     /**
      * {@inheritDoc}
      */
-    public PropertyState createNew(QName propName, NodeId parentId)
+    public PropertyState createNew(Name propName, NodeId parentId)
             throws IllegalStateException {
         if (!editMode) {
             throw new IllegalStateException("Not in edit mode");
@@ -488,7 +488,7 @@
      * Optimization: shared state manager we're listening to does not deliver node state changes, therefore the state
      * concerned must be a local state.
      */
-    public void nodeAdded(NodeState state, QName name, int index, NodeId id) {
+    public void nodeAdded(NodeState state, Name name, int index, NodeId id) {
         dispatcher.notifyNodeAdded(state, name, index, id);
     }
 
@@ -518,7 +518,7 @@
      * Optimization: shared state manager we're listening to does not deliver node state changes, therefore the state
      * concerned must be a local state.
      */
-    public void nodeRemoved(NodeState state, QName name, int index, NodeId id) {
+    public void nodeRemoved(NodeState state, Name name, int index, NodeId id) {
         dispatcher.notifyNodeRemoved(state, name, index, id);
     }
 }
Index: src/main/java/org/apache/jackrabbit/core/state/UpdatableItemStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/UpdatableItemStateManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/UpdatableItemStateManager.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.state;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.core.NodeId;
 
 import javax.jcr.ReferentialIntegrityException;
@@ -58,7 +58,7 @@
      * @return a node state
      * @throws IllegalStateException if the manager is not in edit mode.
      */
-    NodeState createNew(NodeId id, QName nodeTypeName,
+    NodeState createNew(NodeId id, Name nodeTypeName,
                         NodeId parentId) throws IllegalStateException;
 
     /**
@@ -71,7 +71,7 @@
      * @return a property state
      * @throws IllegalStateException if the manager is not in edit mode.
      */
-    PropertyState createNew(QName propName, NodeId parentId)
+    PropertyState createNew(Name propName, NodeId parentId)
             throws IllegalStateException;
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java	(working copy)
@@ -34,7 +34,8 @@
 import org.apache.jackrabbit.core.util.Dumpable;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -976,7 +977,7 @@
      * @param parentId   parent UUID
      * @return new node state instance
      */
-    private NodeState createInstance(NodeId id, QName nodeTypeName,
+    private NodeState createInstance(NodeId id, Name nodeTypeName,
                                      NodeId parentId) {
 
         NodeState state = persistMgr.createNew(id);
@@ -1000,8 +1001,8 @@
                                           NodeTypeRegistry ntReg)
             throws ItemStateException {
 
-        NodeState rootState = createInstance(rootNodeId, QName.REP_ROOT, null);
-        NodeState jcrSystemState = createInstance(RepositoryImpl.SYSTEM_ROOT_NODE_ID, QName.REP_SYSTEM, rootNodeId);
+        NodeState rootState = createInstance(rootNodeId, NameConstants.REP_ROOT, null);
+        NodeState jcrSystemState = createInstance(RepositoryImpl.SYSTEM_ROOT_NODE_ID, NameConstants.REP_SYSTEM, rootNodeId);
 
         // FIXME need to manually setup root node by creating mandatory jcr:primaryType property
         // @todo delegate setup of root node to NodeTypeInstanceHandler
@@ -1014,10 +1015,10 @@
         NodeDefId jcrSystemDefId;
         try {
             nodeDefId = ntReg.getRootNodeDef().getId();
-            EffectiveNodeType ent = ntReg.getEffectiveNodeType(QName.REP_ROOT);
-            propDef = ent.getApplicablePropertyDef(QName.JCR_PRIMARYTYPE,
+            EffectiveNodeType ent = ntReg.getEffectiveNodeType(NameConstants.REP_ROOT);
+            propDef = ent.getApplicablePropertyDef(NameConstants.JCR_PRIMARYTYPE,
                     PropertyType.NAME, false);
-            jcrSystemDefId = ent.getApplicableChildNodeDef(QName.JCR_SYSTEM, QName.REP_SYSTEM, ntReg).getId();
+            jcrSystemDefId = ent.getApplicableChildNodeDef(NameConstants.JCR_SYSTEM, NameConstants.REP_SYSTEM, ntReg).getId();
         } catch (NoSuchNodeTypeException nsnte) {
             String msg = "internal error: failed to create root node";
             log.error(msg, nsnte);
@@ -1034,7 +1035,7 @@
         rootState.addPropertyName(propDef.getName());
 
         PropertyState prop = createInstance(propDef.getName(), rootNodeId);
-        prop.setValues(new InternalValue[]{InternalValue.create(QName.REP_ROOT)});
+        prop.setValues(new InternalValue[]{InternalValue.create(NameConstants.REP_ROOT)});
         prop.setType(propDef.getRequiredType());
         prop.setMultiValued(propDef.isMultiple());
         prop.setDefinitionId(propDef.getId());
@@ -1043,19 +1044,19 @@
         jcrSystemState.addPropertyName(propDef.getName());
 
         PropertyState primaryTypeProp = createInstance(propDef.getName(), jcrSystemState.getNodeId());
-        primaryTypeProp.setValues(new InternalValue[]{InternalValue.create(QName.REP_SYSTEM)});
+        primaryTypeProp.setValues(new InternalValue[]{InternalValue.create(NameConstants.REP_SYSTEM)});
         primaryTypeProp.setType(propDef.getRequiredType());
         primaryTypeProp.setMultiValued(propDef.isMultiple());
         primaryTypeProp.setDefinitionId(propDef.getId());
 
         // add child node entry for jcr:system node
-        rootState.addChildNodeEntry(QName.JCR_SYSTEM, RepositoryImpl.SYSTEM_ROOT_NODE_ID);
+        rootState.addChildNodeEntry(NameConstants.JCR_SYSTEM, RepositoryImpl.SYSTEM_ROOT_NODE_ID);
 
         // add child node entry for virtual jcr:versionStorage
-        jcrSystemState.addChildNodeEntry(QName.JCR_VERSIONSTORAGE, RepositoryImpl.VERSION_STORAGE_NODE_ID);
+        jcrSystemState.addChildNodeEntry(NameConstants.JCR_VERSIONSTORAGE, RepositoryImpl.VERSION_STORAGE_NODE_ID);
 
         // add child node entry for virtual jcr:nodeTypes
-        jcrSystemState.addChildNodeEntry(QName.JCR_NODETYPES, RepositoryImpl.NODETYPES_NODE_ID);
+        jcrSystemState.addChildNodeEntry(NameConstants.JCR_NODETYPES, RepositoryImpl.NODETYPES_NODE_ID);
 
 
         ChangeLog changeLog = new ChangeLog();
@@ -1136,7 +1137,7 @@
      * @param parentId parent Id
      * @return new property state instance
      */
-    private PropertyState createInstance(QName propName, NodeId parentId) {
+    private PropertyState createInstance(Name propName, NodeId parentId) {
         PropertyState state = persistMgr.createNew(new PropertyId(parentId, propName));
         state.setStatus(ItemState.STATUS_NEW);
         state.setContainer(this);
@@ -1173,20 +1174,20 @@
      */
     private boolean isReferenceable(NodeState state) throws ItemStateException {
         // shortcut: check some wellknown built-in types first
-        QName primary = state.getNodeTypeName();
+        Name primary = state.getNodeTypeName();
         Set mixins = state.getMixinTypeNames();
-        if (mixins.contains(QName.MIX_REFERENCEABLE)
-                || mixins.contains(QName.MIX_VERSIONABLE)
-                || primary.equals(QName.NT_RESOURCE)) {
+        if (mixins.contains(NameConstants.MIX_REFERENCEABLE)
+                || mixins.contains(NameConstants.MIX_VERSIONABLE)
+                || primary.equals(NameConstants.NT_RESOURCE)) {
             return true;
         }
         // build effective node type
-        QName[] types = new QName[mixins.size() + 1];
+        Name[] types = new Name[mixins.size() + 1];
         mixins.toArray(types);
         // primary type
         types[types.length - 1] = primary;
         try {
-            return ntReg.getEffectiveNodeType(types).includesNodeType(QName.MIX_REFERENCEABLE);
+            return ntReg.getEffectiveNodeType(types).includesNodeType(NameConstants.MIX_REFERENCEABLE);
         } catch (NodeTypeConflictException ntce) {
             String msg = "internal error: failed to build effective node type for node "
                     + state.getNodeId();
Index: src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/PropertyState.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/PropertyState.java	(working copy)
@@ -22,7 +22,7 @@
 import org.apache.jackrabbit.core.nodetype.PropDefId;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -148,7 +148,7 @@
      *
      * @return the name of this property.
      */
-    public QName getName() {
+    public Name getName() {
         return id.getName();
     }
 
@@ -237,7 +237,7 @@
         private boolean multiValued;
         private PropDefId defId;
 
-        we assume an average QName localname of 30 chars.
+        we assume an average Name localname of 30 chars.
         PropertyId = 8 + nodeId(36) * name(250) + hash(4) ~ 300;
         NodeDefId = 8 + id(4) = 12
         InternalValue = 8 + n * (values) ~ 8 + n*100;
Index: src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.ItemId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -157,7 +157,7 @@
 
             for (Iterator iter = state.getAddedPropertyNames().iterator();
                  iter.hasNext();) {
-                QName name = (QName) iter.next();
+                Name name = (Name) iter.next();
                 PropertyId propId =
                         new PropertyId(state.getNodeId(), name);
                 if (context.isAdded(propId)) {
@@ -174,7 +174,7 @@
             }
             for (Iterator iter = state.getRemovedPropertyNames().iterator();
                  iter.hasNext();) {
-                QName name = (QName) iter.next();
+                Name name = (Name) iter.next();
                 PropertyId propId =
                         new PropertyId(state.getNodeId(), name);
                 if (context.isDeleted(propId)) {
@@ -187,11 +187,11 @@
             // re-apply changes made on this state
             state.setPropertyNames(overlayedState.getPropertyNames());
             for (Iterator iter = added.iterator(); iter.hasNext();) {
-                QName name = (QName) iter.next();
+                Name name = (Name) iter.next();
                 state.addPropertyName(name);
             }
             for (Iterator iter = removed.iterator(); iter.hasNext();) {
-                QName name = (QName) iter.next();
+                Name name = (Name) iter.next();
                 state.removePropertyName(name);
             }
         }
Index: src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/NodeStateListener.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.state;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.core.NodeId;
 
 /**
@@ -34,7 +34,7 @@
      * @param id    id of new node
      */
     void nodeAdded(NodeState state,
-                   QName name, int index, NodeId id);
+                   Name name, int index, NodeId id);
 
     /**
      * Called when a node has been modified, typically as a result of removal
@@ -63,5 +63,5 @@
      * @param index index of removed node
      * @param id    id of removed node
      */
-    void nodeRemoved(NodeState state, QName name, int index, NodeId id);
+    void nodeRemoved(NodeState state, Name name, int index, NodeId id);
 }
Index: src/main/java/org/apache/jackrabbit/core/state/NodeState.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/NodeState.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/NodeState.java	(working copy)
@@ -22,7 +22,8 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.ItemId;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
@@ -51,7 +52,7 @@
     /**
      * the name of this node's primary type
      */
-    private QName nodeTypeName;
+    private Name nodeTypeName;
 
     /**
      * the names of this node's mixin types
@@ -86,7 +87,7 @@
     private boolean sharedChildNodeEntries = false;
 
     /**
-     * set of property names (QName objects)
+     * set of property names (Name objects)
      */
     private HashSet propertyNames = new HashSet();
 
@@ -124,7 +125,7 @@
      * @param initialStatus the initial status of the node state object
      * @param isTransient   flag indicating whether this state is transient or not
      */
-    public NodeState(NodeId id, QName nodeTypeName, NodeId parentId,
+    public NodeState(NodeId id, Name nodeTypeName, NodeId parentId,
                      int initialStatus, boolean isTransient) {
         super(initialStatus, isTransient);
         this.id = id;
@@ -202,7 +203,7 @@
      *
      * @return the name of this node's node type.
      */
-    public QName getNodeTypeName() {
+    public Name getNodeTypeName() {
         return nodeTypeName;
     }
 
@@ -260,11 +261,11 @@
      * Determines if there is a <code>ChildNodeEntry</code> with the
      * specified <code>name</code>.
      *
-     * @param name <code>QName</code> object specifying a node name
+     * @param name <code>Name</code> object specifying a node name
      * @return <code>true</code> if there is a <code>ChildNodeEntry</code> with
      *         the specified <code>name</code>.
      */
-    public synchronized boolean hasChildNodeEntry(QName name) {
+    public synchronized boolean hasChildNodeEntry(Name name) {
         return !childNodeEntries.get(name).isEmpty();
     }
 
@@ -284,24 +285,24 @@
      * Determines if there is a <code>ChildNodeEntry</code> with the
      * specified <code>name</code> and <code>index</code>.
      *
-     * @param name  <code>QName</code> object specifying a node name
+     * @param name  <code>Name</code> object specifying a node name
      * @param index 1-based index if there are same-name child node entries
      * @return <code>true</code> if there is a <code>ChildNodeEntry</code> with
      *         the specified <code>name</code> and <code>index</code>.
      */
-    public synchronized boolean hasChildNodeEntry(QName name, int index) {
+    public synchronized boolean hasChildNodeEntry(Name name, int index) {
         return childNodeEntries.get(name, index) != null;
     }
 
     /**
      * Determines if there is a property entry with the specified
-     * <code>QName</code>.
+     * <code>Name</code>.
      *
-     * @param propName <code>QName</code> object specifying a property name
+     * @param propName <code>Name</code> object specifying a property name
      * @return <code>true</code> if there is a property entry with the specified
-     *         <code>QName</code>.
+     *         <code>Name</code>.
      */
-    public synchronized boolean hasPropertyName(QName propName) {
+    public synchronized boolean hasPropertyName(Name propName) {
         return propertyNames.contains(propName);
     }
 
@@ -309,12 +310,12 @@
      * Returns the <code>ChildNodeEntry</code> with the specified name and index
      * or <code>null</code> if there's no matching entry.
      *
-     * @param nodeName <code>QName</code> object specifying a node name
+     * @param nodeName <code>Name</code> object specifying a node name
      * @param index    1-based index if there are same-name child node entries
      * @return the <code>ChildNodeEntry</code> with the specified name and index
      *         or <code>null</code> if there's no matching entry.
      */
-    public synchronized ChildNodeEntry getChildNodeEntry(QName nodeName, int index) {
+    public synchronized ChildNodeEntry getChildNodeEntry(Name nodeName, int index) {
         return childNodeEntries.get(nodeName, index);
     }
 
@@ -352,18 +353,18 @@
      * @see #addChildNodeEntry
      * @see #removeChildNodeEntry
      */
-    public synchronized List getChildNodeEntries(QName nodeName) {
+    public synchronized List getChildNodeEntries(Name nodeName) {
         return childNodeEntries.get(nodeName);
     }
 
     /**
      * Adds a new <code>ChildNodeEntry</code>.
      *
-     * @param nodeName <code>QName</code> object specifying the name of the new entry.
+     * @param nodeName <code>Name</code> object specifying the name of the new entry.
      * @param id the id the new entry is refering to.
      * @return the newly added <code>ChildNodeEntry</code>
      */
-    public synchronized ChildNodeEntry addChildNodeEntry(QName nodeName,
+    public synchronized ChildNodeEntry addChildNodeEntry(Name nodeName,
                                                          NodeId id) {
         if (sharedChildNodeEntries) {
             childNodeEntries = (ChildNodeEntries) childNodeEntries.clone();
@@ -377,14 +378,14 @@
     /**
      * Renames a new <code>ChildNodeEntry</code>.
      *
-     * @param oldName <code>QName</code> object specifying the entry's old name
+     * @param oldName <code>Name</code> object specifying the entry's old name
      * @param index   1-based index if there are same-name child node entries
-     * @param newName <code>QName</code> object specifying the entry's new name
+     * @param newName <code>Name</code> object specifying the entry's new name
      * @return <code>true</code> if the entry was sucessfully renamed;
      *         otherwise <code>false</code>
      */
-    public synchronized boolean renameChildNodeEntry(QName oldName, int index,
-                                                     QName newName) {
+    public synchronized boolean renameChildNodeEntry(Name oldName, int index,
+                                                     Name newName) {
         if (sharedChildNodeEntries) {
             childNodeEntries = (ChildNodeEntries) childNodeEntries.clone();
             sharedChildNodeEntries = false;
@@ -408,7 +409,7 @@
      * @return <code>true</code> if the specified child node entry was found
      *         in the list of child node entries and could be removed.
      */
-    public synchronized boolean removeChildNodeEntry(QName nodeName, int index) {
+    public synchronized boolean removeChildNodeEntry(Name nodeName, int index) {
         if (sharedChildNodeEntries) {
             childNodeEntries = (ChildNodeEntries) childNodeEntries.clone();
             sharedChildNodeEntries = false;
@@ -488,9 +489,9 @@
     /**
      * Adds a property name entry.
      *
-     * @param propName <code>QName</code> object specifying the property name
+     * @param propName <code>Name</code> object specifying the property name
      */
-    public synchronized void addPropertyName(QName propName) {
+    public synchronized void addPropertyName(Name propName) {
         if (sharedPropertyNames) {
             propertyNames = (HashSet) propertyNames.clone();
             sharedPropertyNames = false;
@@ -501,11 +502,11 @@
     /**
      * Removes a property name entry.
      *
-     * @param propName <code>QName</code> object specifying the property name
+     * @param propName <code>Name</code> object specifying the property name
      * @return <code>true</code> if the specified property name was found
      *         in the list of property name entries and could be removed.
      */
-    public synchronized boolean removePropertyName(QName propName) {
+    public synchronized boolean removePropertyName(Name propName) {
         if (sharedPropertyNames) {
             propertyNames = (HashSet) propertyNames.clone();
             sharedPropertyNames = false;
@@ -526,7 +527,7 @@
     }
 
     /**
-     * Sets the set of <code>QName</code> objects denoting the
+     * Sets the set of <code>Name</code> objects denoting the
      * properties of this node.
      */
     public synchronized void setPropertyNames(Set propNames) {
@@ -551,17 +552,17 @@
      *
      * @param nodeTypeName node type name
      */
-    public synchronized void setNodeTypeName(QName nodeTypeName) {
+    public synchronized void setNodeTypeName(Name nodeTypeName) {
         this.nodeTypeName = nodeTypeName;
     }
 
     //---------------------------------------------------------< diff methods >
     /**
-     * Returns a set of <code>QName</code>s denoting those properties that
+     * Returns a set of <code>Name</code>s denoting those properties that
      * do not exist in the overlayed node state but have been added to
      * <i>this</i> node state.
      *
-     * @return set of <code>QName</code>s denoting the properties that have
+     * @return set of <code>Name</code>s denoting the properties that have
      *         been added.
      */
     public synchronized Set getAddedPropertyNames() {
@@ -591,11 +592,11 @@
     }
 
     /**
-     * Returns a set of <code>QName</code>s denoting those properties that
+     * Returns a set of <code>Name</code>s denoting those properties that
      * exist in the overlayed node state but have been removed from
      * <i>this</i> node state.
      *
-     * @return set of <code>QName</code>s denoting the properties that have
+     * @return set of <code>Name</code>s denoting the properties that have
      *         been removed.
      */
     public synchronized Set getRemovedPropertyNames() {
@@ -792,7 +793,7 @@
      */
     public long calculateMemoryFootprint() {
         /*
-        private QName nodeTypeName;
+        private Name nodeTypeName;
         private Set mixinTypeNames = Collections.EMPTY_SET;
         private NodeId id;
         private NodeId parentId;
@@ -802,9 +803,9 @@
         private HashSet propertyNames = new HashSet();
         private boolean sharedPropertyNames = false;
 
-        we assume an average QName localname of 30 chars.
+        we assume an average Name localname of 30 chars.
         NodeId = 8 + UUID(24) + hashcode(4) = 36
-        QName = 8 + hash(4) + string(38+2*len) + namespace(4) + localName(38+2*len) ~ 250
+        Name = 8 + hash(4) + string(38+2*len) + namespace(4) + localName(38+2*len) ~ 250
         NodeDefId = 8 + id(4) = 12
         ChildNodeEntries = 8 + n * (name(256) + index(4) + id(36) + hashentry(16)) ~ n*300
         PropNames = 8 + n * ( name(250))
@@ -878,7 +879,7 @@
             return (ChildNodeEntry) entries.get(id);
         }
 
-        List get(QName nodeName) {
+        List get(Name nodeName) {
             Object obj = nameMap.get(nodeName);
             if (obj == null) {
                 return Collections.EMPTY_LIST;
@@ -892,7 +893,7 @@
             }
         }
 
-        ChildNodeEntry get(QName nodeName, int index) {
+        ChildNodeEntry get(Name nodeName, int index) {
             if (index < 1) {
                 throw new IllegalArgumentException("index is 1-based");
             }
@@ -916,7 +917,7 @@
             return null;
         }
 
-        ChildNodeEntry add(QName nodeName, NodeId id) {
+        ChildNodeEntry add(Name nodeName, NodeId id) {
             List siblings = null;
             int index = 0;
             Object obj = nameMap.get(nodeName);
@@ -951,12 +952,12 @@
             Iterator iter = entriesList.iterator();
             while (iter.hasNext()) {
                 ChildNodeEntry entry = (ChildNodeEntry) iter.next();
-                // delegate to add(QName, String) to maintain consistency
+                // delegate to add(Name, String) to maintain consistency
                 add(entry.getName(), entry.getId());
             }
         }
 
-        public ChildNodeEntry remove(QName nodeName, int index) {
+        public ChildNodeEntry remove(Name nodeName, int index) {
             if (index < 1) {
                 throw new IllegalArgumentException("index is 1-based");
             }
@@ -1271,7 +1272,7 @@
             // written in writeObject(ObjectOutputStream)
             short count = in.readShort();   // count
             for (int i = 0; i < count; i++) {
-                QName name = QName.valueOf(in.readUTF());    // name
+                Name name = NameFactoryImpl.getInstance().create(in.readUTF());    // name
                 String s = in.readUTF();   // id
                 add(name, NodeId.valueOf(s));
             }
@@ -1359,11 +1360,11 @@
 
         private int hash = 0;
 
-        private final QName name;
+        private final Name name;
         private final int index; // 1-based index for same-name siblings
         private final NodeId id;
 
-        private ChildNodeEntry(QName name, NodeId id, int index) {
+        private ChildNodeEntry(Name name, NodeId id, int index) {
             if (name == null) {
                 throw new IllegalArgumentException("name can not be null");
             }
@@ -1384,7 +1385,7 @@
             return id;
         }
 
-        public QName getName() {
+        public Name getName() {
             return name;
         }
 
Index: src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java	(working copy)
@@ -18,7 +18,7 @@
 
 import EDU.oswego.cs.dl.util.concurrent.CopyOnWriteArrayList;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.util.Collection;
 import java.util.Iterator;
@@ -115,7 +115,7 @@
      * @param index index of new node
      * @param id    id of new node
      */
-    public void notifyNodeAdded(NodeState state, QName name, int index, NodeId id) {
+    public void notifyNodeAdded(NodeState state, Name name, int index, NodeId id) {
         Iterator iter = nsListeners.iterator();
         while (iter.hasNext()) {
             ((NodeStateListener) iter.next()).nodeAdded(state, name, index, id);
@@ -151,7 +151,7 @@
      * @param index index of new node
      * @param id    id of new node
      */
-    public void notifyNodeRemoved(NodeState state, QName name, int index, NodeId id) {
+    public void notifyNodeRemoved(NodeState state, Name name, int index, NodeId id) {
         Iterator iter = nsListeners.iterator();
         while (iter.hasNext()) {
             ((NodeStateListener) iter.next()).nodeRemoved(state, name, index, id);
Index: src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java	(working copy)
@@ -24,8 +24,8 @@
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.ZombieHierarchyManager;
 import org.apache.jackrabbit.core.util.Dumpable;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -234,14 +234,14 @@
     /**
      * {@inheritDoc}
      */
-    public NodeState createNew(NodeId id, QName nodeTypeName,
+    public NodeState createNew(NodeId id, Name nodeTypeName,
                                NodeId parentId)
             throws IllegalStateException {
         return stateMgr.createNew(id, nodeTypeName, parentId);
     }
 
     /**
-     * Customized variant of {@link #createNew(NodeId, QName, NodeId)} that
+     * Customized variant of {@link #createNew(NodeId, Name, NodeId)} that
      * connects the newly created persistent state with the transient state.
      */
     public NodeState createNew(NodeState transientState)
@@ -257,13 +257,13 @@
     /**
      * {@inheritDoc}
      */
-    public PropertyState createNew(QName propName, NodeId parentId)
+    public PropertyState createNew(Name propName, NodeId parentId)
             throws IllegalStateException {
         return stateMgr.createNew(propName, parentId);
     }
 
     /**
-     * Customized variant of {@link #createNew(QName, NodeId)} that
+     * Customized variant of {@link #createNew(Name, NodeId)} that
      * connects the newly created persistent state with the transient state.
      */
     public PropertyState createNew(PropertyState transientState)
@@ -553,7 +553,7 @@
      * @return
      * @throws ItemStateException
      */
-    public NodeState createTransientNodeState(NodeId id, QName nodeTypeName, NodeId parentId, int initialStatus)
+    public NodeState createTransientNodeState(NodeId id, Name nodeTypeName, NodeId parentId, int initialStatus)
             throws ItemStateException {
 
         // check map; synchronized to ensure an entry is not created twice.
@@ -607,7 +607,7 @@
      * @return
      * @throws ItemStateException
      */
-    public PropertyState createTransientPropertyState(NodeId parentId, QName propName, int initialStatus)
+    public PropertyState createTransientPropertyState(NodeId parentId, Name propName, int initialStatus)
             throws ItemStateException {
 
         PropertyId id = new PropertyId(parentId, propName);
@@ -875,7 +875,7 @@
      * Pass notification to listeners if a transient state was modified
      * or if the local state is not overlayed.
      */
-    public void nodeAdded(NodeState state, QName name, int index, NodeId id) {
+    public void nodeAdded(NodeState state, Name name, int index, NodeId id) {
         if (state.getContainer() == this || !transientStore.contains(state.getId())) {
             dispatcher.notifyNodeAdded(state, name, index, id);
         }
@@ -911,7 +911,7 @@
      * Pass notification to listeners if a transient state was modified
      * or if the local state is not overlayed.
      */
-    public void nodeRemoved(NodeState state, QName name, int index, NodeId id) {
+    public void nodeRemoved(NodeState state, Name name, int index, NodeId id) {
         if (state.getContainer() == this || !transientStore.contains(state.getId())) {
             dispatcher.notifyNodeRemoved(state, name, index, id);
         }
Index: src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(working copy)
@@ -61,8 +61,8 @@
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.version.VersionManager;
 import org.apache.jackrabbit.core.version.VersionManagerImpl;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
@@ -613,7 +613,7 @@
                 obsMgr.addEventListener(systemSearchMgr, Event.NODE_ADDED
                         | Event.NODE_REMOVED | Event.PROPERTY_ADDED
                         | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED,
-                        "/" + defSysSession.getJCRName(QName.JCR_SYSTEM),
+                        "/" + defSysSession.getJCRName(NameConstants.JCR_SYSTEM),
                         true, null, null, false);
             }
         }
Index: src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java	(working copy)
@@ -42,9 +42,11 @@
 import org.apache.jackrabbit.core.state.SharedItemStateManager;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.conversion.MalformedPathException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,10 +79,10 @@
 
     static {
         try {
-            Path.PathBuilder builder = new Path.PathBuilder();
+            PathBuilder builder = new PathBuilder();
             builder.addRoot();
-            builder.addLast(QName.JCR_SYSTEM);
-            builder.addLast(QName.JCR_VERSIONSTORAGE);
+            builder.addLast(NameConstants.JCR_SYSTEM);
+            builder.addLast(NameConstants.JCR_VERSIONSTORAGE);
             VERSION_STORAGE_PATH = builder.getPath();
         } catch (MalformedPathException e) {
             // will not happen. path is always valid
@@ -142,15 +144,15 @@
             if (!pMgr.exists(rootId)) {
                 NodeState root = pMgr.createNew(rootId);
                 root.setParentId(rootParentId);
-                root.setDefinitionId(ntReg.getEffectiveNodeType(QName.REP_SYSTEM).getApplicableChildNodeDef(
-                        QName.JCR_VERSIONSTORAGE, QName.REP_VERSIONSTORAGE, ntReg).getId());
-                root.setNodeTypeName(QName.REP_VERSIONSTORAGE);
-                PropertyState pt = pMgr.createNew(new PropertyId(rootId, QName.JCR_PRIMARYTYPE));
-                pt.setDefinitionId(ntReg.getEffectiveNodeType(QName.REP_SYSTEM).getApplicablePropertyDef(
-                        QName.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId());
+                root.setDefinitionId(ntReg.getEffectiveNodeType(NameConstants.REP_SYSTEM).getApplicableChildNodeDef(
+                        NameConstants.JCR_VERSIONSTORAGE, NameConstants.REP_VERSIONSTORAGE, ntReg).getId());
+                root.setNodeTypeName(NameConstants.REP_VERSIONSTORAGE);
+                PropertyState pt = pMgr.createNew(new PropertyId(rootId, NameConstants.JCR_PRIMARYTYPE));
+                pt.setDefinitionId(ntReg.getEffectiveNodeType(NameConstants.REP_SYSTEM).getApplicablePropertyDef(
+                        NameConstants.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId());
                 pt.setMultiValued(false);
                 pt.setType(PropertyType.NAME);
-                pt.setValues(new InternalValue[]{InternalValue.create(QName.REP_VERSIONSTORAGE)});
+                pt.setValues(new InternalValue[]{InternalValue.create(NameConstants.REP_VERSIONSTORAGE)});
                 root.addPropertyName(pt.getName());
                 ChangeLog cl = new ChangeLog();
                 cl.added(root);
@@ -163,7 +165,7 @@
             stateMgr.addListener(this);
 
             NodeState nodeState = (NodeState) stateMgr.getItemState(rootId);
-            historyRoot = new NodeStateEx(stateMgr, ntReg, nodeState, QName.JCR_VERSIONSTORAGE);
+            historyRoot = new NodeStateEx(stateMgr, ntReg, nodeState, NameConstants.JCR_VERSIONSTORAGE);
 
             // create the virtual item state provider
             versProvider = new VersionItemStateProvider(
@@ -249,14 +251,14 @@
                         NodeStateEx pNode = new NodeStateEx(stateMgr, ntReg, state, null);
                         NodeId parentId = pNode.getParentId();
                         InternalVersionItem parent = getItem(parentId);
-                        QName ntName = state.getNodeTypeName();
-                        if (ntName.equals(QName.NT_FROZENNODE)) {
+                        Name ntName = state.getNodeTypeName();
+                        if (ntName.equals(NameConstants.NT_FROZENNODE)) {
                             item = new InternalFrozenNodeImpl(this, pNode, parent);
-                        } else if (ntName.equals(QName.NT_VERSIONEDCHILD)) {
+                        } else if (ntName.equals(NameConstants.NT_VERSIONEDCHILD)) {
                             item = new InternalFrozenVHImpl(this, pNode, parent);
-                        } else if (ntName.equals(QName.NT_VERSION)) {
+                        } else if (ntName.equals(NameConstants.NT_VERSION)) {
                             item = ((InternalVersionHistory) parent).getVersion(id);
-                        } else if (ntName.equals(QName.NT_VERSIONHISTORY)) {
+                        } else if (ntName.equals(NameConstants.NT_VERSIONHISTORY)) {
                             item = new InternalVersionHistoryImpl(this, pNode);
                         } else {
                             return null;
@@ -285,7 +287,7 @@
         InternalVersion version = (InternalVersion)
                 escFactory.doSourced((SessionImpl) node.getSession(), new SourcedTarget(){
             public Object run() throws RepositoryException {
-                String histUUID = node.getProperty(QName.JCR_VERSIONHISTORY).getString();
+                String histUUID = node.getProperty(NameConstants.JCR_VERSIONHISTORY).getString();
                 return checkin((InternalVersionHistoryImpl)
                         getVersionHistory(NodeId.valueOf(histUUID)), node);
             }
@@ -301,7 +303,7 @@
      * This method must not be synchronized since it could cause deadlocks with
      * item-reading listeners in the observation thread.
      */
-    public void removeVersion(VersionHistory history, final QName name)
+    public void removeVersion(VersionHistory history, final Name name)
             throws VersionException, RepositoryException {
 
         final VersionHistoryImpl historyImpl = (VersionHistoryImpl) history;
@@ -327,7 +329,7 @@
      * item-reading listeners in the observation thread.
      */
     public Version setVersionLabel(final VersionHistory history,
-                                   final QName version, final QName label,
+                                   final Name version, final Name label,
                                    final boolean move)
             throws RepositoryException {
 
Index: src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java	(working copy)
@@ -24,8 +24,10 @@
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.LocalItemStateManager;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -300,14 +302,14 @@
             String uuid = node.getNodeId().getUUID().toString();
             NodeStateEx root = historyRoot;
             for (int i = 0; i < 3; i++) {
-                QName name = new QName(QName.NS_DEFAULT_URI, uuid.substring(i * 2, i * 2 + 2));
+                Name name = NameFactoryImpl.getInstance().create(Name.NS_DEFAULT_URI, uuid.substring(i * 2, i * 2 + 2));
                 if (!root.hasNode(name)) {
-                    root.addNode(name, QName.REP_VERSIONSTORAGE, null, false);
+                    root.addNode(name, NameConstants.REP_VERSIONSTORAGE, null, false);
                     root.store();
                 }
                 root = root.getNode(name, 1);
             }
-            QName historyNodeName = new QName(QName.NS_DEFAULT_URI, uuid);
+            Name historyNodeName = NameFactoryImpl.getInstance().create(Name.NS_DEFAULT_URI, uuid);
             if (root.hasNode(historyNodeName)) {
                 // already exists
                 return null;
@@ -345,13 +347,13 @@
         String uuid = node.getNodeId().getUUID().toString();
         NodeStateEx n = historyRoot;
         for (int i = 0; i < 3; i++) {
-            QName name = new QName(QName.NS_DEFAULT_URI, uuid.substring(i * 2, i * 2 + 2));
+            Name name = NameFactoryImpl.getInstance().create(Name.NS_DEFAULT_URI, uuid.substring(i * 2, i * 2 + 2));
             if (!n.hasNode(name)) {
                 return null;
             }
             n = n.getNode(name, 1);
         }
-        QName historyNodeName = new QName(QName.NS_DEFAULT_URI, uuid);
+        Name historyNodeName = NameFactoryImpl.getInstance().create(Name.NS_DEFAULT_URI, uuid);
         if (!n.hasNode(historyNodeName)) {
             return null;
         }
@@ -372,7 +374,7 @@
         WriteOperation operation = startWriteOperation();
         try {
             String versionName = calculateCheckinVersionName(history, node);
-            InternalVersionImpl v = history.checkin(new QName("", versionName), node);
+            InternalVersionImpl v = history.checkin(NameFactoryImpl.getInstance().create("", versionName), node);
             operation.save();
             return v;
         } catch (ItemStateException e) {
@@ -427,7 +429,7 @@
                                                  NodeImpl node)
             throws RepositoryException {
         // 1. search a predecessor, suitable for generating the new name
-        Value[] values = node.getProperty(QName.JCR_PREDECESSORS).getValues();
+        Value[] values = node.getProperty(NameConstants.JCR_PREDECESSORS).getValues();
         InternalVersion best = null;
         for (int i = 0; i < values.length; i++) {
             InternalVersion pred = history.getVersion(NodeId.valueOf(values[i].getString()));
@@ -442,7 +444,7 @@
         if (pos > 0) {
             String newVersionName = versionName.substring(0, pos + 1)
                 + (Integer.parseInt(versionName.substring(pos + 1)) + 1);
-            while (history.hasVersion(new QName("", newVersionName))) {
+            while (history.hasVersion(NameFactoryImpl.getInstance().create("", newVersionName))) {
                 versionName += ".0";
                 newVersionName = versionName;
             }
@@ -462,7 +464,7 @@
      *  not have a version with <code>name</code>.
      * @throws javax.jcr.RepositoryException if any other error occurs.
      */
-    protected void removeVersion(InternalVersionHistoryImpl history, QName name)
+    protected void removeVersion(InternalVersionHistoryImpl history, Name name)
             throws VersionException, RepositoryException {
         WriteOperation operation = startWriteOperation();
         try {
@@ -485,7 +487,7 @@
      * @throws RepositoryException if an error occurs
      */
     protected InternalVersion setVersionLabel(InternalVersionHistoryImpl history,
-                                              QName version, QName label,
+                                              Name version, Name label,
                                               boolean move)
             throws RepositoryException {
         WriteOperation operation = startWriteOperation();
Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistory.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistory.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistory.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.version;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.uuid.UUID;
 
@@ -40,7 +40,7 @@
      *
      * @see javax.jcr.version.VersionHistory#getVersion(java.lang.String)
      */
-    InternalVersion getVersion(QName versionName) throws VersionException;
+    InternalVersion getVersion(Name versionName) throws VersionException;
 
     /**
      * Checks if the version with the given name exists in this version history.
@@ -49,7 +49,7 @@
      * @return <code>true</code> if the version exists;
      *         <code>false</code> otherwise.
      */
-    boolean hasVersion(QName versionName);
+    boolean hasVersion(Name versionName);
 
     /**
      * Checks if the version for the given uuid exists in this history.
@@ -75,7 +75,7 @@
      *
      * @see javax.jcr.version.VersionHistory#getVersionByLabel(java.lang.String)
      */
-    InternalVersion getVersionByLabel(QName label);
+    InternalVersion getVersionByLabel(Name label);
 
     /**
      * Returns an iterator over all versions (not ordered yet), including the
@@ -105,7 +105,7 @@
      *
      * @return the labels
      */
-    QName[] getVersionLabels();
+    Name[] getVersionLabels();
 
     /**
      * Returns the Id of the version labels node.
Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java	(working copy)
@@ -19,7 +19,8 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -53,7 +54,7 @@
     /**
      * the version name
      */
-    private final QName name;
+    private final Name name;
 
     /**
      * the version history
@@ -67,17 +68,17 @@
      *
      * @param node
      */
-    public InternalVersionImpl(InternalVersionHistoryImpl vh, NodeStateEx node, QName name) {
+    public InternalVersionImpl(InternalVersionHistoryImpl vh, NodeStateEx node, Name name) {
         super(vh.getVersionManager(), node);
         this.versionHistory = vh;
         this.name = name;
 
         // init internal values
-        InternalValue[] values = node.getPropertyValues(QName.JCR_CREATED);
+        InternalValue[] values = node.getPropertyValues(NameConstants.JCR_CREATED);
         if (values != null) {
             created = values[0].getDate();
         }
-        isRoot = name.equals(QName.JCR_ROOTVERSION);
+        isRoot = name.equals(NameConstants.JCR_ROOTVERSION);
     }
 
     /**
@@ -97,7 +98,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getName() {
+    public Name getName() {
         return name;
     }
 
@@ -107,7 +108,7 @@
     public InternalFrozenNode getFrozenNode() {
         // get frozen node
         try {
-            NodeState.ChildNodeEntry entry = node.getState().getChildNodeEntry(QName.JCR_FROZENNODE, 1);
+            NodeState.ChildNodeEntry entry = node.getState().getChildNodeEntry(NameConstants.JCR_FROZENNODE, 1);
             if (entry == null) {
                 throw new InternalError("version has no frozen node: " + getId());
             }
@@ -130,7 +131,7 @@
     public InternalVersion[] getSuccessors() {
         vMgr.acquireReadLock();
         try {
-            InternalValue[] values = node.getPropertyValues(QName.JCR_SUCCESSORS);
+            InternalValue[] values = node.getPropertyValues(NameConstants.JCR_SUCCESSORS);
             if (values != null) {
                 InternalVersion[] versions = new InternalVersion[values.length];
                 for (int i = 0; i < values.length; i++) {
@@ -150,7 +151,7 @@
      * {@inheritDoc}
      */
     public InternalVersion[] getPredecessors() {
-        InternalValue[] values = node.getPropertyValues(QName.JCR_PREDECESSORS);
+        InternalValue[] values = node.getPropertyValues(NameConstants.JCR_PREDECESSORS);
         if (values != null) {
             InternalVersion[] versions = new InternalVersion[values.length];
             for (int i = 0; i < values.length; i++) {
@@ -187,14 +188,14 @@
     /**
      * {@inheritDoc}
      */
-    public boolean hasLabel(QName label) {
+    public boolean hasLabel(Name label) {
         return internalHasLabel(label);
     }
 
     /**
      * {@inheritDoc}
      */
-    public QName[] getLabels() {
+    public Name[] getLabels() {
         return internalGetLabels();
     }
 
@@ -217,7 +218,7 @@
      *
      * @throws RepositoryException
      */
-    private void storeXCessors(List cessors, QName propname, boolean store)
+    private void storeXCessors(List cessors, Name propname, boolean store)
             throws RepositoryException {
         InternalValue[] values = new InternalValue[cessors.size()];
         for (int i = 0; i < values.length; i++) {
@@ -277,7 +278,7 @@
         List l = new ArrayList(Arrays.asList(getSuccessors()));
         if (!l.contains(succ)) {
             l.add(succ);
-            storeXCessors(l, QName.JCR_SUCCESSORS, store);
+            storeXCessors(l, NameConstants.JCR_SUCCESSORS, store);
         }
     }
 
@@ -297,7 +298,7 @@
 
         // attach v's predecessors
         l.addAll(Arrays.asList(v.getPredecessors()));
-        storeXCessors(l, QName.JCR_PREDECESSORS, store);
+        storeXCessors(l, NameConstants.JCR_PREDECESSORS, store);
     }
 
     /**
@@ -316,7 +317,7 @@
 
         // attach v's successors
         l.addAll(Arrays.asList(v.getSuccessors()));
-        storeXCessors(l, QName.JCR_SUCCESSORS, store);
+        storeXCessors(l, NameConstants.JCR_SUCCESSORS, store);
     }
 
     /**
@@ -325,7 +326,7 @@
      * @param label
      * @return <code>true</code> if the label was added
      */
-    boolean internalAddLabel(QName label) {
+    boolean internalAddLabel(Name label) {
         if (labelCache == null) {
             labelCache = new HashSet();
         }
@@ -338,7 +339,7 @@
      * @param label
      * @return <code>true</code> if the label was removed
      */
-    boolean internalRemoveLabel(QName label) {
+    boolean internalRemoveLabel(Name label) {
         if (labelCache == null) {
             return false;
         } else {
@@ -352,7 +353,7 @@
      * @param label
      * @return <code>true</code> if the label exists
      */
-    boolean internalHasLabel(QName label) {
+    boolean internalHasLabel(Name label) {
         if (labelCache == null) {
             return false;
         } else {
@@ -365,11 +366,11 @@
      *
      * @return the internal labels
      */
-    QName[] internalGetLabels() {
+    Name[] internalGetLabels() {
         if (labelCache == null) {
-            return new QName[0];
+            return new Name[0];
         } else {
-            return (QName[]) labelCache.toArray(new QName[labelCache.size()]);
+            return (Name[]) labelCache.toArray(new Name[labelCache.size()]);
         }
     }
 
@@ -386,7 +387,7 @@
      * @throws RepositoryException
      */
     void legacyResolveSuccessors() throws RepositoryException {
-        InternalValue[] values = node.getPropertyValues(QName.JCR_PREDECESSORS);
+        InternalValue[] values = node.getPropertyValues(NameConstants.JCR_PREDECESSORS);
         if (values != null) {
             for (int i = 0; i < values.length; i++) {
                 NodeId vId = new NodeId(values[i].getUUID());
Index: src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNode.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNode.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNode.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.version;
 
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 
 import javax.jcr.version.VersionException;
@@ -57,14 +57,14 @@
      *
      * @return the name of the frozen primary type.
      */
-    QName getFrozenPrimaryType();
+    Name getFrozenPrimaryType();
 
     /**
      * Returns the list of names of the frozen mixin types.
      *
      * @return the list of names of the frozen mixin types.
      */
-    QName[] getFrozenMixinTypes();
+    Name[] getFrozenMixinTypes();
 
     /**
      * Checks if this frozen node has the frozen version history
Index: src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java	(working copy)
@@ -39,7 +39,8 @@
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
 import org.apache.jackrabbit.core.virtual.VirtualNodeState;
 import org.apache.jackrabbit.core.virtual.VirtualPropertyState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -112,7 +113,7 @@
         } catch (ItemStateException e) {
             throw new RepositoryException("Unable to retrieve history root", e);
         }
-        this.historyRoot = new NodeStateEx(stateMgr, ntReg, state, QName.JCR_VERSIONSTORAGE);
+        this.historyRoot = new NodeStateEx(stateMgr, ntReg, state, NameConstants.JCR_VERSIONSTORAGE);
     }
 
     //------------------------------------------< EventStateCollectionFactory >
@@ -153,7 +154,7 @@
      */
     public Version checkin(NodeImpl node) throws RepositoryException {
         if (isInXA()) {
-            String histUUID = node.getProperty(QName.JCR_VERSIONHISTORY).getString();
+            String histUUID = node.getProperty(NameConstants.JCR_VERSIONHISTORY).getString();
             InternalVersion version = checkin((InternalVersionHistoryImpl)
                     getVersionHistory(NodeId.valueOf(histUUID)), node);
             return (Version) ((SessionImpl) node.getSession()).getNodeById(version.getId());
@@ -164,7 +165,7 @@
     /**
      * {@inheritDoc}
      */
-    public void removeVersion(VersionHistory history, QName versionName)
+    public void removeVersion(VersionHistory history, Name versionName)
             throws RepositoryException {
 
         if (isInXA()) {
@@ -179,8 +180,8 @@
     /**
      * {@inheritDoc}
      */
-    public Version setVersionLabel(VersionHistory history, QName version,
-                                   QName label, boolean move)
+    public Version setVersionLabel(VersionHistory history, Name version,
+                                   Name label, boolean move)
             throws RepositoryException {
 
         if (isInXA()) {
@@ -223,7 +224,7 @@
      * {@inheritDoc}
      */
     public VirtualPropertyState createPropertyState(VirtualNodeState parent,
-                                                    QName name, int type,
+                                                    Name name, int type,
                                                     boolean multiValued)
             throws RepositoryException {
 
@@ -233,8 +234,8 @@
     /**
      * {@inheritDoc}
      */
-    public VirtualNodeState createNodeState(VirtualNodeState parent, QName name,
-                                            NodeId id, QName nodeTypeName)
+    public VirtualNodeState createNodeState(VirtualNodeState parent, Name name,
+                                            NodeId id, Name nodeTypeName)
             throws RepositoryException {
 
         throw new IllegalStateException("Read-only");
@@ -373,7 +374,7 @@
      * <p/>
      * Before modifying version history given, make a local copy of it.
      */
-    protected void removeVersion(InternalVersionHistoryImpl history, QName name)
+    protected void removeVersion(InternalVersionHistoryImpl history, Name name)
             throws VersionException, RepositoryException {
 
         if (history.getVersionManager() != this) {
@@ -399,7 +400,7 @@
      * Before modifying version history given, make a local copy of it.
      */
     protected InternalVersion setVersionLabel(InternalVersionHistoryImpl history,
-                                              QName version, QName label,
+                                              Name version, Name label,
                                               boolean move)
             throws RepositoryException {
 
Index: src/main/java/org/apache/jackrabbit/core/version/InternalFreeze.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalFreeze.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalFreeze.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.version;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * the base interface for nodes that were versioned and turned either into
@@ -29,6 +29,6 @@
      *
      * @return the name of the node.
      */
-    QName getName();
+    Name getName();
 
 }
Index: src/main/java/org/apache/jackrabbit/core/version/VersionManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/VersionManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/VersionManager.java	(working copy)
@@ -20,7 +20,7 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -86,7 +86,7 @@
      * @param versionName
      * @throws RepositoryException
      */
-    void removeVersion(VersionHistory history, QName versionName)
+    void removeVersion(VersionHistory history, Name versionName)
             throws RepositoryException;
 
     /**
@@ -104,7 +104,7 @@
      * @return
      * @throws RepositoryException
      */
-    Version setVersionLabel(VersionHistory history, QName version, QName label,
+    Version setVersionLabel(VersionHistory history, Name version, Name label,
                             boolean move)
             throws RepositoryException;
 
Index: src/main/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java	(working copy)
@@ -28,7 +28,7 @@
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
 import org.apache.jackrabbit.core.virtual.VirtualNodeState;
 import org.apache.jackrabbit.core.virtual.VirtualPropertyState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.RepositoryException;
 
@@ -84,7 +84,7 @@
      * @inheritDoc
      */
     public VirtualPropertyState createPropertyState(VirtualNodeState parent,
-                                                    QName name, int type,
+                                                    Name name, int type,
                                                     boolean multiValued)
             throws RepositoryException {
         throw new IllegalStateException("VersionManager should never create a VirtualPropertyState");
@@ -93,8 +93,8 @@
     /**
      * @inheritDoc
      */
-    public VirtualNodeState createNodeState(VirtualNodeState parent, QName name,
-                                            NodeId id, QName nodeTypeName)
+    public VirtualNodeState createNodeState(VirtualNodeState parent, Name name,
+                                            NodeId id, Name nodeTypeName)
             throws RepositoryException {
         throw new IllegalStateException("VersionManager should never create a VirtualNodeState");
     }
Index: src/main/java/org/apache/jackrabbit/core/version/InternalFrozenVHImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalFrozenVHImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalFrozenVHImpl.java	(working copy)
@@ -16,8 +16,9 @@
  */
 package org.apache.jackrabbit.core.version;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.version.VersionException;
@@ -42,7 +43,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getName() {
+    public Name getName() {
         return node.getName();
     }
 
@@ -57,7 +58,7 @@
      * {@inheritDoc}
      */
     public NodeId getVersionHistoryId() {
-        return new NodeId(node.getPropertyValue(QName.JCR_CHILDVERSIONHISTORY).getUUID());
+        return new NodeId(node.getPropertyValue(NameConstants.JCR_CHILDVERSIONHISTORY).getUUID());
     }
 
     /**
@@ -76,7 +77,7 @@
      * {@inheritDoc}
      */
     public NodeId getBaseVersionId() {
-        return new NodeId(node.getPropertyValue(QName.JCR_BASEVERSION).getUUID());
+        return new NodeId(node.getPropertyValue(NameConstants.JCR_BASEVERSION).getUUID());
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.version;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.version.Version;
 import java.util.Calendar;
@@ -31,7 +31,7 @@
      *
      * @return the name of this version.
      */
-    QName getName();
+    Name getName();
 
     /**
      * Returns the frozen node of this version or <code>null</code> if this is
@@ -95,12 +95,12 @@
      * @return <code>true</code> if the label is assigned to this version;
      *         <code>false</code> otherwise.
      */
-    boolean hasLabel(QName label);
+    boolean hasLabel(Name label);
 
     /**
      * returns the labels that are assigned to this version
      *
      * @return a string array of labels.
      */
-    QName[] getLabels();
+    Name[] getLabels();
 }
Index: src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java	(working copy)
@@ -30,8 +30,9 @@
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.state.UpdatableItemStateManager;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
 
 import java.util.HashSet;
 import java.util.Iterator;
@@ -65,7 +66,7 @@
     /**
      * the cached name
      */
-    private QName name;
+    private Name name;
 
     /**
      * Creates a new persistent node
@@ -75,7 +76,7 @@
      */
     public NodeStateEx(UpdatableItemStateManager stateMgr,
                        NodeTypeRegistry ntReg,
-                       NodeState nodeState, QName name) {
+                       NodeState nodeState, Name name) {
         this.nodeState = nodeState;
         this.ntReg = ntReg;
         this.stateMgr = stateMgr;
@@ -88,7 +89,7 @@
      *
      * @return the name of this node
      */
-    public QName getName() {
+    public Name getName() {
         if (name == null) {
             try {
                 NodeId parentId = nodeState.getParentId();
@@ -138,7 +139,7 @@
         PropertyState[] props = new PropertyState[set.size()];
         int i = 0;
         for (Iterator iter = set.iterator(); iter.hasNext();) {
-            QName propName = (QName) iter.next();
+            Name propName = (Name) iter.next();
             PropertyId propId = new PropertyId(nodeState.getNodeId(), propName);
             props[i++] = (PropertyState) stateMgr.getItemState(propId);
         }
@@ -151,7 +152,7 @@
      * @param name
      * @return <code>true</code> if the given property exists.
      */
-    public boolean hasProperty(QName name) {
+    public boolean hasProperty(Name name) {
         PropertyId propId = new PropertyId(nodeState.getNodeId(), name);
         return stateMgr.hasItemState(propId);
     }
@@ -162,7 +163,7 @@
      * @param name
      * @return the values of the given property.
      */
-    public InternalValue[] getPropertyValues(QName name) {
+    public InternalValue[] getPropertyValues(Name name) {
         PropertyId propId = new PropertyId(nodeState.getNodeId(), name);
         try {
             PropertyState ps = (PropertyState) stateMgr.getItemState(propId);
@@ -178,7 +179,7 @@
      * @param name
      * @return the value of the given property.
      */
-    public InternalValue getPropertyValue(QName name) {
+    public InternalValue getPropertyValue(Name name) {
         PropertyId propId = new PropertyId(nodeState.getNodeId(), name);
         try {
             PropertyState ps = (PropertyState) stateMgr.getItemState(propId);
@@ -195,7 +196,7 @@
      * @param value
      * @throws RepositoryException
      */
-    public void setPropertyValue(QName name, InternalValue value)
+    public void setPropertyValue(Name name, InternalValue value)
             throws RepositoryException {
         setPropertyValues(name, value.getType(), new InternalValue[]{value}, false);
     }
@@ -208,7 +209,7 @@
      * @param values
      * @throws RepositoryException
      */
-    public void setPropertyValues(QName name, int type, InternalValue[] values)
+    public void setPropertyValues(Name name, int type, InternalValue[] values)
             throws RepositoryException {
         setPropertyValues(name, type, values, true);
     }
@@ -221,7 +222,7 @@
      * @param values
      * @throws RepositoryException
      */
-    public void setPropertyValues(QName name, int type, InternalValue[] values, boolean multiple)
+    public void setPropertyValues(Name name, int type, InternalValue[] values, boolean multiple)
             throws RepositoryException {
 
         PropertyState prop = getOrCreatePropertyState(name, type, multiple);
@@ -238,7 +239,7 @@
      * @return the property state
      * @throws RepositoryException
      */
-    private PropertyState getOrCreatePropertyState(QName name, int type, boolean multiValued)
+    private PropertyState getOrCreatePropertyState(Name name, int type, boolean multiValued)
             throws RepositoryException {
 
         PropertyId propId = new PropertyId(nodeState.getNodeId(), name);
@@ -289,7 +290,7 @@
         // primary type
         set.add(nodeState.getNodeTypeName());
         try {
-            return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
+            return ntReg.getEffectiveNodeType((Name[]) set.toArray(new Name[set.size()]));
         } catch (NodeTypeConflictException ntce) {
             String msg = "internal error: failed to build effective node type for node " + nodeState.getNodeId();
             throw new RepositoryException(msg, ntce);
@@ -302,7 +303,7 @@
      * @param name
      * @return <code>true</code> if the given child exists.
      */
-    public boolean hasNode(QName name) {
+    public boolean hasNode(Name name) {
         return nodeState.hasChildNodeEntry(name);
     }
 
@@ -313,7 +314,7 @@
      * @return <code>true</code> if the child was removed
      * @throws RepositoryException
      */
-    public boolean removeNode(QName name) throws RepositoryException {
+    public boolean removeNode(Name name) throws RepositoryException {
         return removeNode(name, 1);
     }
 
@@ -325,7 +326,7 @@
      * @return <code>true</code> if the child was removed.
      * @throws RepositoryException
      */
-    public boolean removeNode(QName name, int index) throws RepositoryException {
+    public boolean removeNode(Name name, int index) throws RepositoryException {
         try {
             NodeState.ChildNodeEntry entry = nodeState.getChildNodeEntry(name, index);
             if (entry == null) {
@@ -353,7 +354,7 @@
         // remove properties
         Iterator iter = state.getPropertyNames().iterator();
         while (iter.hasNext()) {
-            QName name = (QName) iter.next();
+            Name name = (Name) iter.next();
             PropertyId propId = new PropertyId(id, name);
             PropertyState propState = (PropertyState) stateMgr.getItemState(propId);
             stateMgr.destroy(propState);
@@ -379,7 +380,7 @@
      * @return <code>true</code> if the property was removed.
      * @throws RepositoryException
      */
-    public boolean removeProperty(QName name) throws RepositoryException {
+    public boolean removeProperty(Name name) throws RepositoryException {
         try {
             if (!nodeState.hasPropertyName(name)) {
                 return false;
@@ -405,7 +406,7 @@
      * @return the node state.
      * @throws RepositoryException
      */
-    public NodeStateEx getNode(QName name, int index) throws RepositoryException {
+    public NodeStateEx getNode(Name name, int index) throws RepositoryException {
         NodeState.ChildNodeEntry entry = nodeState.getChildNodeEntry(name, index);
         if (entry == null) {
             return null;
@@ -428,13 +429,13 @@
      * @throws ConstraintViolationException
      * @throws RepositoryException
      */
-    public NodeStateEx addNode(QName nodeName, QName nodeTypeName,
+    public NodeStateEx addNode(Name nodeName, Name nodeTypeName,
                                NodeId id, boolean referenceable)
             throws NoSuchNodeTypeException, ConstraintViolationException, RepositoryException {
 
         NodeStateEx node = createChildNode(nodeName, nodeTypeName, id);
         if (referenceable) {
-            node.setPropertyValue(QName.JCR_UUID, InternalValue.create(node.getNodeId().getUUID().toString()));
+            node.setPropertyValue(NameConstants.JCR_UUID, InternalValue.create(node.getNodeId().getUUID().toString()));
         }
         return node;
     }
@@ -446,7 +447,7 @@
      * @param id
      * @return the newly created node.
      */
-    private NodeStateEx createChildNode(QName name, QName nodeTypeName, NodeId id)
+    private NodeStateEx createChildNode(Name name, Name nodeTypeName, NodeId id)
             throws RepositoryException {
         NodeId parentId = nodeState.getNodeId();
         // create a new node state
@@ -461,7 +462,7 @@
 
         // create Node instance wrapping new node state
         NodeStateEx node = new NodeStateEx(stateMgr, ntReg, state, name);
-        node.setPropertyValue(QName.JCR_PRIMARYTYPE, InternalValue.create(nodeTypeName));
+        node.setPropertyValue(NameConstants.JCR_PRIMARYTYPE, InternalValue.create(nodeTypeName));
 
         // add new child node entryn
         nodeState.addChildNodeEntry(name, id);
@@ -518,7 +519,7 @@
             // first store all transient properties
             Set props = state.getPropertyNames();
             for (Iterator iter = props.iterator(); iter.hasNext();) {
-                QName propName = (QName) iter.next();
+                Name propName = (Name) iter.next();
                 PropertyState pstate = (PropertyState) stateMgr.getItemState(
                         new PropertyId(state.getNodeId(), propName));
                 if (pstate.getStatus() != ItemState.STATUS_EXISTING) {
@@ -563,7 +564,7 @@
             // first discard all all transient properties
             Set props = state.getPropertyNames();
             for (Iterator iter = props.iterator(); iter.hasNext();) {
-                QName propName = (QName) iter.next();
+                Name propName = (Name) iter.next();
                 PropertyState pstate = (PropertyState) stateMgr.getItemState(
                         new PropertyId(state.getNodeId(), propName));
                 if (pstate.getStatus() != ItemState.STATUS_EXISTING) {
Index: src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java	(working copy)
@@ -22,8 +22,9 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -110,13 +111,13 @@
         historyId = node.getNodeId();
 
         // get versionable id
-        versionableId = NodeId.valueOf(node.getPropertyValue(QName.JCR_VERSIONABLEUUID).toString());
+        versionableId = NodeId.valueOf(node.getPropertyValue(NameConstants.JCR_VERSIONABLEUUID).toString());
 
         // get entries
         NodeStateEx[] children = node.getChildNodes();
         for (int i = 0; i < children.length; i++) {
             NodeStateEx child = children[i];
-            if (child.getName().equals(QName.JCR_VERSIONLABELS)) {
+            if (child.getName().equals(NameConstants.JCR_VERSIONLABELS)) {
                 labelNode = child;
                 continue;
             }
@@ -144,7 +145,7 @@
             for (int i = 0; i < labels.length; i++) {
                 PropertyState pState = labels[i];
                 if (pState.getType() == PropertyType.REFERENCE) {
-                    QName name = pState.getName();
+                    Name name = pState.getName();
                     UUID ref = pState.getValues()[0].getUUID();
                     InternalVersionImpl v = (InternalVersionImpl) getVersion(new NodeId(ref));
                     if (v != null) {
@@ -215,7 +216,7 @@
     /**
      * {@inheritDoc}
      */
-    public InternalVersion getVersion(QName versionName) throws VersionException {
+    public InternalVersion getVersion(Name versionName) throws VersionException {
         // maybe add cache by name?
         Iterator iter = versionCache.values().iterator();
         while (iter.hasNext()) {
@@ -230,7 +231,7 @@
     /**
      * {@inheritDoc}
      */
-    public boolean hasVersion(QName versionName) {
+    public boolean hasVersion(Name versionName) {
         // maybe add cache?
         Iterator iter = versionCache.values().iterator();
         while (iter.hasNext()) {
@@ -259,7 +260,7 @@
     /**
      * {@inheritDoc}
      */
-    public InternalVersion getVersionByLabel(QName label) {
+    public InternalVersion getVersionByLabel(Name label) {
         return (InternalVersion) labelCache.get(label);
     }
 
@@ -287,8 +288,8 @@
     /**
      * {@inheritDoc}
      */
-    public QName[] getVersionLabels() {
-        return (QName[]) labelCache.keySet().toArray(new QName[labelCache.size()]);
+    public Name[] getVersionLabels() {
+        return (Name[]) labelCache.keySet().toArray(new Name[labelCache.size()]);
     }
 
     /**
@@ -310,7 +311,7 @@
      * @param versionName
      * @throws VersionException
      */
-    void removeVersion(QName versionName) throws RepositoryException {
+    void removeVersion(Name versionName) throws RepositoryException {
 
         InternalVersionImpl v = (InternalVersionImpl) getVersion(versionName);
         if (v.equals(rootVersion)) {
@@ -325,7 +326,7 @@
         }
 
         // unregister from labels
-        QName[] labels = v.internalGetLabels();
+        Name[] labels = v.internalGetLabels();
         for (int i = 0; i < labels.length; i++) {
             v.internalRemoveLabel(labels[i]);
             labelNode.removeProperty(labels[i]);
@@ -358,7 +359,7 @@
      * @return the version that was previously assigned by this label or <code>null</code>.
      * @throws VersionException
      */
-    InternalVersion setVersionLabel(QName versionName, QName label, boolean move)
+    InternalVersion setVersionLabel(Name versionName, Name label, boolean move)
             throws VersionException {
 
         InternalVersion version =
@@ -413,11 +414,11 @@
      * @return
      * @throws RepositoryException
      */
-    InternalVersionImpl checkin(QName name, NodeImpl src)
+    InternalVersionImpl checkin(Name name, NodeImpl src)
             throws RepositoryException {
 
         // copy predecessors from src node
-        Value[] preds = src.getProperty(QName.JCR_PREDECESSORS).getValues();
+        Value[] preds = src.getProperty(NameConstants.JCR_PREDECESSORS).getValues();
         InternalValue[] predecessors = new InternalValue[preds.length];
         for (int i = 0; i < preds.length; i++) {
             UUID predId = UUID.fromString(preds[i].getString());
@@ -429,15 +430,15 @@
         }
 
         NodeId versionId = new NodeId(UUID.randomUUID());
-        NodeStateEx vNode = node.addNode(name, QName.NT_VERSION, versionId, true);
+        NodeStateEx vNode = node.addNode(name, NameConstants.NT_VERSION, versionId, true);
 
         // initialize 'created', 'predecessors' and 'successors'
-        vNode.setPropertyValue(QName.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
-        vNode.setPropertyValues(QName.JCR_PREDECESSORS, PropertyType.REFERENCE, predecessors);
-        vNode.setPropertyValues(QName.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
+        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
+        vNode.setPropertyValues(NameConstants.JCR_PREDECESSORS, PropertyType.REFERENCE, predecessors);
+        vNode.setPropertyValues(NameConstants.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
 
         // checkin source node
-        InternalFrozenNodeImpl.checkin(vNode, QName.JCR_FROZENNODE, src);
+        InternalFrozenNodeImpl.checkin(vNode, NameConstants.JCR_FROZENNODE, src);
 
         // update version graph
         InternalVersionImpl version = new InternalVersionImpl(this, vNode, name);
@@ -465,35 +466,35 @@
      */
     static InternalVersionHistoryImpl create(AbstractVersionManager vMgr,
                                              NodeStateEx parent,
-                                             NodeId historyId, QName name,
+                                             NodeId historyId, Name name,
                                              NodeState nodeState)
             throws RepositoryException {
 
         // create history node
-        NodeStateEx pNode = parent.addNode(name, QName.NT_VERSIONHISTORY, historyId, true);
+        NodeStateEx pNode = parent.addNode(name, NameConstants.NT_VERSIONHISTORY, historyId, true);
 
         // set the versionable uuid
         String versionableUUID = nodeState.getNodeId().getUUID().toString();
-        pNode.setPropertyValue(QName.JCR_VERSIONABLEUUID, InternalValue.create(versionableUUID));
+        pNode.setPropertyValue(NameConstants.JCR_VERSIONABLEUUID, InternalValue.create(versionableUUID));
 
         // create label node
-        pNode.addNode(QName.JCR_VERSIONLABELS, QName.NT_VERSIONLABELS, null, false);
+        pNode.addNode(NameConstants.JCR_VERSIONLABELS, NameConstants.NT_VERSIONLABELS, null, false);
 
         // create root version
         NodeId versionId = new NodeId(UUID.randomUUID());
-        NodeStateEx vNode = pNode.addNode(QName.JCR_ROOTVERSION, QName.NT_VERSION, versionId, true);
+        NodeStateEx vNode = pNode.addNode(NameConstants.JCR_ROOTVERSION, NameConstants.NT_VERSION, versionId, true);
 
         // initialize 'created' and 'predecessors'
-        vNode.setPropertyValue(QName.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
-        vNode.setPropertyValues(QName.JCR_PREDECESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
-        vNode.setPropertyValues(QName.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
+        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
+        vNode.setPropertyValues(NameConstants.JCR_PREDECESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
+        vNode.setPropertyValues(NameConstants.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
 
         // add also an empty frozen node to the root version
-        NodeStateEx node = vNode.addNode(QName.JCR_FROZENNODE, QName.NT_FROZENNODE, null, true);
+        NodeStateEx node = vNode.addNode(NameConstants.JCR_FROZENNODE, NameConstants.NT_FROZENNODE, null, true);
 
         // initialize the internal properties
-        node.setPropertyValue(QName.JCR_FROZENUUID, InternalValue.create(versionableUUID));
-        node.setPropertyValue(QName.JCR_FROZENPRIMARYTYPE,
+        node.setPropertyValue(NameConstants.JCR_FROZENUUID, InternalValue.create(versionableUUID));
+        node.setPropertyValue(NameConstants.JCR_FROZENPRIMARYTYPE,
                 InternalValue.create(nodeState.getNodeTypeName()));
 
         Set mixins = nodeState.getMixinTypeNames();
@@ -501,9 +502,9 @@
             InternalValue[] ivalues = new InternalValue[mixins.size()];
             Iterator iter = mixins.iterator();
             for (int i = 0; i < mixins.size(); i++) {
-                ivalues[i] = InternalValue.create((QName) iter.next());
+                ivalues[i] = InternalValue.create((Name) iter.next());
             }
-            node.setPropertyValues(QName.JCR_FROZENMIXINTYPES, PropertyType.NAME, ivalues);
+            node.setPropertyValues(NameConstants.JCR_FROZENMIXINTYPES, PropertyType.NAME, ivalues);
         }
 
         parent.store();
Index: src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/InternalFrozenNodeImpl.java	(working copy)
@@ -24,8 +24,9 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.NodeIterator;
 import javax.jcr.PropertyIterator;
@@ -78,12 +79,12 @@
     /**
      * the frozen primary type of the orginal node
      */
-    private QName frozenPrimaryType = null;
+    private Name frozenPrimaryType = null;
 
     /**
      * the frozen list of mixin types of the original node
      */
-    private QName[] frozenMixinTypes = null;
+    private Name[] frozenMixinTypes = null;
 
     /**
      * Creates a new frozen node based on the given persistance node.
@@ -107,26 +108,26 @@
 
         for (int i = 0; i < props.length; i++) {
             PropertyState prop = props[i];
-            if (prop.getName().equals(QName.JCR_FROZENUUID)) {
+            if (prop.getName().equals(NameConstants.JCR_FROZENUUID)) {
                 // special property
-                frozenUUID = UUID.fromString(node.getPropertyValue(QName.JCR_FROZENUUID).getString());
-            } else if (prop.getName().equals(QName.JCR_FROZENPRIMARYTYPE)) {
+                frozenUUID = UUID.fromString(node.getPropertyValue(NameConstants.JCR_FROZENUUID).getString());
+            } else if (prop.getName().equals(NameConstants.JCR_FROZENPRIMARYTYPE)) {
                 // special property
-                frozenPrimaryType = node.getPropertyValue(QName.JCR_FROZENPRIMARYTYPE).getQName();
-            } else if (prop.getName().equals(QName.JCR_FROZENMIXINTYPES)) {
+                frozenPrimaryType = node.getPropertyValue(NameConstants.JCR_FROZENPRIMARYTYPE).getQName();
+            } else if (prop.getName().equals(NameConstants.JCR_FROZENMIXINTYPES)) {
                 // special property
-                InternalValue[] values = node.getPropertyValues(QName.JCR_FROZENMIXINTYPES);
+                InternalValue[] values = node.getPropertyValues(NameConstants.JCR_FROZENMIXINTYPES);
                 if (values == null) {
-                    frozenMixinTypes = new QName[0];
+                    frozenMixinTypes = new Name[0];
                 } else {
-                    frozenMixinTypes = new QName[values.length];
+                    frozenMixinTypes = new Name[values.length];
                     for (int j = 0; j < values.length; j++) {
                         frozenMixinTypes[j] = values[j].getQName();
                     }
                 }
-            } else if (prop.getName().equals(QName.JCR_PRIMARYTYPE)) {
+            } else if (prop.getName().equals(NameConstants.JCR_PRIMARYTYPE)) {
                 // ignore
-            } else if (prop.getName().equals(QName.JCR_UUID)) {
+            } else if (prop.getName().equals(NameConstants.JCR_UUID)) {
                 // ignore
             } else {
                 propList.add(prop);
@@ -136,7 +137,7 @@
 
         // do some checks
         if (frozenMixinTypes == null) {
-            frozenMixinTypes = new QName[0];
+            frozenMixinTypes = new Name[0];
         }
         if (frozenPrimaryType == null) {
             throw new RepositoryException("Illegal frozen node. Must have 'frozenPrimaryType'");
@@ -146,7 +147,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getName() {
+    public Name getName() {
         return node.getName();
     }
 
@@ -218,14 +219,14 @@
     /**
      * {@inheritDoc}
      */
-    public QName getFrozenPrimaryType() {
+    public Name getFrozenPrimaryType() {
         return frozenPrimaryType;
     }
 
     /**
      * {@inheritDoc}
      */
-    public QName[] getFrozenMixinTypes() {
+    public Name[] getFrozenMixinTypes() {
         return frozenMixinTypes;
     }
 
@@ -242,7 +243,7 @@
      * @return
      * @throws RepositoryException
      */
-    protected static NodeStateEx checkin(NodeStateEx parent, QName name,
+    protected static NodeStateEx checkin(NodeStateEx parent, Name name,
                                          NodeImpl src)
             throws RepositoryException {
         return checkin(parent, name, src, MODE_VERSION);
@@ -261,25 +262,25 @@
      * @return
      * @throws RepositoryException
      */
-    private static NodeStateEx checkin(NodeStateEx parent, QName name,
+    private static NodeStateEx checkin(NodeStateEx parent, Name name,
                                        NodeImpl src, int mode)
             throws RepositoryException {
 
         // create new node
-        NodeStateEx node = parent.addNode(name, QName.NT_FROZENNODE, null, true);
+        NodeStateEx node = parent.addNode(name, NameConstants.NT_FROZENNODE, null, true);
 
         // initialize the internal properties
-        node.setPropertyValue(QName.JCR_FROZENUUID,
+        node.setPropertyValue(NameConstants.JCR_FROZENUUID,
                 InternalValue.create(src.internalGetUUID().toString()));
-        node.setPropertyValue(QName.JCR_FROZENPRIMARYTYPE,
+        node.setPropertyValue(NameConstants.JCR_FROZENPRIMARYTYPE,
                 InternalValue.create(((NodeTypeImpl) src.getPrimaryNodeType()).getQName()));
-        if (src.hasProperty(QName.JCR_MIXINTYPES)) {
+        if (src.hasProperty(NameConstants.JCR_MIXINTYPES)) {
             NodeType[] mixins = src.getMixinNodeTypes();
             InternalValue[] ivalues = new InternalValue[mixins.length];
             for (int i = 0; i < mixins.length; i++) {
                 ivalues[i] = InternalValue.create(((NodeTypeImpl) mixins[i]).getQName());
             }
-            node.setPropertyValues(QName.JCR_FROZENMIXINTYPES, PropertyType.NAME, ivalues);
+            node.setPropertyValues(NameConstants.JCR_FROZENMIXINTYPES, PropertyType.NAME, ivalues);
         }
 
         // add the properties
@@ -303,9 +304,9 @@
                 case OnParentVersionAction.VERSION:
                 case OnParentVersionAction.COPY:
                     // ignore frozen properties
-                    if (!prop.getQName().equals(QName.JCR_PRIMARYTYPE)
-                            && !prop.getQName().equals(QName.JCR_MIXINTYPES)
-                            && !prop.getQName().equals(QName.JCR_UUID)) {
+                    if (!prop.getQName().equals(NameConstants.JCR_PRIMARYTYPE)
+                            && !prop.getQName().equals(NameConstants.JCR_MIXINTYPES)
+                            && !prop.getQName().equals(NameConstants.JCR_UUID)) {
                         node.copyFrom(prop);
                     }
                     break;
@@ -330,10 +331,10 @@
                 case OnParentVersionAction.INITIALIZE:
                     break;
                 case OnParentVersionAction.VERSION:
-                    if (child.isNodeType(QName.MIX_VERSIONABLE)) {
+                    if (child.isNodeType(NameConstants.MIX_VERSIONABLE)) {
                         // create frozen versionable child
-                        NodeStateEx newChild = node.addNode(child.getQName(), QName.NT_VERSIONEDCHILD, null, false);
-                        newChild.setPropertyValue(QName.JCR_CHILDVERSIONHISTORY,
+                        NodeStateEx newChild = node.addNode(child.getQName(), NameConstants.NT_VERSIONEDCHILD, null, false);
+                        newChild.setPropertyValue(NameConstants.JCR_CHILDVERSIONHISTORY,
                                 InternalValue.create(new UUID(child.getVersionHistory().getUUID())));
                         /*
                         newChild.setPropertyValue(JCR_BASEVERSION,
Index: src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java	(working copy)
@@ -22,8 +22,8 @@
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -102,7 +102,7 @@
     public Version getVersion(String versionName)
             throws VersionException, RepositoryException {
         try {
-            QName name = session.getQName(versionName);
+            Name name = session.getQName(versionName);
             InternalVersion v = getInternalVersionHistory().getVersion(name);
             if (v == null) {
                 throw new VersionException("No version with name '" + versionName + "' exists in this version history.");
@@ -118,7 +118,7 @@
      */
     public Version getVersionByLabel(String label) throws RepositoryException {
         try {
-            QName qLabel = session.getQName(label);
+            Name qLabel = session.getQName(label);
             InternalVersion v =
                 getInternalVersionHistory().getVersionByLabel(qLabel);
             if (v == null) {
@@ -164,7 +164,7 @@
      * @see javax.jcr.version.VersionHistory#getVersionLabels
      */
     public String[] getVersionLabels() throws RepositoryException {
-        QName[] labels = getInternalVersionHistory().getVersionLabels();
+        Name[] labels = getInternalVersionHistory().getVersionLabels();
         String[] ret = new String[labels.length];
         for (int i = 0; i < labels.length; i++) {
             ret[i] = session.getJCRName(labels[i]);
@@ -178,7 +178,7 @@
     public String[] getVersionLabels(Version version)
             throws VersionException, RepositoryException {
         checkOwnVersion(version);
-        QName[] labels = ((VersionImpl) version).getInternalVersion().getLabels();
+        Name[] labels = ((VersionImpl) version).getInternalVersion().getLabels();
         String[] ret = new String[labels.length];
         for (int i = 0; i < labels.length; i++) {
             ret[i] = session.getJCRName(labels[i]);
@@ -191,7 +191,7 @@
      */
     public boolean hasVersionLabel(String label) throws RepositoryException {
         try {
-            QName qLabel = session.getQName(label);
+            Name qLabel = session.getQName(label);
             return getInternalVersionHistory().getVersionByLabel(qLabel) != null;
         } catch (NameException e) {
             throw new IllegalArgumentException("Unable to resolve label: " + e);
@@ -205,7 +205,7 @@
             throws VersionException, RepositoryException {
         checkOwnVersion(version);
         try {
-            QName qLabel = session.getQName(label);
+            Name qLabel = session.getQName(label);
             return ((VersionImpl) version).getInternalVersion().hasLabel(qLabel);
         } catch (NameException e) {
             throw new VersionException(e);
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.PropertyType;
 import java.util.Arrays;
@@ -32,18 +33,20 @@
  */
 public class NodeTypeDef implements Cloneable {
 
-    private QName name;
+    private Name name;
 
     /**
      * Ordered array of supertype names. Empty if no supertypes have been
      * specified. Never <code>null</code>.
      */
-    private QName[] supertypes;
+    private Name[] supertypes;
 
     private boolean mixin;
     private boolean orderableChildNodes;
+    
     private boolean abstractStatus;
-    private QName primaryItemName;
+    private Name primaryItemName;
+
     private HashSet propDefs;
     private HashSet nodeDefs;
     private Set dependencies;
@@ -57,14 +60,14 @@
         primaryItemName = null;
         nodeDefs = new HashSet();
         propDefs = new HashSet();
-        supertypes = QName.EMPTY_ARRAY;
+        supertypes = Name.EMPTY_ARRAY;
         mixin = false;
         orderableChildNodes = false;
         abstractStatus = false;
     }
 
     /**
-     * Returns a collection of node type <code>QName</code>s that are being
+     * Returns a collection of node type <code>Name</code>s that are being
      * referenced by <i>this</i> node type definition (e.g. as supertypes, as
      * required/default primary types in child node definitions, as REFERENCE
      * value constraints in property definitions).
@@ -73,7 +76,7 @@
      * the declaring node type as the default primary type) are not considered
      * dependencies.
      *
-     * @return a collection of node type <code>QName</code>s
+     * @return a collection of node type <code>Name</code>s
      */
     public Collection getDependencies() {
         if (dependencies == null) {
@@ -84,12 +87,12 @@
             for (Iterator iter = nodeDefs.iterator(); iter.hasNext();) {
                 NodeDef nd = (NodeDef) iter.next();
                 // default primary type
-                QName ntName = nd.getDefaultPrimaryType();
+                Name ntName = nd.getDefaultPrimaryType();
                 if (ntName != null && !name.equals(ntName)) {
                     dependencies.add(ntName);
                 }
                 // required primary type
-                QName[] ntNames = nd.getRequiredPrimaryTypes();
+                Name[] ntNames = nd.getRequiredPrimaryTypes();
                 for (int j = 0; j < ntNames.length; j++) {
                     if (ntNames[j] != null && !name.equals(ntNames[j])) {
                         dependencies.add(ntNames[j]);
@@ -126,7 +129,7 @@
      *
      * @param name The name of the node type.
      */
-    public void setName(QName name) {
+    public void setName(Name name) {
         this.name = name;
     }
 
@@ -135,18 +138,18 @@
      *
      * @param names the names of the supertypes.
      */
-    public void setSupertypes(QName[] names) {
+    public void setSupertypes(Name[] names) {
         resetDependencies();
         // Optimize common cases (zero or one supertypes)
         if (names.length == 0) {
-            supertypes = QName.EMPTY_ARRAY;
+            supertypes = Name.EMPTY_ARRAY;
         } else if (names.length == 1) {
-            supertypes = new QName[] { names[0] };
+            supertypes = new Name[] { names[0] };
         } else {
             // Sort and remove duplicates
             SortedSet types = new TreeSet();
             types.addAll(Arrays.asList(names));
-            supertypes = (QName[]) types.toArray(new QName[types.size()]);
+            supertypes = (Name[]) types.toArray(new Name[types.size()]);
         }
     }
 
@@ -183,7 +186,7 @@
      *
      * @param primaryItemName The name of the primary item.
      */
-    public void setPrimaryItemName(QName primaryItemName) {
+    public void setPrimaryItemName(Name primaryItemName) {
         this.primaryItemName = primaryItemName;
     }
 
@@ -215,7 +218,7 @@
      *
      * @return the name of the node type or <code>null</code> if not set.
      */
-    public QName getName() {
+    public Name getName() {
         return name;
     }
 
@@ -229,12 +232,12 @@
      *
      * @return a sorted array of supertype names
      */
-    public QName[] getSupertypes() {
+    public Name[] getSupertypes() {
         if (supertypes.length > 0
-                || isMixin() || QName.NT_BASE.equals(getName())) {
+                || isMixin() || NameConstants.NT_BASE.equals(getName())) {
             return supertypes;
         } else {
-            return new QName[] { QName.NT_BASE };
+            return new Name[] { NameConstants.NT_BASE };
         }
     }
 
@@ -271,7 +274,7 @@
      *
      * @return the name of the primary item or <code>null</code> if not set.
      */
-    public QName getPrimaryItemName() {
+    public Name getPrimaryItemName() {
         return primaryItemName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java	(working copy)
@@ -26,9 +26,11 @@
 import org.apache.jackrabbit.core.observation.DelegatingObservationDispatcher;
 import org.apache.jackrabbit.core.observation.EventState;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.conversion.MalformedPathException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,10 +59,10 @@
 
     static {
         try {
-            Path.PathBuilder builder = new Path.PathBuilder();
+            PathBuilder builder = new PathBuilder();
             builder.addRoot();
-            builder.addLast(QName.JCR_SYSTEM);
-            builder.addLast(QName.JCR_NODETYPES);
+            builder.addLast(NameConstants.JCR_SYSTEM);
+            builder.addLast(NameConstants.JCR_NODETYPES);
             NODE_TYPES_PATH = builder.getPath();
         } catch (MalformedPathException e) {
             // will not happen. path is always valid
@@ -141,7 +143,7 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeRegistered(QName ntName) {
+    public void nodeTypeRegistered(Name ntName) {
         try {
             if (virtProvider != null) {
                 // allow provider to update
@@ -163,7 +165,7 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeReRegistered(QName ntName) {
+    public void nodeTypeReRegistered(Name ntName) {
         // lazy implementation
         nodeTypeUnregistered(ntName);
         nodeTypeRegistered(ntName);
@@ -172,7 +174,7 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeUnregistered(QName ntName) {
+    public void nodeTypeUnregistered(Name ntName) {
         try {
             if (systemSession != null) {
                 // generated observation events
Index: src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java	(working copy)
@@ -29,8 +29,9 @@
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.virtual.AbstractVISProvider;
 import org.apache.jackrabbit.core.virtual.VirtualNodeState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameConstants;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -72,10 +73,10 @@
      * currently we have no dynamic ones, we just recreate the entire nodetypes tree
      */
     protected VirtualNodeState createRootNodeState() throws RepositoryException {
-        VirtualNodeState root = new VirtualNodeState(this, parentId, rootNodeId, QName.REP_NODETYPES, null);
-        NodeDefId id = ntReg.getEffectiveNodeType(QName.REP_SYSTEM).getApplicableChildNodeDef(QName.JCR_NODETYPES, QName.REP_NODETYPES, ntReg).getId();
+        VirtualNodeState root = new VirtualNodeState(this, parentId, rootNodeId, NameConstants.REP_NODETYPES, null);
+        NodeDefId id = ntReg.getEffectiveNodeType(NameConstants.REP_SYSTEM).getApplicableChildNodeDef(NameConstants.JCR_NODETYPES, NameConstants.REP_NODETYPES, ntReg).getId();
         root.setDefinitionId(id);
-        QName[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = ntReg.getRegisteredNodeTypes();
         for (int i = 0; i < ntNames.length; i++) {
             NodeTypeDef ntDef = ntReg.getNodeTypeDef(ntNames[i]);
             VirtualNodeState ntState = createNodeTypeState(root, ntDef);
@@ -103,7 +104,7 @@
     /**
      * {@inheritDoc}
      */
-    public void onNodeTypeAdded(QName ntName) throws RepositoryException {
+    public void onNodeTypeAdded(Name ntName) throws RepositoryException {
         try {
             VirtualNodeState root = (VirtualNodeState) getRootState();
             NodeTypeDef ntDef = ntReg.getNodeTypeDef(ntName);
@@ -121,7 +122,7 @@
     /**
      * {@inheritDoc}
      */
-    public void onNodeTypeModified(QName ntName) throws RepositoryException {
+    public void onNodeTypeModified(Name ntName) throws RepositoryException {
         // todo: do more efficient reloading
         try {
             getRootState().discard();
@@ -133,7 +134,7 @@
     /**
      * {@inheritDoc}
      */
-    public void onNodeTypeRemoved(QName ntName) throws RepositoryException {
+    public void onNodeTypeRemoved(Name ntName) throws RepositoryException {
         // todo: do more efficient reloading
         try {
             getRootState().discard();
@@ -154,22 +155,22 @@
                                                  NodeTypeDef ntDef)
             throws RepositoryException {
         NodeId id = new NodeId(calculateStableUUID(ntDef.getName().toString()));
-        VirtualNodeState ntState = createNodeState(parent, ntDef.getName(), id, QName.NT_NODETYPE);
+        VirtualNodeState ntState = createNodeState(parent, ntDef.getName(), id, NameConstants.NT_NODETYPE);
 
         // add properties
-        ntState.setPropertyValue(QName.JCR_NODETYPENAME, InternalValue.create(ntDef.getName()));
-        ntState.setPropertyValues(QName.JCR_SUPERTYPES, PropertyType.NAME, InternalValue.create(ntDef.getSupertypes()));
-        ntState.setPropertyValue(QName.JCR_ISMIXIN, InternalValue.create(ntDef.isMixin()));
-        ntState.setPropertyValue(QName.JCR_HASORDERABLECHILDNODES, InternalValue.create(ntDef.hasOrderableChildNodes()));
+        ntState.setPropertyValue(NameConstants.JCR_NODETYPENAME, InternalValue.create(ntDef.getName()));
+        ntState.setPropertyValues(NameConstants.JCR_SUPERTYPES, PropertyType.NAME, InternalValue.create(ntDef.getSupertypes()));
+        ntState.setPropertyValue(NameConstants.JCR_ISMIXIN, InternalValue.create(ntDef.isMixin()));
+        ntState.setPropertyValue(NameConstants.JCR_HASORDERABLECHILDNODES, InternalValue.create(ntDef.hasOrderableChildNodes()));
         if (ntDef.getPrimaryItemName() != null) {
-            ntState.setPropertyValue(QName.JCR_PRIMARYITEMNAME, InternalValue.create(ntDef.getPrimaryItemName()));
+            ntState.setPropertyValue(NameConstants.JCR_PRIMARYITEMNAME, InternalValue.create(ntDef.getPrimaryItemName()));
         }
 
         // add property defs
         PropDef[] propDefs = ntDef.getPropertyDefs();
         for (int i = 0; i < propDefs.length; i++) {
             VirtualNodeState pdState = createPropertyDefState(ntState, propDefs[i], ntDef, i);
-            ntState.addChildNodeEntry(QName.JCR_PROPERTYDEFINITION, pdState.getNodeId());
+            ntState.addChildNodeEntry(NameConstants.JCR_PROPERTYDEFINITION, pdState.getNodeId());
             // add as hard reference
             ntState.addStateReference(pdState);
         }
@@ -178,7 +179,7 @@
         NodeDef[] cnDefs = ntDef.getChildNodeDefs();
         for (int i = 0; i < cnDefs.length; i++) {
             VirtualNodeState cnState = createChildNodeDefState(ntState, cnDefs[i], ntDef, i);
-            ntState.addChildNodeEntry(QName.JCR_CHILDNODEDEFINITION, cnState.getNodeId());
+            ntState.addChildNodeEntry(NameConstants.JCR_CHILDNODEDEFINITION, cnState.getNodeId());
             // add as hard reference
             ntState.addStateReference(cnState);
         }
@@ -199,26 +200,26 @@
                                                     NodeTypeDef ntDef, int n)
             throws RepositoryException {
         NodeId id = new NodeId(calculateStableUUID(
-                ntDef.getName().toString() + "/" + QName.JCR_PROPERTYDEFINITION.toString() + "/" + n));
-        VirtualNodeState pState = createNodeState(parent, QName.JCR_PROPERTYDEFINITION, id, QName.NT_PROPERTYDEFINITION);
+                ntDef.getName().toString() + "/" + NameConstants.JCR_PROPERTYDEFINITION.toString() + "/" + n));
+        VirtualNodeState pState = createNodeState(parent, NameConstants.JCR_PROPERTYDEFINITION, id, NameConstants.NT_PROPERTYDEFINITION);
         // add properties
         if (!propDef.definesResidual()) {
-            pState.setPropertyValue(QName.JCR_NAME, InternalValue.create(propDef.getName()));
+            pState.setPropertyValue(NameConstants.JCR_NAME, InternalValue.create(propDef.getName()));
         }
-        pState.setPropertyValue(QName.JCR_AUTOCREATED, InternalValue.create(propDef.isAutoCreated()));
-        pState.setPropertyValue(QName.JCR_MANDATORY, InternalValue.create(propDef.isMandatory()));
-        pState.setPropertyValue(QName.JCR_ONPARENTVERSION,
+        pState.setPropertyValue(NameConstants.JCR_AUTOCREATED, InternalValue.create(propDef.isAutoCreated()));
+        pState.setPropertyValue(NameConstants.JCR_MANDATORY, InternalValue.create(propDef.isMandatory()));
+        pState.setPropertyValue(NameConstants.JCR_ONPARENTVERSION,
                 InternalValue.create(OnParentVersionAction.nameFromValue(propDef.getOnParentVersion())));
-        pState.setPropertyValue(QName.JCR_PROTECTED, InternalValue.create(propDef.isProtected()));
-        pState.setPropertyValue(QName.JCR_MULTIPLE, InternalValue.create(propDef.isMultiple()));
-        pState.setPropertyValue(QName.JCR_REQUIREDTYPE, InternalValue.create(PropertyType.nameFromValue(propDef.getRequiredType()).toUpperCase()));
-        pState.setPropertyValues(QName.JCR_DEFAULTVALUES, PropertyType.STRING, propDef.getDefaultValues());
+        pState.setPropertyValue(NameConstants.JCR_PROTECTED, InternalValue.create(propDef.isProtected()));
+        pState.setPropertyValue(NameConstants.JCR_MULTIPLE, InternalValue.create(propDef.isMultiple()));
+        pState.setPropertyValue(NameConstants.JCR_REQUIREDTYPE, InternalValue.create(PropertyType.nameFromValue(propDef.getRequiredType()).toUpperCase()));
+        pState.setPropertyValues(NameConstants.JCR_DEFAULTVALUES, PropertyType.STRING, propDef.getDefaultValues());
         ValueConstraint[] vc = propDef.getValueConstraints();
         InternalValue[] vals = new InternalValue[vc.length];
         for (int i = 0; i < vc.length; i++) {
             vals[i] = InternalValue.create(vc[i].getDefinition());
         }
-        pState.setPropertyValues(QName.JCR_VALUECONSTRAINTS, PropertyType.STRING, vals);
+        pState.setPropertyValues(NameConstants.JCR_VALUECONSTRAINTS, PropertyType.STRING, vals);
         return pState;
     }
 
@@ -235,23 +236,23 @@
                                                      NodeTypeDef ntDef, int n)
             throws RepositoryException {
         NodeId id = new NodeId(calculateStableUUID(
-                ntDef.getName().toString() + "/" + QName.JCR_CHILDNODEDEFINITION.toString() + "/" + n));
-        VirtualNodeState pState = createNodeState(parent, QName.JCR_CHILDNODEDEFINITION, id, QName.NT_CHILDNODEDEFINITION);
+                ntDef.getName().toString() + "/" + NameConstants.JCR_CHILDNODEDEFINITION.toString() + "/" + n));
+        VirtualNodeState pState = createNodeState(parent, NameConstants.JCR_CHILDNODEDEFINITION, id, NameConstants.NT_CHILDNODEDEFINITION);
         // add properties
         if (!cnDef.definesResidual()) {
-            pState.setPropertyValue(QName.JCR_NAME, InternalValue.create(cnDef.getName()));
+            pState.setPropertyValue(NameConstants.JCR_NAME, InternalValue.create(cnDef.getName()));
         }
-        pState.setPropertyValue(QName.JCR_AUTOCREATED, InternalValue.create(cnDef.isAutoCreated()));
-        pState.setPropertyValue(QName.JCR_MANDATORY, InternalValue.create(cnDef.isMandatory()));
-        pState.setPropertyValue(QName.JCR_ONPARENTVERSION,
+        pState.setPropertyValue(NameConstants.JCR_AUTOCREATED, InternalValue.create(cnDef.isAutoCreated()));
+        pState.setPropertyValue(NameConstants.JCR_MANDATORY, InternalValue.create(cnDef.isMandatory()));
+        pState.setPropertyValue(NameConstants.JCR_ONPARENTVERSION,
                 InternalValue.create(OnParentVersionAction.nameFromValue(cnDef.getOnParentVersion())));
-        pState.setPropertyValue(QName.JCR_PROTECTED, InternalValue.create(cnDef.isProtected()));
-        pState.setPropertyValues(QName.JCR_REQUIREDPRIMARYTYPES,
+        pState.setPropertyValue(NameConstants.JCR_PROTECTED, InternalValue.create(cnDef.isProtected()));
+        pState.setPropertyValues(NameConstants.JCR_REQUIREDPRIMARYTYPES,
                 PropertyType.NAME, InternalValue.create(cnDef.getRequiredPrimaryTypes()));
         if (cnDef.getDefaultPrimaryType() != null) {
-            pState.setPropertyValue(QName.JCR_DEFAULTPRIMARYTYPE, InternalValue.create(cnDef.getDefaultPrimaryType()));
+            pState.setPropertyValue(NameConstants.JCR_DEFAULTPRIMARYTYPE, InternalValue.create(cnDef.getDefaultPrimaryType()));
         }
-        pState.setPropertyValue(QName.JCR_SAMENAMESIBLINGS, InternalValue.create(cnDef.allowsSameNameSiblings()));
+        pState.setPropertyValue(NameConstants.JCR_SAMENAMESIBLINGS, InternalValue.create(cnDef.allowsSameNameSiblings()));
         return pState;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/BitsetENTCacheImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/BitsetENTCacheImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/BitsetENTCacheImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.util.TreeSet;
 import java.util.HashMap;
@@ -69,7 +69,7 @@
     /**
      * The reverse lookup table for bit numbers to names
      */
-    private QName[] names = new QName[1024];
+    private Name[] names = new Name[1024];
 
     /**
      * Creates a new bitset effective node type cache
@@ -82,7 +82,7 @@
     /**
      * {@inheritDoc}
      */
-    public Key getKey(QName[] ntNames) {
+    public Key getKey(Name[] ntNames) {
         return new BitsetKey(ntNames, nameIndex.size() + ntNames.length);
     }
 
@@ -122,7 +122,7 @@
     /**
      * {@inheritDoc}
      */
-    public void invalidate(QName name) {
+    public void invalidate(Name name) {
         /**
          * remove all affected effective node types from aggregates cache
          * (copy keys first to prevent ConcurrentModificationException)
@@ -158,7 +158,7 @@
      * @param name the name to lookup
      * @return the bit number for the given name
      */
-    private int getBitNumber(QName name) {
+    private int getBitNumber(Name name) {
         Integer i = (Integer) nameIndex.get(name);
         if (i == null) {
             synchronized (nameIndex) {
@@ -168,7 +168,7 @@
                     i = new Integer(idx);
                     nameIndex.put(name, i);
                     if (idx >= names.length) {
-                        QName[] newNames = new QName[names.length*2];
+                        Name[] newNames = new Name[names.length*2];
                         System.arraycopy(names, 0, newNames, 0, names.length);
                         names = newNames;
                     }
@@ -184,7 +184,7 @@
      * @param n the bit number to lookup
      * @return the node type name
      */
-    private QName getName(int n) {
+    private Name getName(int n) {
         return names[n];
     }
 
@@ -213,7 +213,7 @@
         BitsetENTCacheImpl clone = new BitsetENTCacheImpl();
         clone.sortedKeys.addAll(sortedKeys);
         clone.aggregates.putAll(aggregates);
-        clone.names = new QName[names.length];
+        clone.names = new Name[names.length];
         System.arraycopy(names, 0, clone.names, 0, names.length);
         clone.nameIndex.putAll(nameIndex);
         return clone;
@@ -246,7 +246,7 @@
         /**
          * The names of the node types that form this key.
          */
-        private final QName[] names;
+        private final Name[] names;
 
         /**
          * The array of longs that hold the bit information.
@@ -263,7 +263,7 @@
          * @param names the node type names
          * @param maxBit the approximative number of the geatest bit
          */
-        public BitsetKey(QName[] names, int maxBit) {
+        public BitsetKey(Name[] names, int maxBit) {
             this.names = names;
             bits = new long[maxBit/BPW+1];
 
@@ -281,7 +281,7 @@
          */
         private BitsetKey(long[] bits, int numBits) {
             this.bits = bits;
-            names = new QName[numBits];
+            names = new Name[numBits];
             int i = nextSetBit(0);
             int j=0;
             while (i >= 0) {
@@ -294,7 +294,7 @@
         /**
          * {@inheritDoc}
          */
-        public QName[] getNames() {
+        public Name[] getNames() {
             return names;
         }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.nodetype;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -88,7 +88,7 @@
             throws NodeTypeConflictException, NoSuchNodeTypeException {
         // create empty effective node type instance
         EffectiveNodeType ent = new EffectiveNodeType();
-        QName ntName = ntd.getName();
+        Name ntName = ntd.getName();
 
         // prepare new instance
         ent.mergedNodeTypes.add(ntName);
@@ -122,7 +122,7 @@
                 ent.unnamedItemDefs.add(cnda[i]);
             } else {
                 // named node definition
-                QName name = cnda[i].getName();
+                Name name = cnda[i].getName();
                 List defs = (List) ent.namedItemDefs.get(name);
                 if (defs == null) {
                     defs = new ArrayList();
@@ -170,7 +170,7 @@
                 ent.unnamedItemDefs.add(pda[i]);
             } else {
                 // named property definition
-                QName name = pda[i].getName();
+                Name name = pda[i].getName();
                 List defs = (List) ent.namedItemDefs.get(name);
                 if (defs == null) {
                     defs = new ArrayList();
@@ -197,7 +197,7 @@
         }
 
         // resolve supertypes recursively
-        QName[] supertypes = ntd.getSupertypes();
+        Name[] supertypes = ntd.getSupertypes();
         if (supertypes.length > 0) {
             EffectiveNodeType base =
                     NodeTypeRegistry.getEffectiveNodeType(supertypes, entCache, ntdCache);
@@ -218,16 +218,16 @@
         return new EffectiveNodeType();
     }
 
-    public QName[] getMergedNodeTypes() {
-        return (QName[]) mergedNodeTypes.toArray(new QName[mergedNodeTypes.size()]);
+    public Name[] getMergedNodeTypes() {
+        return (Name[]) mergedNodeTypes.toArray(new Name[mergedNodeTypes.size()]);
     }
 
-    public QName[] getInheritedNodeTypes() {
-        return (QName[]) inheritedNodeTypes.toArray(new QName[inheritedNodeTypes.size()]);
+    public Name[] getInheritedNodeTypes() {
+        return (Name[]) inheritedNodeTypes.toArray(new Name[inheritedNodeTypes.size()]);
     }
 
-    public QName[] getAllNodeTypes() {
-        return (QName[]) allNodeTypes.toArray(new QName[allNodeTypes.size()]);
+    public Name[] getAllNodeTypes() {
+        return (Name[]) allNodeTypes.toArray(new Name[allNodeTypes.size()]);
     }
 
     public ItemDef[] getAllItemDefs() {
@@ -268,11 +268,11 @@
         return (ItemDef[]) unnamedItemDefs.toArray(new ItemDef[unnamedItemDefs.size()]);
     }
 
-    public boolean hasNamedItemDef(QName name) {
+    public boolean hasNamedItemDef(Name name) {
         return namedItemDefs.containsKey(name);
     }
 
-    public ItemDef[] getNamedItemDefs(QName name) {
+    public ItemDef[] getNamedItemDefs(Name name) {
         List defs = (List) namedItemDefs.get(name);
         if (defs == null || defs.size() == 0) {
             return ItemDef.EMPTY_ARRAY;
@@ -331,7 +331,7 @@
         return (NodeDef[]) defs.toArray(new NodeDef[defs.size()]);
     }
 
-    public NodeDef[] getNamedNodeDefs(QName name) {
+    public NodeDef[] getNamedNodeDefs(Name name) {
         List list = (List) namedItemDefs.get(name);
         if (list == null || list.size() == 0) {
             return NodeDef.EMPTY_ARRAY;
@@ -443,7 +443,7 @@
         return (PropDef[]) defs.toArray(new PropDef[defs.size()]);
     }
 
-    public PropDef[] getNamedPropDefs(QName name) {
+    public PropDef[] getNamedPropDefs(Name name) {
         List list = (List) namedItemDefs.get(name);
         if (list == null || list.size() == 0) {
             return PropDef.EMPTY_ARRAY;
@@ -560,7 +560,7 @@
      * @return <code>true</code> if the given node type is included, otherwise
      *         <code>false</code>
      */
-    public boolean includesNodeType(QName nodeTypeName) {
+    public boolean includesNodeType(Name nodeTypeName) {
         return allNodeTypes.contains(nodeTypeName);
     }
 
@@ -572,7 +572,7 @@
      * @return <code>true</code> if all of the given node types are included,
      *         otherwise <code>false</code>
      */
-    public boolean includesNodeTypes(QName[] nodeTypeNames) {
+    public boolean includesNodeTypes(Name[] nodeTypeNames) {
         return allNodeTypes.containsAll(Arrays.asList(nodeTypeNames));
     }
 
@@ -631,7 +631,7 @@
      * @param name
      * @throws ConstraintViolationException
      */
-    public void checkAddNodeConstraints(QName name)
+    public void checkAddNodeConstraints(Name name)
             throws ConstraintViolationException {
         try {
             getApplicableChildNodeDef(name, null, null);
@@ -649,7 +649,7 @@
      * @throws ConstraintViolationException
      * @throws NoSuchNodeTypeException
      */
-    public void checkAddNodeConstraints(QName name, QName nodeTypeName,
+    public void checkAddNodeConstraints(Name name, Name nodeTypeName,
                                         NodeTypeRegistry ntReg)
             throws ConstraintViolationException, NoSuchNodeTypeException {
         NodeDef nd = getApplicableChildNodeDef(name, nodeTypeName, ntReg);
@@ -674,7 +674,7 @@
      * @throws ConstraintViolationException if no applicable child node definition
      *                                      could be found
      */
-    public NodeDef getApplicableChildNodeDef(QName name, QName nodeTypeName,
+    public NodeDef getApplicableChildNodeDef(Name name, Name nodeTypeName,
                                              NodeTypeRegistry ntReg)
             throws NoSuchNodeTypeException, ConstraintViolationException {
         EffectiveNodeType entTarget;
@@ -752,7 +752,7 @@
      * @throws ConstraintViolationException if no applicable property definition
      *                                      could be found
      */
-    public PropDef getApplicablePropertyDef(QName name, int type,
+    public PropDef getApplicablePropertyDef(Name name, int type,
                                             boolean multiValued)
             throws ConstraintViolationException {
         // try named property definitions first
@@ -777,7 +777,7 @@
      * Returns the applicable property definition for a property with the
      * specified name and type. The multiValued flag is not taken into account
      * in the selection algorithm. Other than
-     * <code>{@link #getApplicablePropertyDef(QName, int, boolean)}</code>
+     * <code>{@link #getApplicablePropertyDef(Name, int, boolean)}</code>
      * this method does not take the multiValued flag into account in the
      * selection algorithm. If there more than one applicable definitions then
      * the following rules are applied:
@@ -794,7 +794,7 @@
      * @throws ConstraintViolationException if no applicable property definition
      *                                      could be found
      */
-    public PropDef getApplicablePropertyDef(QName name, int type)
+    public PropDef getApplicablePropertyDef(Name name, int type)
             throws ConstraintViolationException {
         // try named property definitions first
         PropDef match = getMatchingPropDef(getNamedPropDefs(name), type);
@@ -886,7 +886,7 @@
      * @param name
      * @throws ConstraintViolationException
      */
-    public void checkRemoveItemConstraints(QName name) throws ConstraintViolationException {
+    public void checkRemoveItemConstraints(Name name) throws ConstraintViolationException {
         /**
          * as there might be multiple definitions with the same name and we
          * don't know which one is applicable, we check all of them
@@ -908,7 +908,7 @@
      * @param name
      * @throws ConstraintViolationException
      */
-    public void checkRemoveNodeConstraints(QName name) throws ConstraintViolationException {
+    public void checkRemoveNodeConstraints(Name name) throws ConstraintViolationException {
         /**
          * as there might be multiple definitions with the same name and we
          * don't know which one is applicable, we check all of them
@@ -930,7 +930,7 @@
      * @param name
      * @throws ConstraintViolationException
      */
-    public void checkRemovePropertyConstraints(QName name) throws ConstraintViolationException {
+    public void checkRemovePropertyConstraints(Name name) throws ConstraintViolationException {
         /**
          * as there might be multiple definitions with the same name and we
          * don't know which one is applicable, we check all of them
@@ -982,7 +982,7 @@
      */
     private synchronized void internalMerge(EffectiveNodeType other, boolean supertype)
             throws NodeTypeConflictException {
-        QName[] nta = other.getAllNodeTypes();
+        Name[] nta = other.getAllNodeTypes();
         int includedCount = 0;
         for (int i = 0; i < nta.length; i++) {
             if (includesNodeType(nta[i])) {
@@ -1004,7 +1004,7 @@
                 // ignore redundant definitions
                 continue;
             }
-            QName name = def.getName();
+            Name name = def.getName();
             List existingDefs = (List) namedItemDefs.get(name);
             if (existingDefs != null) {
                 if (existingDefs.size() > 0) {
Index: src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCacheImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCacheImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCacheImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.io.PrintStream;
 import java.util.Arrays;
@@ -55,7 +55,7 @@
     /**
      * {@inheritDoc}
      */
-    public Key getKey(QName[] ntNames) {
+    public Key getKey(Name[] ntNames) {
         return new WeightedKey(ntNames);
     }
 
@@ -124,7 +124,7 @@
     /**
      * {@inheritDoc}
      */
-    public void invalidate(QName name) {
+    public void invalidate(Name name) {
         // remove all affected effective node types from aggregates cache
         // (copy keys first to prevent ConcurrentModificationException)
         ArrayList keys = new ArrayList(sortedKeys);
@@ -220,7 +220,7 @@
         /**
          * array of node type names, sorted in ascending order
          */
-        private final QName[] names;
+        private final Name[] names;
 
         /**
          * the weight of this key
@@ -230,7 +230,7 @@
         /**
          * @param ntNames
          */
-        WeightedKey(QName[] ntNames) {
+        WeightedKey(Name[] ntNames) {
             this(ntNames, ntNames.length);
         }
 
@@ -238,9 +238,9 @@
          * @param ntNames
          * @param weight
          */
-        WeightedKey(QName[] ntNames, int weight) {
+        WeightedKey(Name[] ntNames, int weight) {
             this.weight = weight;
-            names = new QName[ntNames.length];
+            names = new Name[ntNames.length];
             System.arraycopy(ntNames, 0, names, 0, names.length);
             Arrays.sort(names);
         }
@@ -257,13 +257,13 @@
          * @param weight
          */
         WeightedKey(Collection ntNames, int weight) {
-            this((QName[]) ntNames.toArray(new QName[ntNames.size()]), weight);
+            this((Name[]) ntNames.toArray(new Name[ntNames.size()]), weight);
         }
 
         /**
          * @return the node type names of this key
          */
-        public QName[] getNames() {
+        public Name[] getNames() {
             return names;
         }
 
@@ -316,8 +316,8 @@
             int len = Math.min(len1, len2);
 
             for (int i = 0; i < len; i++) {
-                QName name1 = names[i];
-                QName name2 = other.names[i];
+                Name name1 = names[i];
+                Name name2 = other.names[i];
                 int result = name1.compareTo(name2);
                 if (result != 0) {
                     return result;
Index: src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/PropertyDefinitionImpl.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.nodetype;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,7 +28,7 @@
 /**
  * This class implements the <code>PropertyDefinition</code> interface.
  * All method calls are delegated to the wrapped {@link PropDef},
- * performing the translation from <code>QName</code>s to JCR names
+ * performing the translation from <code>Name</code>s to JCR names
  * (and vice versa) where necessary.
  */
 public class PropertyDefinitionImpl extends ItemDefinitionImpl
@@ -44,11 +44,11 @@
      *
      * @param propDef    property definition
      * @param ntMgr      node type manager
-     * @param nsResolver namespace resolver
+     * @param resolver
      */
     PropertyDefinitionImpl(PropDef propDef, NodeTypeManagerImpl ntMgr,
-                           NamespaceResolver nsResolver) {
-        super(propDef, ntMgr, nsResolver);
+                           NamePathResolver resolver) {
+        super(propDef, ntMgr, resolver);
     }
 
     /**
@@ -72,7 +72,7 @@
         Value[] values = new Value[defVals.length];
         for (int i = 0; i < defVals.length; i++) {
             try {
-                values[i] = defVals[i].toJCRValue(nsResolver);
+                values[i] = defVals[i].toJCRValue(resolver);
             } catch (RepositoryException re) {
                 // should never get here
                 String propName = (getName() == null) ? "[null]" : getName();
@@ -102,7 +102,7 @@
         }
         String[] vca = new String[constraints.length];
         for (int i = 0; i < constraints.length; i++) {
-            vca[i] = constraints[i].getDefinition(nsResolver);
+            vca[i] = constraints[i].getDefinition(resolver);
         }
         return vca;
     }
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java	(working copy)
@@ -16,21 +16,21 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.NodeType;
+import javax.jcr.NamespaceException;
 
 /**
  * This class implements the <code>NodeDefinition</code> interface.
  * All method calls are delegated to the wrapped {@link NodeDef},
- * performing the translation from <code>QName</code>s to JCR names
+ * performing the translation from <code>Name</code>s to JCR names
  * (and vice versa) where necessary.
  */
 public class NodeDefinitionImpl extends ItemDefinitionImpl implements NodeDefinition {
@@ -45,11 +45,11 @@
      *
      * @param nodeDef    child node definition
      * @param ntMgr      node type manager
-     * @param nsResolver namespace resolver
+     * @param resolver
      */
     NodeDefinitionImpl(NodeDef nodeDef, NodeTypeManagerImpl ntMgr,
-                NamespaceResolver nsResolver) {
-        super(nodeDef, ntMgr, nsResolver);
+                       NamePathResolver resolver) {
+        super(nodeDef, ntMgr, resolver);
     }
 
     /**
@@ -66,7 +66,7 @@
      * {@inheritDoc}
      */
     public NodeType getDefaultPrimaryType() {
-        QName ntName = ((NodeDef) itemDef).getDefaultPrimaryType();
+        Name ntName = ((NodeDef) itemDef).getDefaultPrimaryType();
         if (ntName == null) {
             return null;
         }
@@ -83,11 +83,11 @@
      * {@inheritDoc}
      */
     public NodeType[] getRequiredPrimaryTypes() {
-        QName[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes();
+        Name[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes();
         try {
             if (ntNames == null || ntNames.length == 0) {
                 // return "nt:base"
-                return new NodeType[] {ntMgr.getNodeType(QName.NT_BASE)};
+                return new NodeType[] {ntMgr.getNodeType(NameConstants.NT_BASE)};
             } else {
                 NodeType[] nodeTypes = new NodeType[ntNames.length];
                 for (int i = 0; i < ntNames.length; i++) {
@@ -128,19 +128,19 @@
      * @since JCR 2.0
      */
     public String[] getRequiredPrimaryTypeNames() {
-        QName[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes();
+        Name[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes();
         try {
             if (ntNames == null || ntNames.length == 0) {
                 // return "nt:base"
-                return new String[] {NameFormat.format(QName.NT_BASE, nsResolver)};
+                return new String[] {resolver.getJCRName(NameConstants.NT_BASE)};
             } else {
                 String[] names = new String[ntNames.length];
                 for (int i = 0; i < ntNames.length; i++) {
-                    names[i] = NameFormat.format(ntNames[i], nsResolver);
+                    names[i] = resolver.getJCRName(ntNames[i]);
                 }
                 return names;
             }
-        } catch (NoPrefixDeclaredException npde) {
+        } catch (NamespaceException npde) {
             // should never get here
             log.error("encountered unregistered namespace in node type name",
                     npde);
@@ -165,14 +165,14 @@
      * @since JCR 2.0
      */
     public String getDefaultPrimaryTypeName() {
-        QName ntName = ((NodeDef) itemDef).getDefaultPrimaryType();
+        Name ntName = ((NodeDef) itemDef).getDefaultPrimaryType();
         if (ntName == null) {
             return null;
         }
 
         try {
-            return NameFormat.format(ntName, nsResolver);
-        } catch (NoPrefixDeclaredException npde) {
+            return resolver.getJCRName(ntName);
+        } catch (NamespaceException npde) {
             // should never get here
             log.error("encountered unregistered namespace in node type name",
                     npde);
Index: src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/PropDefImpl.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.nodetype;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.PropertyType;
 import java.util.Arrays;
@@ -117,7 +117,7 @@
     /**
      * {@inheritDoc}
      */
-    public void setDeclaringNodeType(QName declaringNodeType) {
+    public void setDeclaringNodeType(Name declaringNodeType) {
         // reset id field in order to force lazy recomputation of identifier
         id = null;
         super.setDeclaringNodeType(declaringNodeType);
@@ -126,7 +126,7 @@
     /**
      * {@inheritDoc}
      */
-    public void setName(QName name) {
+    public void setName(Name name) {
         // reset id field in order to force lazy recomputation of identifier
         id = null;
         super.setName(name);
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefId.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.io.Serializable;
 import java.util.Arrays;
@@ -63,7 +63,7 @@
 
         // required node type names, sorted in ascending order
         // format: "[name1, name2, name3]", see AbstractCollection#toString()
-        QName[] names = def.getRequiredPrimaryTypes();
+        Name[] names = def.getRequiredPrimaryTypes();
         Arrays.sort(names);
         sb.append('[');
         for (int i = 0; i < names.length; i++) {
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefStore.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefStore.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDefStore.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader;
 import org.apache.jackrabbit.core.nodetype.xml.NodeTypeWriter;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.RepositoryException;
@@ -82,7 +82,7 @@
      * @param name
      * @return
      */
-    public boolean remove(QName name) {
+    public boolean remove(Name name) {
         return (ntDefs.remove(name) != null);
     }
 
@@ -97,7 +97,7 @@
      * @param name
      * @return
      */
-    public boolean contains(QName name) {
+    public boolean contains(Name name) {
         return ntDefs.containsKey(name);
     }
 
@@ -105,7 +105,7 @@
      * @param name
      * @return
      */
-    public NodeTypeDef get(QName name) {
+    public NodeTypeDef get(Name name) {
         return (NodeTypeDef) ntDefs.get(name);
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistryListener.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * The <code>NodeTypeRegistryListener</code> interface allows an implementing
@@ -32,19 +32,19 @@
      *
      * @param ntName name of the node type that has been registered
      */
-    void nodeTypeRegistered(QName ntName);
+    void nodeTypeRegistered(Name ntName);
 
     /**
      * Called when a node type has been re-registered.
      *
      * @param ntName name of the node type that has been registered
      */
-    void nodeTypeReRegistered(QName ntName);
+    void nodeTypeReRegistered(Name ntName);
 
     /**
      * Called when a node type has been deregistered.
      *
      * @param ntName name of the node type that has been unregistered
      */
-    void nodeTypeUnregistered(QName ntName);
+    void nodeTypeUnregistered(Name ntName);
 }
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefImpl.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -30,7 +31,7 @@
     /**
      * The name of the default primary type.
      */
-    private QName defaultPrimaryType;
+    private Name defaultPrimaryType;
 
     /**
      * The names of the required primary types.
@@ -55,7 +56,7 @@
     public NodeDefImpl() {
         defaultPrimaryType = null;
         requiredPrimaryTypes = new HashSet();
-        requiredPrimaryTypes.add(QName.NT_BASE);
+        requiredPrimaryTypes.add(NameConstants.NT_BASE);
         allowsSameNameSiblings = false;
         id = null;
     }
@@ -65,7 +66,7 @@
      *
      * @param defaultNodeType
      */
-    public void setDefaultPrimaryType(QName defaultNodeType) {
+    public void setDefaultPrimaryType(Name defaultNodeType) {
         // reset id field in order to force lazy recomputation of identifier
         id = null;
         this.defaultPrimaryType = defaultNodeType;
@@ -76,7 +77,7 @@
      *
      * @param requiredPrimaryTypes
      */
-    public void setRequiredPrimaryTypes(QName[] requiredPrimaryTypes) {
+    public void setRequiredPrimaryTypes(Name[] requiredPrimaryTypes) {
         if (requiredPrimaryTypes == null) {
             throw new IllegalArgumentException("requiredPrimaryTypes can not be null");
         }
@@ -101,7 +102,7 @@
     /**
      * {@inheritDoc}
      */
-    public void setDeclaringNodeType(QName declaringNodeType) {
+    public void setDeclaringNodeType(Name declaringNodeType) {
         // reset id field in order to force lazy recomputation of identifier
         id = null;
         super.setDeclaringNodeType(declaringNodeType);
@@ -110,7 +111,7 @@
     /**
      * {@inheritDoc}
      */
-    public void setName(QName name) {
+    public void setName(Name name) {
         // reset id field in order to force lazy recomputation of identifier
         id = null;
         super.setName(name);
@@ -171,19 +172,19 @@
     /**
      * {@inheritDoc}
      */
-    public QName getDefaultPrimaryType() {
+    public Name getDefaultPrimaryType() {
         return defaultPrimaryType;
     }
 
     /**
      * {@inheritDoc}
      */
-    public QName[] getRequiredPrimaryTypes() {
+    public Name[] getRequiredPrimaryTypes() {
         if (requiredPrimaryTypes.isEmpty()) {
-            return QName.EMPTY_ARRAY;
+            return Name.EMPTY_ARRAY;
         }
-        return (QName[]) requiredPrimaryTypes.toArray(
-                new QName[requiredPrimaryTypes.size()]);
+        return (Name[]) requiredPrimaryTypes.toArray(
+                new Name[requiredPrimaryTypes.size()]);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCache.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCache.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeTypeCache.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.nodetype;
 
 import org.apache.jackrabbit.core.util.Dumpable;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * <code>EffectiveNodeTypeCache</code> defines the interface for a cache for
@@ -61,14 +61,14 @@
      * @param ntNames the array of node type names for the effective node type
      * @return the key to an effective node type.
      */
-    Key getKey(QName[] ntNames);
+    Key getKey(Name[] ntNames);
 
     /**
      * Removes all effective node types that are aggregated with the node type
      * of the given name.
      * @param name the name of the node type.
      */
-    void invalidate(QName name);
+    void invalidate(Name name);
 
     /**
      * {@inheritDoc}
@@ -96,7 +96,7 @@
          * Returns the node type names of this key.
          * @return the node type names of this key.
          */
-        QName[] getNames();
+        Name[] getNames();
 
         /**
          * Checks if the <code>otherKey</code> is contained in this one. I.e. if
Index: src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/PropDef.java	(working copy)
@@ -20,7 +20,7 @@
 
 /**
  * <code>PropDef</code> is the internal representation of
- * a property definition. It refers to <code>QName</code>s only
+ * a property definition. It refers to <code>Name</code>s only
  * and is thus isolated from session-specific namespace mappings.
  *
  * @see javax.jcr.nodetype.PropertyDefinition
Index: src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefImpl.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.version.OnParentVersionAction;
 
@@ -30,12 +30,12 @@
     /**
      * The name of the child item.
      */
-    private QName name = ItemDef.ANY_NAME;
+    private Name name = ItemDef.ANY_NAME;
 
     /**
      * The name of the declaring node type.
      */
-    protected QName declaringNodeType = null;
+    protected Name declaringNodeType = null;
 
     /**
      * The 'autoCreated' flag.
@@ -69,7 +69,7 @@
      * @param declaringNodeType name of the declaring node type (must not be
      *                          <code>null</code>)
      */
-    public void setDeclaringNodeType(QName declaringNodeType) {
+    public void setDeclaringNodeType(Name declaringNodeType) {
         if (declaringNodeType == null) {
             throw new IllegalArgumentException("declaringNodeType can not be null");
         }
@@ -81,7 +81,7 @@
      *
      * @param name name of child item (must not be  <code>null</code>)
      */
-    public void setName(QName name) {
+    public void setName(Name name) {
         if (name == null) {
             throw new IllegalArgumentException("name can not be null");
         }
@@ -136,14 +136,14 @@
     /**
      * {@inheritDoc}
      */
-    public QName getDeclaringNodeType() {
+    public Name getDeclaringNodeType() {
         return declaringNodeType;
     }
 
     /**
      * {@inheritDoc}
      */
-    public QName getName() {
+    public Name getName() {
         return name;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java	(working copy)
@@ -17,13 +17,12 @@
 package org.apache.jackrabbit.core.nodetype;
 
 import org.apache.commons.collections.map.ReferenceMap;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.UnknownPrefixException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.jackrabbit.util.IteratorHelper;
-import org.apache.jackrabbit.util.name.NamespaceMapping;
+import org.apache.jackrabbit.namespace.NamespaceMapping;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 import org.apache.jackrabbit.api.JackrabbitNodeTypeManager;
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
 import org.apache.jackrabbit.core.data.DataStore;
@@ -36,6 +35,7 @@
 
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.NamespaceException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.NodeTypeIterator;
@@ -81,11 +81,16 @@
     private final NodeDefinitionImpl rootNodeDef;
 
     /**
-     * The namespace resolver used to translate qualified names to JCR names.
+     * The namespace resolver
      */
     private final NamespaceResolver nsResolver;
 
     /**
+     * The resolver used to translate qualified names to JCR names.
+     */
+    private final NamePathResolver resolver;
+
+    /**
      * A cache for <code>NodeType</code> instances created by this
      * <code>NodeTypeManager</code>
      */
@@ -110,12 +115,13 @@
      *
      * @param ntReg      node type registry
      * @param nsReg      namespace registry
-     * @param nsResolver namespace resolver
+     * @param resolver
      */
     public NodeTypeManagerImpl(
             NodeTypeRegistry ntReg, NamespaceRegistryImpl nsReg,
-            NamespaceResolver nsResolver, DataStore store) {
+            NamespaceResolver nsResolver, NamePathResolver resolver, DataStore store) {
         this.nsResolver = nsResolver;
+        this.resolver = resolver;
         this.ntReg = ntReg;
         this.nsReg = nsReg;
         this.ntReg.addListener(this);
@@ -128,7 +134,7 @@
         ndCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);
 
         rootNodeDef = new NodeDefinitionImpl(ntReg.getRootNodeDef(), this,
-                nsResolver);
+                resolver);
         ndCache.put(rootNodeDef.unwrap().getId(), rootNodeDef);
     }
 
@@ -149,7 +155,7 @@
             if (ndi == null) {
                 NodeDef nd = ntReg.getNodeDef(id);
                 if (nd != null) {
-                    ndi = new NodeDefinitionImpl(nd, this, nsResolver);
+                    ndi = new NodeDefinitionImpl(nd, this, resolver);
                     ndCache.put(id, ndi);
                 }
             }
@@ -167,7 +173,7 @@
             if (pdi == null) {
                 PropDef pd = ntReg.getPropDef(id);
                 if (pd != null) {
-                    pdi = new PropertyDefinitionImpl(pd, this, nsResolver);
+                    pdi = new PropertyDefinitionImpl(pd, this, resolver);
                     pdCache.put(id, pdi);
                 }
             }
@@ -180,13 +186,13 @@
      * @return
      * @throws NoSuchNodeTypeException
      */
-    public NodeTypeImpl getNodeType(QName name) throws NoSuchNodeTypeException {
+    public NodeTypeImpl getNodeType(Name name) throws NoSuchNodeTypeException {
         synchronized (ntCache) {
             NodeTypeImpl nt = (NodeTypeImpl) ntCache.get(name);
             if (nt == null) {
                 EffectiveNodeType ent = ntReg.getEffectiveNodeType(name);
                 NodeTypeDef def = ntReg.getNodeTypeDef(name);
-                nt = new NodeTypeImpl(ent, def, this, nsResolver, store);
+                nt = new NodeTypeImpl(ent, def, this, resolver, store);
                 ntCache.put(name, nt);
             }
             return nt;
@@ -307,14 +313,14 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeRegistered(QName ntName) {
+    public void nodeTypeRegistered(Name ntName) {
         // not interested, ignore
     }
 
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeReRegistered(QName ntName) {
+    public void nodeTypeReRegistered(Name ntName) {
         // flush all affected cache entries
         ntCache.remove(ntName);
         synchronized (pdCache) {
@@ -340,7 +346,7 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeTypeUnregistered(QName ntName) {
+    public void nodeTypeUnregistered(Name ntName) {
         // flush all affected cache entries
         ntCache.remove(ntName);
         synchronized (pdCache) {
@@ -368,7 +374,7 @@
      * {@inheritDoc}
      */
     public NodeTypeIterator getAllNodeTypes() throws RepositoryException {
-        QName[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = ntReg.getRegisteredNodeTypes();
         ArrayList list = new ArrayList(ntNames.length);
         for (int i = 0; i < ntNames.length; i++) {
             list.add(getNodeType(ntNames[i]));
@@ -380,7 +386,7 @@
      * {@inheritDoc}
      */
     public NodeTypeIterator getPrimaryNodeTypes() throws RepositoryException {
-        QName[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = ntReg.getRegisteredNodeTypes();
         ArrayList list = new ArrayList(ntNames.length);
         for (int i = 0; i < ntNames.length; i++) {
             NodeType nt = getNodeType(ntNames[i]);
@@ -395,7 +401,7 @@
      * {@inheritDoc}
      */
     public NodeTypeIterator getMixinNodeTypes() throws RepositoryException {
-        QName[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = ntReg.getRegisteredNodeTypes();
         ArrayList list = new ArrayList(ntNames.length);
         for (int i = 0; i < ntNames.length; i++) {
             NodeType nt = getNodeType(ntNames[i]);
@@ -412,9 +418,11 @@
     public NodeType getNodeType(String nodeTypeName)
             throws NoSuchNodeTypeException {
         try {
-            return getNodeType(NameFormat.parse(nodeTypeName, nsResolver));
+            return getNodeType(resolver.getQName(nodeTypeName));
         } catch (NameException e) {
             throw new NoSuchNodeTypeException(nodeTypeName, e);
+        } catch (NamespaceException e) {
+            throw new NoSuchNodeTypeException(nodeTypeName, e);
         }
     }
 
@@ -490,9 +498,9 @@
      */
     public boolean hasNodeType(String name) throws RepositoryException {
         try {
-            QName qname = NameFormat.parse(name, nsResolver);
+            Name qname = resolver.getQName(name);
             return getNodeTypeRegistry().isRegistered(qname);
-        } catch (UnknownPrefixException e) {
+        } catch (NamespaceException e) {
             return false;
         } catch (NameException e) {
            throw new RepositoryException("Invalid name: " + name, e);
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeDef.java	(working copy)
@@ -16,11 +16,11 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * <code>NodeDef</code> is the internal representation of
- * a node definition. It refers to <code>QName</code>s only
+ * a node definition. It refers to <code>Name</code>s only
  * and is thus isolated from session-specific namespace mappings.
  *
  * @see javax.jcr.nodetype.NodeDefinition
@@ -41,14 +41,14 @@
      *
      * @return the name of the default primary type.
      */
-    QName getDefaultPrimaryType();
+    Name getDefaultPrimaryType();
 
     /**
      * Returns the array of names of the required primary types.
      *
      * @return the array of names of the required primary types.
      */
-    QName[] getRequiredPrimaryTypes();
+    Name[] getRequiredPrimaryTypes();
 
     /**
      * Reports whether this node can have same-name siblings.
Index: src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java	(working copy)
@@ -25,11 +25,13 @@
 import org.apache.jackrabbit.core.nodetype.PropDefImpl;
 import org.apache.jackrabbit.core.nodetype.ValueConstraint;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.util.name.NamespaceMapping;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.namespace.NamespaceMapping;
 import org.apache.jackrabbit.util.ISO9075;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
@@ -38,6 +40,7 @@
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.ValueFormatException;
+import javax.jcr.Value;
 import javax.jcr.version.OnParentVersionAction;
 import java.io.Reader;
 import java.util.ArrayList;
@@ -135,6 +138,11 @@
     private NamespaceMapping nsMapping;
 
     /**
+     * Name and Path resolver
+     */
+    private NamePathResolver resolver;
+
+    /**
      * the underlying lexer
      */
     private Lexer lexer;
@@ -165,6 +173,7 @@
             throws ParseException {
         lexer = new Lexer(r, systemId);
         this.nsMapping = mapping;
+        this.resolver = new DefaultNamePathResolver(nsMapping);
         nextToken();
         parse();
     }
@@ -281,7 +290,7 @@
             supertypes.add(toQName(currentToken));
             nextToken();
         } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        ntd.setSupertypes((QName[]) supertypes.toArray(new QName[0]));
+        ntd.setSupertypes((Name[]) supertypes.toArray(new Name[0]));
     }
 
     /**
@@ -345,7 +354,7 @@
                 ndi.setOnParentVersion(OnParentVersionAction.COPY);
                 ndi.setProtected(false);
                 ndi.setDefaultPrimaryType(null);
-                ndi.setRequiredPrimaryTypes(new QName[]{QName.NT_BASE});
+                ndi.setRequiredPrimaryTypes(new Name[]{NameConstants.NT_BASE});
 
                 nextToken();
                 doChildNodeDefinition(ndi, ntd);
@@ -437,8 +446,8 @@
                 if (ntd.getPrimaryItemName() != null) {
                     String name = null;
                     try {
-                        name = NameFormat.format(ntd.getName(), nsMapping);
-                    } catch (NoPrefixDeclaredException e) {
+                        name = resolver.getJCRName(ntd.getName());
+                    } catch (NamespaceException e) {
                         // Should never happen, checked earlier
                     }
                     lexer.fail("More than one primary item specified in node type '" + name + "'");
@@ -484,9 +493,10 @@
             nextToken();
             InternalValue value = null;
             try {
-                value = InternalValue.create(ValueHelper.convert(
+                Value v = ValueHelper.convert(
                         currentToken, pdi.getRequiredType(),
-                        ValueFactoryImpl.getInstance()), nsMapping);
+                        ValueFactoryImpl.getInstance());
+                value = InternalValue.create(v, resolver);
             } catch (ValueFormatException e) {
                 lexer.fail("'" + currentToken + "' is not a valid string representation of a value of type " + pdi.getRequiredType());
             } catch (RepositoryException e) {
@@ -513,7 +523,7 @@
             nextToken();
             ValueConstraint constraint = null;
             try {
-                constraint = ValueConstraint.create(pdi.getRequiredType(), currentToken, nsMapping);
+                constraint = ValueConstraint.create(pdi.getRequiredType(), currentToken, resolver);
             } catch (InvalidConstraintException e) {
                 lexer.fail("'" + currentToken + "' is not a valid constraint expression for a value of type " + pdi.getRequiredType());
             }
@@ -559,7 +569,7 @@
             types.add(toQName(currentToken));
             nextToken();
         } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        ndi.setRequiredPrimaryTypes((QName[]) types.toArray(new QName[0]));
+        ndi.setRequiredPrimaryTypes((Name[]) types.toArray(new Name[0]));
         nextToken();
     }
 
@@ -591,8 +601,8 @@
                 if (ntd.getPrimaryItemName() != null) {
                     String name = null;
                     try {
-                        name = NameFormat.format(ntd.getName(), nsMapping);
-                    } catch (NoPrefixDeclaredException e) {
+                        name = resolver.getJCRName(ntd.getName());
+                    } catch (NamespaceException e) {
                         // Should never happen, checked earlier
                     }
                     lexer.fail("More than one primary item specified in node type '" + name + "'");
@@ -631,12 +641,17 @@
      * @return the qualified name
      * @throws ParseException if the conversion fails
      */
-    private QName toQName(String stringName) throws ParseException {
+    private Name toQName(String stringName) throws ParseException {
         try {
-            return ISO9075.decode(NameFormat.parse(stringName, nsMapping));
+            Name n = resolver.getQName(stringName);
+            String decodedLocalName = ISO9075.decode(n.getLocalName());
+            return NameFactoryImpl.getInstance().create(n.getNamespaceURI(), decodedLocalName);
         } catch (NameException e) {
             lexer.fail("Error while parsing '" + stringName + "'", e);
             return null;
+        } catch (NamespaceException e) {
+            lexer.fail("Error while parsing '" + stringName + "'", e);
+            return null;
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java	(working copy)
@@ -34,9 +34,10 @@
 import org.apache.jackrabbit.core.nodetype.ValueConstraint;
 import org.apache.jackrabbit.core.nodetype.ItemDef;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO9075;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 /**
  * Prints node type defs in a compact notation
@@ -63,6 +64,11 @@
     private final NamespaceResolver resolver;
 
     /**
+     * the current name/path resolver
+     */
+    private final NamePathResolver npResolver;
+
+    /**
      * the underlying writer
      */
     private Writer out;
@@ -82,9 +88,10 @@
      *
      * @param out the underlying writer
      * @param r the namespace resolver
+     * @param npResolver
      */
-    public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r) {
-        this(out, r, false);
+    public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r, NamePathResolver npResolver) {
+        this(out, r, npResolver, false);
     }
 
     /**
@@ -92,11 +99,12 @@
      *
      * @param out the underlaying writer
      * @param r the naespace resolver
+     * @param npResolver
      * @param includeNS if <code>true</code> all used namespace decl. are also
-     *        written.
      */
-    public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r, boolean includeNS) {
+    public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r, NamePathResolver npResolver, boolean includeNS) {
         this.resolver = r;
+        this.npResolver = npResolver;
         if (includeNS) {
             this.out = new StringWriter();
             this.nsWriter = out;
@@ -112,12 +120,13 @@
      *
      * @param l
      * @param r
+     * @param npResolver
      * @param out
      * @throws IOException
      */
-    public static void write(List l, NamespaceResolver r, Writer out)
+    public static void write(List l, NamespaceResolver r, NamePathResolver npResolver, Writer out)
             throws IOException {
-        CompactNodeTypeDefWriter w = new CompactNodeTypeDefWriter(out, r, true);
+        CompactNodeTypeDefWriter w = new CompactNodeTypeDefWriter(out, r, npResolver, true);
         Iterator iter = l.iterator();
         while (iter.hasNext()) {
             NodeTypeDef def = (NodeTypeDef) iter.next();
@@ -172,7 +181,7 @@
      * write supertypes
      */
     private void writeSupertypes(NodeTypeDef ntd) throws IOException {
-        QName[] sta = ntd.getSupertypes();
+        Name[] sta = ntd.getSupertypes();
         String delim = " > ";
         for (int i = 0; i < sta.length; i++) {
             out.write(delim);
@@ -260,7 +269,7 @@
             for (int i = 0; i < dva.length; i++) {
                 out.write(delim);
                 try {
-                    out.write(escape(dva[i].toJCRValue(resolver).getString()));
+                    out.write(escape(dva[i].toJCRValue(npResolver).getString()));
                 } catch (RepositoryException e) {
                     out.write(escape(dva[i].toString()));
                 }
@@ -276,12 +285,12 @@
      */
     private void writeValueConstraints(ValueConstraint[] vca) throws IOException {
         if (vca != null && vca.length > 0) {
-            String vc = vca[0].getDefinition(resolver);
+            String vc = vca[0].getDefinition(npResolver);
             out.write(" < '");
             out.write(escape(vc));
             out.write("'");
             for (int i = 1; i < vca.length; i++) {
-                vc = vca[i].getDefinition(resolver);
+                vc = vca[i].getDefinition(npResolver);
                 out.write(", '");
                 out.write(escape(vc));
                 out.write("'");
@@ -296,7 +305,7 @@
     private void writeNodeDef(NodeTypeDef ntd, NodeDef nd) throws IOException {
         out.write("\n" + INDENT + "+ ");
 
-        QName name = nd.getName();
+        Name name = nd.getName();
         if (name.equals(ItemDef.ANY_NAME)) {
             out.write('*');
         } else {
@@ -328,14 +337,14 @@
      * @param name
      * @throws IOException
      */
-    private void writeItemDefName(QName name) throws IOException {
+    private void writeItemDefName(Name name) throws IOException {
         out.write(resolve(name));
     }
     /**
      * write required types
      * @param reqTypes
      */
-    private void writeRequiredTypes(QName[] reqTypes) throws IOException {
+    private void writeRequiredTypes(Name[] reqTypes) throws IOException {
         if (reqTypes != null && reqTypes.length > 0) {
             String delim = " (";
             for (int i = 0; i < reqTypes.length; i++) {
@@ -351,7 +360,7 @@
      * write default types
      * @param defType
      */
-    private void writeDefaultType(QName defType) throws IOException {
+    private void writeDefaultType(Name defType) throws IOException {
         if (defType != null && !defType.getLocalName().equals("*")) {
             out.write(" = ");
             out.write(resolve(defType));
@@ -363,13 +372,13 @@
      * @param qname
      * @return the resolved name
      */
-    private String resolve(QName qname) throws IOException {
+    private String resolve(Name qname) throws IOException {
         if (qname == null) {
             return "";
         }
         try {
             String prefix = resolver.getPrefix(qname.getNamespaceURI());
-            if (prefix != null && !prefix.equals(QName.NS_EMPTY_PREFIX)) {
+            if (prefix != null && !prefix.equals(Name.NS_EMPTY_PREFIX)) {
                 // check for writing namespaces
                 if (nsWriter != null) {
                     if (!usedNamespaces.contains(prefix)) {
@@ -384,7 +393,8 @@
                 prefix += ":";
             }
 
-            String resolvedName = prefix + ISO9075.encode(qname).getLocalName();
+            String encLocalName = ISO9075.encode(qname.getLocalName());
+            String resolvedName = prefix + encLocalName;
 
             // check for '-' and '+'
             if (resolvedName.indexOf('-') >= 0 || resolvedName.indexOf('+') >= 0) {
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java	(working copy)
@@ -18,11 +18,9 @@
 
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
 import org.slf4j.Logger;
@@ -31,6 +29,7 @@
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
+import javax.jcr.NamespaceException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
@@ -49,8 +48,8 @@
     private final NodeTypeDef ntd;
     private final EffectiveNodeType ent;
     private final NodeTypeManagerImpl ntMgr;
-    // namespace resolver used to translate qualified names to JCR names
-    private final NamespaceResolver nsResolver;
+    // resolver used to translate qualified names to JCR names
+    private final NamePathResolver resolver;
     private final DataStore store;    
 
     /**
@@ -63,13 +62,13 @@
      * @param ent        the effective (i.e. merged and resolved) node type representation
      * @param ntd        the definition of this node type
      * @param ntMgr      the node type manager associated with this node type
-     * @param nsResolver namespace resolver
+     * @param resolver
      */
     NodeTypeImpl(EffectiveNodeType ent, NodeTypeDef ntd,
-                 NodeTypeManagerImpl ntMgr, NamespaceResolver nsResolver, DataStore store) {
+                 NodeTypeManagerImpl ntMgr, NamePathResolver resolver, DataStore store) {
         this.ent = ent;
         this.ntMgr = ntMgr;
-        this.nsResolver = nsResolver;
+        this.resolver = resolver;
         this.ntd = ntd;
         this.store = store;
     }
@@ -82,7 +81,7 @@
      * @return true if this node type is directly or indirectly derived from the
      *         specified node type, otherwise false.
      */
-    public boolean isDerivedFrom(QName nodeTypeName) {
+    public boolean isDerivedFrom(Name nodeTypeName) {
         return !nodeTypeName.equals(ntd.getName()) && ent.includesNodeType(nodeTypeName);
     }
 
@@ -173,7 +172,7 @@
      *
      * @return the qualified name
      */
-    public QName getQName() {
+    public Name getQName() {
         return ntd.getName();
     }
 
@@ -186,7 +185,7 @@
      */
     public NodeType[] getInheritedSupertypes() {
         // declared supertypes
-        QName[] ntNames = ntd.getSupertypes();
+        Name[] ntNames = ntd.getSupertypes();
         HashSet declared = new HashSet();
         for (int i = 0; i < ntNames.length; i++) {
             declared.add(ntNames[i]);
@@ -217,10 +216,10 @@
      */
     public String getName() {
         try {
-            return NameFormat.format(ntd.getName(), nsResolver);
-        } catch (NoPrefixDeclaredException npde) {
+            return resolver.getJCRName(ntd.getName());
+        } catch (NamespaceException e) {
             // should never get here
-            log.error("encountered unregistered namespace in node type name", npde);
+            log.error("encountered unregistered namespace in node type name", e);
             return ntd.getName().toString();
         }
     }
@@ -230,15 +229,15 @@
      */
     public String getPrimaryItemName() {
         try {
-            QName piName = ntd.getPrimaryItemName();
+            Name piName = ntd.getPrimaryItemName();
             if (piName != null) {
-                return NameFormat.format(piName, nsResolver);
+                return resolver.getJCRName(piName);
             } else {
                 return null;
             }
-        } catch (NoPrefixDeclaredException npde) {
+        } catch (NamespaceException e) {
             // should never get here
-            log.error("encountered unregistered namespace in name of primary item", npde);
+            log.error("encountered unregistered namespace in name of primary item", e);
             return ntd.getName().toString();
         }
     }
@@ -254,9 +253,12 @@
      * {@inheritDoc}
      */
     public boolean isNodeType(String nodeTypeName) {
-        QName ntName;
+        Name ntName;
         try {
-            ntName = NameFormat.parse(nodeTypeName, nsResolver);
+            ntName = resolver.getQName(nodeTypeName);
+        } catch (NamespaceException e) {
+            log.warn("invalid node type name: " + nodeTypeName, e);
+            return false;
         } catch (NameException e) {
             log.warn("invalid node type name: " + nodeTypeName, e);
             return false;
@@ -275,7 +277,7 @@
      * {@inheritDoc}
      */
     public NodeType[] getSupertypes() {
-        QName[] ntNames = ent.getInheritedNodeTypes();
+        Name[] ntNames = ent.getInheritedNodeTypes();
         NodeType[] supertypes = new NodeType[ntNames.length];
         for (int i = 0; i < ntNames.length; i++) {
             try {
@@ -317,7 +319,7 @@
      * {@inheritDoc}
      */
     public NodeType[] getDeclaredSupertypes() {
-        QName[] ntNames = ntd.getSupertypes();
+        Name[] ntNames = ntd.getSupertypes();
         NodeType[] supertypes = new NodeType[ntNames.length];
         for (int i = 0; i < ntNames.length; i++) {
             try {
@@ -352,7 +354,7 @@
             return canRemoveItem(propertyName);
         }
         try {
-            QName name = NameFormat.parse(propertyName, nsResolver);
+            Name name = resolver.getQName(propertyName);
             PropDef def;
             try {
                 // try to get definition that matches the given value type
@@ -384,10 +386,10 @@
                 Value targetVal = ValueHelper.convert(
                         value, targetType,
                         ValueFactoryImpl.getInstance());
-                internalValue = InternalValue.create(targetVal, nsResolver, store);
+                internalValue = InternalValue.create(targetVal, resolver, store);
             } else {
                 // no type conversion required
-                internalValue = InternalValue.create(value, nsResolver, store);
+                internalValue = InternalValue.create(value, resolver, store);
             }
             EffectiveNodeType.checkSetPropertyValueConstraints(
                     def, new InternalValue[]{internalValue});
@@ -409,7 +411,7 @@
             return canRemoveItem(propertyName);
         }
         try {
-            QName name = NameFormat.parse(propertyName, nsResolver);
+            Name name = resolver.getQName(propertyName);
             // determine type of values
             int type = PropertyType.UNDEFINED;
             for (int i = 0; i < values.length; i++) {
@@ -462,10 +464,10 @@
                         Value targetVal = ValueHelper.convert(
                                 values[i], targetType,
                                 ValueFactoryImpl.getInstance());
-                        internalValue = InternalValue.create(targetVal, nsResolver, store);
+                        internalValue = InternalValue.create(targetVal, resolver, store);
                     } else {
                         // no type conversion required
-                        internalValue = InternalValue.create(values[i], nsResolver, store);
+                        internalValue = InternalValue.create(values[i], resolver, store);
                     }
                     list.add(internalValue);
                 }
@@ -487,7 +489,7 @@
      */
     public boolean canAddChildNode(String childNodeName) {
         try {
-            ent.checkAddNodeConstraints(NameFormat.parse(childNodeName, nsResolver));
+            ent.checkAddNodeConstraints(resolver.getQName(childNodeName));
             return true;
         } catch (NameException be) {
             // implementation specific exception, fall through
@@ -503,8 +505,8 @@
     public boolean canAddChildNode(String childNodeName, String nodeTypeName) {
         try {
             ent.checkAddNodeConstraints(
-                    NameFormat.parse(childNodeName, nsResolver),
-                    NameFormat.parse(nodeTypeName, nsResolver),
+                    resolver.getQName(childNodeName),
+                    resolver.getQName(nodeTypeName),
                     ntMgr.getNodeTypeRegistry());
             return true;
         } catch (NameException be) {
@@ -520,7 +522,7 @@
      */
     public boolean canRemoveItem(String itemName) {
         try {
-            ent.checkRemoveItemConstraints(NameFormat.parse(itemName, nsResolver));
+            ent.checkRemoveItemConstraints(resolver.getQName(itemName));
             return true;
         } catch (NameException be) {
             // implementation specific exception, fall through
@@ -554,7 +556,7 @@
      */
     public boolean canRemoveNode(String nodeName) {
         try {
-            ent.checkRemoveNodeConstraints(NameFormat.parse(nodeName, nsResolver));
+            ent.checkRemoveNodeConstraints(resolver.getQName(nodeName));
             return true;
         } catch (NameException be) {
             // implementation specific exception, fall through
@@ -575,7 +577,7 @@
      */
     public boolean canRemoveProperty(String propertyName) {
         try {
-            ent.checkRemovePropertyConstraints(NameFormat.parse(propertyName, nsResolver));
+            ent.checkRemovePropertyConstraints(resolver.getQName(propertyName));
             return true;
         } catch (NameException be) {
             // implementation specific exception, fall through
Index: src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/ItemDef.java	(working copy)
@@ -16,11 +16,12 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 
 /**
  * <code>ItemDef</code> is the internal representation of
- * an item definition. It refers to <code>QName</code>s only
+ * an item definition. It refers to <code>Name</code>s only
  * and is thus isolated from session-specific namespace mappings.
  *
  * @see javax.jcr.nodetype.ItemDefinition
@@ -32,21 +33,21 @@
     /**
      * The special wildcard name used as the name of residual item definitions.
      */
-    QName ANY_NAME = new QName("", "*");
+    Name ANY_NAME = NameConstants.ANY_NAME;
 
     /**
      * Gets the name of the child item.
      *
      * @return the name of the child item.
      */
-    QName getName();
+    Name getName();
 
     /**
      * Gets the name of the declaring node type.
      *
      * @return the name of the declaring node type.
      */
-    QName getDeclaringNodeType();
+    Name getDeclaringNodeType();
 
     /**
      * Determines whether the item is 'autoCreated'.
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	(working copy)
@@ -25,7 +25,8 @@
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.util.Dumpable;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -126,8 +127,8 @@
      *
      * @return the names of all registered node types.
      */
-    public QName[] getRegisteredNodeTypes() {
-        return (QName[]) registeredNTDefs.keySet().toArray(new QName[registeredNTDefs.size()]);
+    public Name[] getRegisteredNodeTypes() {
+        return (Name[]) registeredNTDefs.keySet().toArray(new Name[registeredNTDefs.size()]);
     }
 
     /**
@@ -239,18 +240,18 @@
     }
 
     /**
-     * Same as <code>{@link #unregisterNodeType(QName)}</code> except
+     * Same as <code>{@link #unregisterNodeType(Name)}</code> except
      * that a set of node types is unregistered instead of just one.
      * <p/>
      * This method can be used to unregister a set of node types that depend on
      * each other.
      *
-     * @param ntNames a collection of <code>QName</code> objects denoting the
+     * @param ntNames a collection of <code>Name</code> objects denoting the
      *                node types to be unregistered
      * @throws NoSuchNodeTypeException if any of the specified names does not
      *                                 denote a registered node type.
      * @throws RepositoryException if another error occurs
-     * @see #unregisterNodeType(QName)
+     * @see #unregisterNodeType(Name)
      */
     public void unregisterNodeTypes(Collection ntNames)
             throws NoSuchNodeTypeException, RepositoryException {
@@ -261,7 +262,7 @@
     /**
      * Internal implementation of {@link #unregisterNodeTypes(Collection)}
      *
-     * @param ntNames a collection of <code>QName</code> objects denoting the
+     * @param ntNames a collection of <code>Name</code> objects denoting the
      *                node types to be unregistered
      * @param external whether this invocation should be considered external
      * @throws NoSuchNodeTypeException if any of the specified names does not
@@ -273,7 +274,7 @@
 
         // do some preliminary checks
         for (Iterator iter = ntNames.iterator(); iter.hasNext();) {
-            QName ntName = (QName) iter.next();
+            Name ntName = (Name) iter.next();
             if (!registeredNTDefs.containsKey(ntName)) {
                 throw new NoSuchNodeTypeException(ntName.toString());
             }
@@ -298,7 +299,7 @@
 
         // make sure node types are not currently in use
         for (Iterator iter = ntNames.iterator(); iter.hasNext();) {
-            QName ntName = (QName) iter.next();
+            Name ntName = (Name) iter.next();
             checkForReferencesInContent(ntName);
         }
 
@@ -312,7 +313,7 @@
 
         // persist removal of node type definitions & notify listeners
         for (Iterator iter = ntNames.iterator(); iter.hasNext();) {
-            QName ntName = (QName) iter.next();
+            Name ntName = (Name) iter.next();
             customNTDefs.remove(ntName);
             notifyUnregistered(ntName);
         }
@@ -336,7 +337,7 @@
      * @throws RepositoryException if another error occurs.
      * @see #unregisterNodeTypes(Collection)
      */
-    public void unregisterNodeType(QName ntName)
+    public void unregisterNodeType(Name ntName)
             throws NoSuchNodeTypeException, RepositoryException {
         HashSet ntNames = new HashSet();
         ntNames.add(ntName);
@@ -377,7 +378,7 @@
             throws NoSuchNodeTypeException, InvalidNodeTypeDefException,
             RepositoryException {
 
-        QName name = ntd.getName();
+        Name name = ntd.getName();
         if (!registeredNTDefs.containsKey(name)) {
             throw new NoSuchNodeTypeException(name.toString());
         }
@@ -461,7 +462,7 @@
      * @return
      * @throws NoSuchNodeTypeException
      */
-    public EffectiveNodeType getEffectiveNodeType(QName ntName)
+    public EffectiveNodeType getEffectiveNodeType(Name ntName)
             throws NoSuchNodeTypeException {
         return getEffectiveNodeType(ntName, entCache, registeredNTDefs);
     }
@@ -472,7 +473,7 @@
      * @throws NodeTypeConflictException
      * @throws NoSuchNodeTypeException
      */
-    public EffectiveNodeType getEffectiveNodeType(QName[] ntNames)
+    public EffectiveNodeType getEffectiveNodeType(Name[] ntNames)
             throws NodeTypeConflictException, NoSuchNodeTypeException {
         return getEffectiveNodeType(ntNames, entCache, registeredNTDefs);
     }
@@ -482,10 +483,10 @@
      * dependencies on the given node type.
      *
      * @param nodeTypeName node type name
-     * @return a set of node type <code>QName</code>s
+     * @return a set of node type <code>Name</code>s
      * @throws NoSuchNodeTypeException
      */
-    public Set getDependentNodeTypes(QName nodeTypeName)
+    public Set getDependentNodeTypes(Name nodeTypeName)
             throws NoSuchNodeTypeException {
         if (!registeredNTDefs.containsKey(nodeTypeName)) {
             throw new NoSuchNodeTypeException(nodeTypeName.toString());
@@ -514,7 +515,7 @@
      * @throws NoSuchNodeTypeException if a node type with the given name
      *                                 does not exist
      */
-    public NodeTypeDef getNodeTypeDef(QName nodeTypeName)
+    public NodeTypeDef getNodeTypeDef(Name nodeTypeName)
             throws NoSuchNodeTypeException {
         NodeTypeDef def = (NodeTypeDef) registeredNTDefs.get(nodeTypeName);
         if (def == null) {
@@ -529,7 +530,7 @@
      * @return <code>true</code> if the specified node type is registered;
      *         <code>false</code> otherwise.
      */
-    public boolean isRegistered(QName nodeTypeName) {
+    public boolean isRegistered(Name nodeTypeName) {
         return registeredNTDefs.containsKey(nodeTypeName);
     }
 
@@ -538,7 +539,7 @@
      * @return <code>true</code> if the specified node type is built-in;
      *         <code>false</code> otherwise.
      */
-    public boolean isBuiltIn(QName nodeTypeName) {
+    public boolean isBuiltIn(Name nodeTypeName) {
         return builtInNTDefs.contains(nodeTypeName);
     }
 
@@ -592,7 +593,7 @@
         while (iter.hasNext()) {
             NodeTypeDef ntd = (NodeTypeDef) iter.next();
             ps.println(ntd.getName());
-            QName[] supertypes = ntd.getSupertypes();
+            Name[] supertypes = ntd.getSupertypes();
             ps.println("\tSupertypes");
             for (int i = 0; i < supertypes.length; i++) {
                 ps.println("\t\t" + supertypes[i]);
@@ -644,13 +645,13 @@
                 ps.print("\tNodeDefinition");
                 ps.println(" (declared in " + nd[i].getDeclaringNodeType() + ") id=" + nd[i].getId());
                 ps.println("\t\tName\t\t" + (nd[i].definesResidual() ? "*" : nd[i].getName().toString()));
-                QName[] reqPrimaryTypes = nd[i].getRequiredPrimaryTypes();
+                Name[] reqPrimaryTypes = nd[i].getRequiredPrimaryTypes();
                 if (reqPrimaryTypes != null && reqPrimaryTypes.length > 0) {
                     for (int n = 0; n < reqPrimaryTypes.length; n++) {
                         ps.print("\t\tRequiredPrimaryType\t" + reqPrimaryTypes[n]);
                     }
                 }
-                QName defPrimaryType = nd[i].getDefaultPrimaryType();
+                Name defPrimaryType = nd[i].getDefaultPrimaryType();
                 if (defPrimaryType != null) {
                     ps.print("\n\t\tDefaultPrimaryType\t" + defPrimaryType);
                 }
@@ -964,7 +965,7 @@
      *                             being referenced or if the check failed for
      *                             some other reason.
      */
-    protected void checkForReferencesInContent(QName nodeTypeName)
+    protected void checkForReferencesInContent(Name nodeTypeName)
             throws RepositoryException {
         throw new RepositoryException("not yet implemented");
     }
@@ -999,12 +1000,12 @@
      * @throws NoSuchNodeTypeException if a node type reference (e.g. a supertype)
      *                                 could not be resolved.
      */
-    static EffectiveNodeType getEffectiveNodeType(QName ntName,
+    static EffectiveNodeType getEffectiveNodeType(Name ntName,
                                                   EffectiveNodeTypeCache entCache,
                                                   Map ntdCache)
             throws NoSuchNodeTypeException {
         // 1. check if effective node type has already been built
-        EffectiveNodeTypeCache.Key key = entCache.getKey(new QName[]{ntName});
+        EffectiveNodeTypeCache.Key key = entCache.getKey(new Name[]{ntName});
         EffectiveNodeType ent = entCache.get(key);
         if (ent != null) {
             return ent;
@@ -1045,7 +1046,7 @@
      * @throws NoSuchNodeTypeException if a node type reference (e.g. a supertype)
      *                                 could not be resolved.
      */
-    static EffectiveNodeType getEffectiveNodeType(QName[] ntNames,
+    static EffectiveNodeType getEffectiveNodeType(Name[] ntNames,
                                                   EffectiveNodeTypeCache entCache,
                                                   Map ntdCache)
             throws NodeTypeConflictException, NoSuchNodeTypeException {
@@ -1088,7 +1089,7 @@
                      * no matching sub-aggregates found:
                      * build aggregate of remaining node types through iteration
                      */
-                    QName[] remainder = key.getNames();
+                    Name[] remainder = key.getNames();
                     for (int i = 0; i < remainder.length; i++) {
                         NodeTypeDef ntd = (NodeTypeDef) ntdCache.get(remainder[i]);
                         EffectiveNodeType ent =
@@ -1116,12 +1117,12 @@
         return result;
     }
 
-    static void checkForCircularInheritance(QName[] supertypes,
+    static void checkForCircularInheritance(Name[] supertypes,
                                             Stack inheritanceChain,
                                             Map ntDefCache)
             throws InvalidNodeTypeDefException, RepositoryException {
         for (int i = 0; i < supertypes.length; i++) {
-            QName nt = supertypes[i];
+            Name nt = supertypes[i];
             int pos = inheritanceChain.lastIndexOf(nt);
             if (pos >= 0) {
                 StringBuffer buf = new StringBuffer();
@@ -1140,7 +1141,7 @@
             try {
 
                 NodeTypeDef ntd = (NodeTypeDef) ntDefCache.get(nt);
-                QName[] sta = ntd.getSupertypes();
+                Name[] sta = ntd.getSupertypes();
                 if (sta.length > 0) {
                     // check recursively
                     inheritanceChain.push(nt);
@@ -1162,9 +1163,9 @@
             throws InvalidNodeTypeDefException {
         // check for circularity through default node types of auto-created child nodes
         // (node type 'a' defines auto-created child node with default node type 'a')
-        QName[] childNodeNTs = childNodeENT.getAllNodeTypes();
+        Name[] childNodeNTs = childNodeENT.getAllNodeTypes();
         for (int i = 0; i < childNodeNTs.length; i++) {
-            QName nt = childNodeNTs[i];
+            Name nt = childNodeNTs[i];
             int pos = definingParentNTs.lastIndexOf(nt);
             if (pos >= 0) {
                 StringBuffer buf = new StringBuffer();
@@ -1186,8 +1187,8 @@
 
         NodeDef[] nodeDefs = childNodeENT.getAutoCreateNodeDefs();
         for (int i = 0; i < nodeDefs.length; i++) {
-            QName dnt = nodeDefs[i].getDefaultPrimaryType();
-            QName definingNT = nodeDefs[i].getDeclaringNodeType();
+            Name dnt = nodeDefs[i].getDefaultPrimaryType();
+            Name definingNT = nodeDefs[i].getDeclaringNodeType();
             try {
                 if (dnt != null) {
                     // check recursively
@@ -1207,7 +1208,7 @@
 
     private EffectiveNodeType internalRegister(NodeTypeDef ntd)
             throws InvalidNodeTypeDefException, RepositoryException {
-        QName name = ntd.getName();
+        Name name = ntd.getName();
         if (name != null && registeredNTDefs.containsKey(name)) {
             String msg = name + " already exists";
             log.debug(msg);
@@ -1278,7 +1279,7 @@
         // and do some preliminary checks
         for (Iterator iter = ntDefs.iterator(); iter.hasNext();) {
             NodeTypeDef ntd = (NodeTypeDef) iter.next();
-            QName name = ntd.getName();
+            Name name = ntd.getName();
             if (name != null && registeredNTDefs.containsKey(name)) {
                 String msg = name + " already exists";
                 log.debug(msg);
@@ -1322,7 +1323,7 @@
         entCache = tmpENTCache;
     }
 
-    private void internalUnregister(QName name) throws NoSuchNodeTypeException {
+    private void internalUnregister(Name name) throws NoSuchNodeTypeException {
         NodeTypeDef ntd = (NodeTypeDef) registeredNTDefs.get(name);
         if (ntd == null) {
             throw new NoSuchNodeTypeException(name.toString());
@@ -1344,13 +1345,13 @@
     private void internalUnregister(Collection ntNames)
             throws NoSuchNodeTypeException {
         for (Iterator iter = ntNames.iterator(); iter.hasNext();) {
-            QName name = (QName) iter.next();
+            Name name = (Name) iter.next();
             internalUnregister(name);
         }
     }
 
     /**
-     * Utility method for verifying that the namespace of a <code>QName</code>
+     * Utility method for verifying that the namespace of a <code>Name</code>
      * is registered; a <code>null</code> argument is silently ignored.
      *
      * @param name name whose namespace is to be checked
@@ -1358,7 +1359,7 @@
      * @throws RepositoryException if the namespace of the given name is not
      *                             registered or if an unspecified error occured
      */
-    private static void checkNamespace(QName name, NamespaceRegistry nsReg)
+    private static void checkNamespace(Name name, NamespaceRegistry nsReg)
             throws RepositoryException {
         if (name != null) {
             // make sure namespace uri denotes a registered namespace
@@ -1396,7 +1397,7 @@
          */
         EffectiveNodeType ent = null;
 
-        QName name = ntd.getName();
+        Name name = ntd.getName();
         if (name == null) {
             String msg = "no name specified";
             log.debug(msg);
@@ -1405,7 +1406,7 @@
         checkNamespace(name, nsReg);
 
         // validate supertypes
-        QName[] supertypes = ntd.getSupertypes();
+        Name[] supertypes = ntd.getSupertypes();
         if (supertypes.length > 0) {
             for (int i = 0; i < supertypes.length; i++) {
                 checkNamespace(supertypes[i], nsReg);
@@ -1451,8 +1452,8 @@
             try {
                 EffectiveNodeType est = getEffectiveNodeType(supertypes, entCache, ntdCache);
                 // make sure that all primary types except nt:base extend from nt:base
-                if (!ntd.isMixin() && !QName.NT_BASE.equals(ntd.getName())
-                        && !est.includesNodeType(QName.NT_BASE)) {
+                if (!ntd.isMixin() && !NameConstants.NT_BASE.equals(ntd.getName())
+                        && !est.includesNodeType(NameConstants.NT_BASE)) {
                     String msg = "[" + name + "] all primary node types except"
                             + " nt:base itself must be (directly or indirectly) derived from nt:base";
                     log.debug(msg);
@@ -1571,7 +1572,7 @@
                 if (pd.getRequiredType() == PropertyType.REFERENCE) {
                     for (int j = 0; j < constraints.length; j++) {
                         ReferenceConstraint rc = (ReferenceConstraint) constraints[j];
-                        QName ntName = rc.getNodeTypeName();
+                        Name ntName = rc.getNodeTypeName();
                         if (!name.equals(ntName) && !ntdCache.containsKey(ntName)) {
                             String msg = "[" + name + "#" + pd.getName()
                                     + "] invalid REFERENCE value constraint '"
@@ -1615,7 +1616,7 @@
                 throw new InvalidNodeTypeDefException(msg);
             }
             // check default primary type
-            QName dpt = cnd.getDefaultPrimaryType();
+            Name dpt = cnd.getDefaultPrimaryType();
             checkNamespace(dpt, nsReg);
             boolean referenceToSelf = false;
             EffectiveNodeType defaultENT = null;
@@ -1674,10 +1675,10 @@
             }
 
             // check required primary types
-            QName[] reqTypes = cnd.getRequiredPrimaryTypes();
+            Name[] reqTypes = cnd.getRequiredPrimaryTypes();
             if (reqTypes != null && reqTypes.length > 0) {
                 for (int n = 0; n < reqTypes.length; n++) {
-                    QName rpt = reqTypes[n];
+                    Name rpt = reqTypes[n];
                     checkNamespace(rpt, nsReg);
                     referenceToSelf = false;
                     /**
@@ -1766,9 +1767,9 @@
 
         // FIXME need a fake declaring node type:
         // rep:root is not quite correct but better than a non-existing node type
-        def.setDeclaringNodeType(QName.REP_ROOT);
-        def.setRequiredPrimaryTypes(new QName[]{QName.REP_ROOT});
-        def.setDefaultPrimaryType(QName.REP_ROOT);
+        def.setDeclaringNodeType(NameConstants.REP_ROOT);
+        def.setRequiredPrimaryTypes(new Name[]{NameConstants.REP_ROOT});
+        def.setDefaultPrimaryType(NameConstants.REP_ROOT);
         def.setMandatory(true);
         def.setProtected(false);
         def.setOnParentVersion(OnParentVersionAction.VERSION);
@@ -1780,7 +1781,7 @@
     /**
      * Notify the listeners that a node type <code>ntName</code> has been registered.
      */
-    private void notifyRegistered(QName ntName) {
+    private void notifyRegistered(Name ntName) {
         // copy listeners to array to avoid ConcurrentModificationException
         NodeTypeRegistryListener[] la =
                 (NodeTypeRegistryListener[]) listeners.values().toArray(
@@ -1795,7 +1796,7 @@
     /**
      * Notify the listeners that a node type <code>ntName</code> has been re-registered.
      */
-    private void notifyReRegistered(QName ntName) {
+    private void notifyReRegistered(Name ntName) {
         // copy listeners to array to avoid ConcurrentModificationException
         NodeTypeRegistryListener[] la =
                 (NodeTypeRegistryListener[]) listeners.values().toArray(
@@ -1810,7 +1811,7 @@
     /**
      * Notify the listeners that a node type <code>ntName</code> has been unregistered.
      */
-    private void notifyUnregistered(QName ntName) {
+    private void notifyUnregistered(Name ntName) {
         // copy listeners to array to avoid ConcurrentModificationException
         NodeTypeRegistryListener[] la =
                 (NodeTypeRegistryListener[]) listeners.values().toArray(
Index: src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java	(working copy)
@@ -22,14 +22,15 @@
 import org.apache.jackrabbit.core.nodetype.ValueConstraint;
 import org.apache.jackrabbit.core.util.DOMBuilder;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import javax.jcr.version.OnParentVersionAction;
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
@@ -65,7 +66,7 @@
             writer.write(xml);
         } catch (ParserConfigurationException e) {
             throw new IOException(e.getMessage());
-        } catch (NoPrefixDeclaredException e) {
+        } catch (NamespaceException e) {
             throw new RepositoryException(
                     "Invalid namespace reference in a node type definition", e);
         }
@@ -75,7 +76,7 @@
     private final DOMBuilder builder;
 
     /** The namespace resolver. */
-    private final NamespaceResolver resolver;
+    private final NamePathResolver resolver;
 
     /**
      * Creates a node type definition file writer. The given namespace
@@ -99,7 +100,8 @@
             }
         }
 
-        resolver = new AdditionalNamespaceResolver(registry);
+        NamespaceResolver nsResolver = new AdditionalNamespaceResolver(registry);
+        resolver = new DefaultNamePathResolver(nsResolver);
     }
 
     /**
@@ -108,16 +110,16 @@
      * @param def node type definition
      * @throws RepositoryException       if the default property values
      *                                   cannot be serialized
-     * @throws NoPrefixDeclaredException if the node type definition contains
+     * @throws NamespaceException if the node type definition contains
      *                                   invalid namespace references
      */
     private void addNodeTypeDef(NodeTypeDef def)
-            throws RepositoryException, NoPrefixDeclaredException {
+            throws NamespaceException, RepositoryException {
         builder.startElement(Constants.NODETYPE_ELEMENT);
 
         // simple attributes
         builder.setAttribute(
-                Constants.NAME_ATTRIBUTE, NameFormat.format(def.getName(), resolver));
+                Constants.NAME_ATTRIBUTE, resolver.getJCRName(def.getName()));
         builder.setAttribute(
                 Constants.ISMIXIN_ATTRIBUTE, def.isMixin());
         builder.setAttribute(
@@ -125,23 +127,23 @@
                 def.hasOrderableChildNodes());
 
         // primary item name
-        QName item = def.getPrimaryItemName();
+        Name item = def.getPrimaryItemName();
         if (item != null) {
             builder.setAttribute(
                     Constants.PRIMARYITEMNAME_ATTRIBUTE,
-                    NameFormat.format(item, resolver));
+                    resolver.getJCRName(item));
         } else {
             builder.setAttribute(Constants.PRIMARYITEMNAME_ATTRIBUTE, "");
         }
 
         // supertype declarations
-        QName[] supertypes = def.getSupertypes();
+        Name[] supertypes = def.getSupertypes();
         if (supertypes.length > 0) {
             builder.startElement(Constants.SUPERTYPES_ELEMENT);
             for (int i = 0; i < supertypes.length; i++) {
                 builder.addContentElement(
                         Constants.SUPERTYPE_ELEMENT,
-                        NameFormat.format(supertypes[i], resolver));
+                        resolver.getJCRName(supertypes[i]));
             }
             builder.endElement();
         }
@@ -167,16 +169,16 @@
      * @param def property definition
      * @throws RepositoryException       if the default values cannot
      *                                   be serialized
-     * @throws NoPrefixDeclaredException if the property definition contains
+     * @throws NamespaceException if the property definition contains
      *                                   invalid namespace references
      */
     private void addPropDef(PropDef def)
-            throws RepositoryException, NoPrefixDeclaredException {
+            throws NamespaceException, RepositoryException {
         builder.startElement(Constants.PROPERTYDEFINITION_ELEMENT);
 
         // simple attributes
         builder.setAttribute(
-                Constants.NAME_ATTRIBUTE, NameFormat.format(def.getName(), resolver));
+                Constants.NAME_ATTRIBUTE, resolver.getJCRName(def.getName()));
         builder.setAttribute(
                 Constants.AUTOCREATED_ATTRIBUTE, def.isAutoCreated());
         builder.setAttribute(
@@ -223,16 +225,16 @@
      * Builds a child node definition element under the current element.
      *
      * @param def child node definition
-     * @throws NoPrefixDeclaredException if the child node definition contains
+     * @throws NamespaceException if the child node definition contains
      *                                   invalid namespace references
      */
     private void addChildNodeDef(NodeDef def)
-            throws NoPrefixDeclaredException {
+            throws NamespaceException {
         builder.startElement(Constants.CHILDNODEDEFINITION_ELEMENT);
 
         // simple attributes
         builder.setAttribute(
-                Constants.NAME_ATTRIBUTE, NameFormat.format(def.getName(), resolver));
+                Constants.NAME_ATTRIBUTE, resolver.getJCRName(def.getName()));
         builder.setAttribute(
                 Constants.AUTOCREATED_ATTRIBUTE, def.isAutoCreated());
         builder.setAttribute(
@@ -246,22 +248,22 @@
                 Constants.SAMENAMESIBLINGS_ATTRIBUTE, def.allowsSameNameSiblings());
 
         // default primary type
-        QName type = def.getDefaultPrimaryType();
+        Name type = def.getDefaultPrimaryType();
         if (type != null) {
             builder.setAttribute(
                     Constants.DEFAULTPRIMARYTYPE_ATTRIBUTE,
-                    NameFormat.format(type, resolver));
+                    resolver.getJCRName(type));
         } else {
             builder.setAttribute(Constants.DEFAULTPRIMARYTYPE_ATTRIBUTE, "");
         }
 
         // required primary types
-        QName[] requiredTypes = def.getRequiredPrimaryTypes();
+        Name[] requiredTypes = def.getRequiredPrimaryTypes();
         builder.startElement(Constants.REQUIREDPRIMARYTYPES_ELEMENT);
         for (int i = 0; i < requiredTypes.length; i++) {
             builder.addContentElement(
                     Constants.REQUIREDPRIMARYTYPE_ELEMENT,
-                    NameFormat.format(requiredTypes[i], resolver));
+                    resolver.getJCRName(requiredTypes[i]));
         }
         builder.endElement();
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/xml/AdditionalNamespaceResolver.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/xml/AdditionalNamespaceResolver.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/xml/AdditionalNamespaceResolver.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.nodetype.xml;
 
-import org.apache.jackrabbit.name.AbstractNamespaceResolver;
+import org.apache.jackrabbit.namespace.AbstractNamespaceResolver;
 
 import javax.jcr.NamespaceException;
 import javax.jcr.NamespaceRegistry;
Index: src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeReader.java	(working copy)
@@ -27,15 +27,17 @@
 import org.apache.jackrabbit.core.nodetype.ValueConstraint;
 import org.apache.jackrabbit.core.util.DOMWalker;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import javax.jcr.version.OnParentVersionAction;
 import java.io.IOException;
 import java.io.InputStream;
@@ -68,6 +70,9 @@
         } catch (NameException e) {
             throw new InvalidNodeTypeDefException(
                     "Invalid namespace reference in a node type definition", e);
+        } catch (NamespaceException e) {
+            throw new InvalidNodeTypeDefException(
+                    "Invalid namespace reference in a node type definition", e);
         }
     }
 
@@ -77,8 +82,8 @@
     /** The namespaces associated with the node type XML document. */
     private final Properties namespaces;
 
-    /** The namespace resolver. */
-    private final NamespaceResolver resolver;
+    /** The name, path resolver. */
+    private final NamePathResolver resolver;
 
     /**
      * Creates a node type definition file reader.
@@ -89,7 +94,8 @@
     public NodeTypeReader(InputStream xml) throws IOException {
         walker = new DOMWalker(xml);
         namespaces = walker.getNamespaces();
-        resolver = new AdditionalNamespaceResolver(namespaces);
+        NamespaceResolver nsResolver = new AdditionalNamespaceResolver(namespaces);
+        resolver = new DefaultNamePathResolver(nsResolver);
     }
 
     /**
@@ -110,7 +116,7 @@
      *                                     illegal name
      */
     public NodeTypeDef[] getNodeTypeDefs()
-            throws InvalidNodeTypeDefException, NameException {
+            throws InvalidNodeTypeDefException, NameException, NamespaceException {
         Vector defs = new Vector();
         while (walker.iterateElements(Constants.NODETYPE_ELEMENT)) {
             defs.add(getNodeTypeDef());
@@ -127,11 +133,11 @@
      *                                     illegal name
      */
     private NodeTypeDef getNodeTypeDef()
-            throws InvalidNodeTypeDefException, NameException {
+            throws InvalidNodeTypeDefException, NameException, NamespaceException {
         NodeTypeDef type = new NodeTypeDef();
 
-        type.setName(NameFormat.parse(
-                walker.getAttribute(Constants.NAME_ATTRIBUTE), resolver));
+        type.setName(resolver.getQName(
+                walker.getAttribute(Constants.NAME_ATTRIBUTE)));
         type.setMixin(Boolean.valueOf(
                 walker.getAttribute(Constants.ISMIXIN_ATTRIBUTE))
                 .booleanValue());
@@ -142,7 +148,7 @@
             walker.getAttribute(Constants.PRIMARYITEMNAME_ATTRIBUTE);
         if (primaryItemName != null && primaryItemName.length() > 0) {
             type.setPrimaryItemName(
-                    NameFormat.parse(primaryItemName, resolver));
+                    resolver.getQName(primaryItemName));
         }
 
         // supertype declarations
@@ -150,10 +156,10 @@
             Vector supertypes = new Vector();
             while (walker.iterateElements(Constants.SUPERTYPE_ELEMENT)) {
                 supertypes.add(
-                        NameFormat.parse(walker.getContent(), resolver));
+                        resolver.getQName(walker.getContent()));
             }
-            type.setSupertypes((QName[])
-                    supertypes.toArray(new QName[supertypes.size()]));
+            type.setSupertypes((Name[])
+                    supertypes.toArray(new Name[supertypes.size()]));
             walker.leaveElement();
         }
 
@@ -189,13 +195,13 @@
      *                                     illegal name
      */
     private PropDefImpl getPropDef()
-            throws InvalidNodeTypeDefException, NameException {
+            throws InvalidNodeTypeDefException, NameException, NamespaceException {
         PropDefImpl def = new PropDefImpl();
         String name = walker.getAttribute(Constants.NAME_ATTRIBUTE);
         if (name.equals("*")) {
             def.setName(ItemDef.ANY_NAME);
         } else {
-            def.setName(NameFormat.parse(name, resolver));
+            def.setName(resolver.getQName(name));
         }
 
         // simple attributes
@@ -266,13 +272,13 @@
      * @return child node definition
      * @throws NameException if the definition contains an illegal name
      */
-    private NodeDefImpl getChildNodeDef() throws NameException {
+    private NodeDefImpl getChildNodeDef() throws NameException, NamespaceException {
         NodeDefImpl def = new NodeDefImpl();
         String name = walker.getAttribute(Constants.NAME_ATTRIBUTE);
         if (name.equals("*")) {
             def.setName(ItemDef.ANY_NAME);
         } else {
-            def.setName(NameFormat.parse(name, resolver));
+            def.setName(resolver.getQName(name));
         }
 
         // simple attributes
@@ -295,17 +301,17 @@
         String type =
             walker.getAttribute(Constants.DEFAULTPRIMARYTYPE_ATTRIBUTE);
         if (type != null && type.length() > 0) {
-            def.setDefaultPrimaryType(NameFormat.parse(type, resolver));
+            def.setDefaultPrimaryType(resolver.getQName(type));
         }
 
         // required primary types
         if (walker.enterElement(Constants.REQUIREDPRIMARYTYPES_ELEMENT)) {
             Vector types = new Vector();
             while (walker.iterateElements(Constants.REQUIREDPRIMARYTYPE_ELEMENT)) {
-                types.add(NameFormat.parse(walker.getContent(), resolver));
+                types.add(resolver.getQName(walker.getContent()));
             }
             def.setRequiredPrimaryTypes(
-                    (QName[]) types.toArray(new QName[types.size()]));
+                    (Name[]) types.toArray(new Name[types.size()]));
             walker.leaveElement();
         } else {
             /* Default to nt:base?
Index: src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java	(working copy)
@@ -18,14 +18,11 @@
 
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.PathFormat;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.value.DateValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,6 +30,7 @@
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.ValueFormatException;
+import javax.jcr.NamespaceException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import java.util.Calendar;
 import java.util.regex.Matcher;
@@ -75,13 +73,14 @@
      * to reflect the current mapping in the returned value.
      *
      * @return the definition of this constraint.
+     * @param resolver
      */
-    public String getDefinition(NamespaceResolver nsResolver) {
+    public String getDefinition(NamePathResolver resolver) {
         return definition;
     }
 
     public static ValueConstraint create(int type, String definition,
-                                         NamespaceResolver nsResolver)
+                                         NamePathResolver resolver)
             throws InvalidConstraintException {
         if (definition == null) {
             throw new IllegalArgumentException("illegal definition (null)");
@@ -104,13 +103,13 @@
                 return new NumericConstraint(definition);
 
             case PropertyType.NAME:
-                return new NameConstraint(definition, nsResolver);
+                return new NameConstraint(definition, resolver);
 
             case PropertyType.PATH:
-                return new PathConstraint(definition, nsResolver);
+                return new PathConstraint(definition, resolver);
 
             case PropertyType.REFERENCE:
-                return new ReferenceConstraint(definition, nsResolver);
+                return new ReferenceConstraint(definition, resolver);
 
             default:
                 throw new IllegalArgumentException("unknown/unsupported target type for constraint: "
@@ -499,7 +498,7 @@
     final Path path;
     final boolean deep;
 
-    PathConstraint(String definition, NamespaceResolver nsResolver)
+    PathConstraint(String definition, NamePathResolver resolver)
             throws InvalidConstraintException {
         super(definition);
 
@@ -510,18 +509,23 @@
             definition = definition.substring(0, definition.length() - 1);
         }
         try {
-            path = PathFormat.parse(definition, nsResolver);
-        } catch (MalformedPathException mpe) {
+            path = resolver.getQPath(definition);
+        } catch (NameException e) {
             String msg = "invalid path expression specified as value constraint: "
                     + definition;
             log.debug(msg);
-            throw new InvalidConstraintException(msg, mpe);
+            throw new InvalidConstraintException(msg, e);
+        } catch (NamespaceException e) {
+            String msg = "invalid path expression specified as value constraint: "
+                    + definition;
+            log.debug(msg);
+            throw new InvalidConstraintException(msg, e);
         }
     }
 
-    public String getDefinition(NamespaceResolver nsResolver) {
+    public String getDefinition(NamePathResolver resolver) {
         try {
-            String p = PathFormat.format(path, nsResolver);
+            String p = resolver.getJCRPath(path);
             if (!deep) {
                 return p;
             } else if (path.denotesRoot()) {
@@ -529,7 +533,7 @@
             } else {
                 return p + "/*";
             }
-        } catch (NoPrefixDeclaredException npde) {
+        } catch (NamespaceException e) {
             // should never get here, return raw definition as fallback
             return definition;
         }
@@ -587,28 +591,32 @@
  * <code>NameConstraint</code> ...
  */
 class NameConstraint extends ValueConstraint {
-    final QName name;
+    final Name name;
 
-    NameConstraint(String definition, NamespaceResolver nsResolver)
+    NameConstraint(String definition, NamePathResolver resolver)
             throws InvalidConstraintException {
         super(definition);
 
         // constraint format: JCR name in prefix form
         try {
-            NameFormat.checkFormat(definition);
-            name = NameFormat.parse(definition, nsResolver);
+            name = resolver.getQName(definition);
         } catch (NameException e) {
             String msg = "invalid name specified as value constraint: "
                     + definition;
             log.debug(msg);
             throw new InvalidConstraintException(msg, e);
+        } catch (NamespaceException e) {
+            String msg = "invalid name specified as value constraint: "
+                    + definition;
+            log.debug(msg);
+            throw new InvalidConstraintException(msg, e);
         }
     }
 
-    public String getDefinition(NamespaceResolver nsResolver) {
+    public String getDefinition(NamePathResolver resolver) {
         try {
-            return NameFormat.format(name, nsResolver);
-        } catch (NoPrefixDeclaredException npde) {
+            return resolver.getJCRName(name);
+        } catch (NamespaceException e) {
             // should never get here, return raw definition as fallback
             return definition;
         }
@@ -621,7 +629,7 @@
         }
         switch (value.getType()) {
             case PropertyType.NAME:
-                QName n = value.getQName();
+                Name n = value.getQName();
                 if (!name.equals(n)) {
                     throw new ConstraintViolationException(n
                             + " does not satisfy the constraint '"
@@ -642,32 +650,37 @@
  * <code>ReferenceConstraint</code> ...
  */
 class ReferenceConstraint extends ValueConstraint {
-    final QName ntName;
+    final Name ntName;
 
-    ReferenceConstraint(String definition, NamespaceResolver nsResolver) throws InvalidConstraintException {
+    ReferenceConstraint(String definition, NamePathResolver resolver) throws InvalidConstraintException {
         super(definition);
 
         // format: node type name
         try {
-            ntName = NameFormat.parse(definition, nsResolver);
+            ntName = resolver.getQName(definition);
         } catch (NameException e) {
             String msg = "invalid node type name specified as value constraint: "
                     + definition;
             log.debug(msg);
             throw new InvalidConstraintException(msg, e);
+        } catch (NamespaceException e) {
+            String msg = "invalid node type name specified as value constraint: "
+                    + definition;
+            log.debug(msg);
+            throw new InvalidConstraintException(msg, e);
         }
     }
 
-    public String getDefinition(NamespaceResolver nsResolver) {
+    public String getDefinition(NamePathResolver resolver) {
         try {
-            return NameFormat.format(ntName, nsResolver);
-        } catch (NoPrefixDeclaredException npde) {
+            return resolver.getJCRName(ntName);
+        } catch (NamespaceException e) {
             // should never get here, return raw definition as fallback
             return definition;
         }
     }
 
-    QName getNodeTypeName() {
+    Name getNodeTypeName() {
         return ntName;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java	(working copy)
@@ -16,21 +16,20 @@
  */
 package org.apache.jackrabbit.core.nodetype;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.jcr.nodetype.ItemDefinition;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeType;
+import javax.jcr.NamespaceException;
 
 /**
  * This class implements the <code>ItemDefinition</code> interface.
  * All method calls are delegated to the wrapped {@link ItemDef},
- * performing the translation from <code>QName</code>s to JCR names
+ * performing the translation from <code>Name</code>s to JCR names
  * (and vice versa) where necessary.
  */
 abstract class ItemDefinitionImpl implements ItemDefinition {
@@ -51,9 +50,9 @@
     protected final NodeTypeManagerImpl ntMgr;
 
     /**
-     * The namespace resolver used to translate qualified names to JCR names.
+     * The name/path resolver used to translate qualified names to JCR names.
      */
-    protected final NamespaceResolver nsResolver;
+    protected final NamePathResolver resolver;
 
     /**
      * The wrapped item definition.
@@ -65,13 +64,13 @@
      *
      * @param itemDef    item definition
      * @param ntMgr      node type manager
-     * @param nsResolver namespace resolver
+     * @param resolver
      */
     ItemDefinitionImpl(ItemDef itemDef, NodeTypeManagerImpl ntMgr,
-                       NamespaceResolver nsResolver) {
+                       NamePathResolver resolver) {
         this.itemDef = itemDef;
         this.ntMgr = ntMgr;
-        this.nsResolver = nsResolver;
+        this.resolver = resolver;
     }
 
     /**
@@ -84,13 +83,13 @@
     }
 
     /**
-     * Gets the <code>QName</code> of the child item. It is an error to
+     * Gets the <code>Name</code> of the child item. It is an error to
      * call this method if this is a residual item definition.
      *
-     * @return the <code>QName</code> of the child item.
+     * @return the <code>Name</code> of the child item.
      * @see #getName()
      */
-    public QName getQName() {
+    public Name getQName() {
         return itemDef.getName();
     }
 
@@ -116,11 +115,11 @@
             return ANY_NAME;
         } else {
             try {
-                return NameFormat.format(itemDef.getName(), nsResolver);
-            } catch (NoPrefixDeclaredException npde) {
+                return resolver.getJCRName(itemDef.getName());
+            } catch (NamespaceException e) {
                 // should never get here
                 log.error("encountered unregistered namespace in item name",
-                        npde);
+                        e);
                 // not correct, but an acceptable fallback
                 return itemDef.getName().toString();
             }
Index: src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java	(working copy)
@@ -18,8 +18,9 @@
 
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.PathFactoryImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -104,12 +105,12 @@
     public Path getQPath() throws RepositoryException {
         try {
             Path parent = eventState.getParentPath();
-            Path.PathElement child = eventState.getChildRelPath();
+            Path.Element child = eventState.getChildRelPath();
             int index = child.getIndex();
             if (index > 0) {
-                return Path.create(parent, child.getName(), index, false);
+                return PathFactoryImpl.getInstance().create(parent, child.getName(), index, false);
             } else {
-                return Path.create(parent, child.getName(), false);
+                return PathFactoryImpl.getInstance().create(parent, child.getName(), false);
             }
         } catch (MalformedPathException e) {
             String msg = "internal error: malformed path for event";
Index: src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java	(working copy)
@@ -21,8 +21,8 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
 import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
Index: src/main/java/org/apache/jackrabbit/core/observation/EventState.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/EventState.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/EventState.java	(working copy)
@@ -20,8 +20,8 @@
 import org.apache.jackrabbit.core.ItemId;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 
@@ -70,12 +70,12 @@
      * The relative path of the child item associated with this event.
      * This is basically the name of the item with an optional index.
      */
-    private final Path.PathElement childRelPath;
+    private final Path.Element childRelPath;
 
     /**
      * The node type name of the parent node.
      */
-    private final QName nodeType;
+    private final Name nodeType;
 
     /**
      * Set of mixin QNames assigned to the parent node.
@@ -130,7 +130,7 @@
      * @param session    the {@link javax.jcr.Session} that caused this event.
      */
     private EventState(int type, NodeId parentId, Path parentPath,
-                       NodeId childId, Path.PathElement childPath, QName nodeType,
+                       NodeId childId, Path.Element childPath, Name nodeType,
                        Set mixins, Session session, boolean external) {
 
         int mask = (Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED);
@@ -174,8 +174,8 @@
     public static EventState childNodeAdded(NodeId parentId,
                                             Path parentPath,
                                             NodeId childId,
-                                            Path.PathElement childPath,
-                                            QName nodeType,
+                                            Path.Element childPath,
+                                            Name nodeType,
                                             Set mixins,
                                             Session session) {
         
@@ -202,8 +202,8 @@
     public static EventState childNodeAdded(NodeId parentId,
                                             Path parentPath,
                                             NodeId childId,
-                                            Path.PathElement childPath,
-                                            QName nodeType,
+                                            Path.Element childPath,
+                                            Name nodeType,
                                             Set mixins,
                                             Session session,
                                             boolean external) {
@@ -230,8 +230,8 @@
     public static EventState childNodeRemoved(NodeId parentId,
                                               Path parentPath,
                                               NodeId childId,
-                                              Path.PathElement childPath,
-                                              QName nodeType,
+                                              Path.Element childPath,
+                                              Name nodeType,
                                               Set mixins,
                                               Session session) {
 
@@ -258,8 +258,8 @@
     public static EventState childNodeRemoved(NodeId parentId,
                                               Path parentPath,
                                               NodeId childId,
-                                              Path.PathElement childPath,
-                                              QName nodeType,
+                                              Path.Element childPath,
+                                              Name nodeType,
                                               Set mixins,
                                               Session session,
                                               boolean external) {
@@ -284,8 +284,8 @@
      */
     public static EventState propertyAdded(NodeId parentId,
                                            Path parentPath,
-                                           Path.PathElement childPath,
-                                           QName nodeType,
+                                           Path.Element childPath,
+                                           Name nodeType,
                                            Set mixins,
                                            Session session) {
         
@@ -310,8 +310,8 @@
      */
     public static EventState propertyAdded(NodeId parentId,
                                            Path parentPath,
-                                           Path.PathElement childPath,
-                                           QName nodeType,
+                                           Path.Element childPath,
+                                           Name nodeType,
                                            Set mixins,
                                            Session session,
                                            boolean external) {
@@ -336,8 +336,8 @@
      */
     public static EventState propertyRemoved(NodeId parentId,
                                              Path parentPath,
-                                             Path.PathElement childPath,
-                                             QName nodeType,
+                                             Path.Element childPath,
+                                             Name nodeType,
                                              Set mixins,
                                              Session session) {
         
@@ -362,8 +362,8 @@
      */
     public static EventState propertyRemoved(NodeId parentId,
                                              Path parentPath,
-                                             Path.PathElement childPath,
-                                             QName nodeType,
+                                             Path.Element childPath,
+                                             Name nodeType,
                                              Set mixins,
                                              Session session,
                                              boolean external) {
@@ -388,8 +388,8 @@
      */
     public static EventState propertyChanged(NodeId parentId,
                                              Path parentPath,
-                                             Path.PathElement childPath,
-                                             QName nodeType,
+                                             Path.Element childPath,
+                                             Name nodeType,
                                              Set mixins,
                                              Session session) {
 
@@ -414,8 +414,8 @@
      */
     public static EventState propertyChanged(NodeId parentId,
                                              Path parentPath,
-                                             Path.PathElement childPath,
-                                             QName nodeType,
+                                             Path.Element childPath,
+                                             Name nodeType,
                                              Set mixins,
                                              Session session,
                                              boolean external) {
@@ -464,9 +464,9 @@
      * Returns the relative {@link Path} of the child
      * {@link javax.jcr.Item} associated with this event.
      *
-     * @return the <code>Path.PathElement</code> associated with this event.
+     * @return the <code>Path.Element</code> associated with this event.
      */
-    public Path.PathElement getChildRelPath() {
+    public Path.Element getChildRelPath() {
         return childRelPath;
     }
 
@@ -475,15 +475,15 @@
      *
      * @return the node type of the parent associated with this event.
      */
-    public QName getNodeType() {
+    public Name getNodeType() {
         return nodeType;
     }
 
     /**
-     * Returns a set of <code>QName</code>s which are the names of the mixins
+     * Returns a set of <code>Name</code>s which are the names of the mixins
      * assigned to the parent node associated with this event.
      *
-     * @return the mixin names as <code>QName</code>s.
+     * @return the mixin names as <code>Name</code>s.
      */
     public Set getMixinNames() {
         return mixins;
@@ -506,7 +506,7 @@
                 log.warn("Unknown node type: " + nodeType);
             }
             for (Iterator it = mixins.iterator(); it.hasNext(); ) {
-                QName mixinName = (QName) it.next();
+                Name mixinName = (Name) it.next();
                 try {
                     tmp.add(ntMgr.getNodeType(mixinName));
                 } catch (NoSuchNodeTypeException e) {
Index: src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.state.ChangeLog;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
Index: src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java	(working copy)
@@ -23,8 +23,9 @@
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.PathFactoryImpl;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.observation.Event;
@@ -203,11 +204,11 @@
             // node where the property belongs to.
             Path eventPath;
             if (type == Event.NODE_ADDED || type == Event.NODE_REMOVED) {
-                Path.PathElement nameElem = eventState.getChildRelPath();
+                Path.Element nameElem = eventState.getChildRelPath();
                 if (nameElem.getIndex() == 0) {
-                    eventPath = Path.create(eventState.getParentPath(), nameElem.getName(), false);
+                    eventPath = PathFactoryImpl.getInstance().create(eventState.getParentPath(), nameElem.getName(), false);
                 } else {
-                    eventPath = Path.create(eventState.getParentPath(), nameElem.getName(), nameElem.getIndex(), false);
+                    eventPath = PathFactoryImpl.getInstance().create(eventState.getParentPath(), nameElem.getName(), nameElem.getIndex(), false);
                 }
             } else {
                 eventPath = eventState.getParentPath();
Index: src/main/java/org/apache/jackrabbit/core/observation/ChangeLogBasedHierarchyMgr.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/ChangeLogBasedHierarchyMgr.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/ChangeLogBasedHierarchyMgr.java	(working copy)
@@ -28,8 +28,8 @@
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeReferencesId;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.conversion.PathResolver;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.RepositoryException;
Index: src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java	(working copy)
@@ -27,9 +27,10 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -101,8 +102,8 @@
      *                   if no prefix should be used.
      */
     public EventStateCollection(EventDispatcher dispatcher,
-                         SessionImpl session,
-                         Path pathPrefix) {
+                                SessionImpl session,
+                                Path pathPrefix) {
         this.dispatcher = dispatcher;
         this.session = session;
         this.pathPrefix = pathPrefix;
@@ -234,11 +235,11 @@
                                 Path oldPath;
                                 try {
                                     if (moved.getIndex() == 0) {
-                                        oldPath = Path.create(parentPath, moved.getName(), false);
+                                        oldPath = PathFactoryImpl.getInstance().create(parentPath, moved.getName(), false);
                                     } else {
-                                        oldPath = Path.create(parentPath, moved.getName(), moved.getIndex(), false);
+                                        oldPath = PathFactoryImpl.getInstance().create(parentPath, moved.getName(), moved.getIndex(), false);
                                     }
-                                } catch (MalformedPathException e) {
+                                } catch (RepositoryException e) {
                                     // should never happen actually
                                     String msg = "Malformed path for item: " + state.getId();
                                     log.error(msg);
@@ -272,10 +273,10 @@
                     // reorder
                     for (Iterator ro = reordered.iterator(); ro.hasNext();) {
                         NodeState.ChildNodeEntry child = (NodeState.ChildNodeEntry) ro.next();
-                        QName name = child.getName();
+                        Name name = child.getName();
                         int index = (child.getIndex() != 1) ? child.getIndex() : 0;
                         Path parentPath = getPath(n.getNodeId(), hmgr);
-                        Path.PathElement addedElem = Path.create(name, index).getNameElement();
+                        Path.Element addedElem = PathFactoryImpl.getInstance().create(name, index).getNameElement();
                         // get removed index
                         NodeState overlayed = (NodeState) n.getOverlayedState();
                         NodeState.ChildNodeEntry entry = overlayed.getChildNodeEntry(child.getId());
@@ -283,7 +284,7 @@
                             throw new ItemStateException("Unable to retrieve old child index for item: " + child.getId());
                         }
                         int oldIndex = (entry.getIndex() != 1) ? entry.getIndex() : 0;
-                        Path.PathElement removedElem = Path.create(name, oldIndex).getNameElement();
+                        Path.Element removedElem = PathFactoryImpl.getInstance().create(name, oldIndex).getNameElement();
 
                         events.add(EventState.childNodeRemoved(n.getNodeId(),
                                 parentPath,
@@ -552,18 +553,14 @@
         if (pathPrefix == null) {
             return p;
         }
-        Path.PathBuilder builder = new Path.PathBuilder(pathPrefix.getElements());
-        Path.PathElement[] elements = p.getElements();
+        PathBuilder builder = new PathBuilder(pathPrefix.getElements());
+        Path.Element[] elements = p.getElements();
         for (int i = 0; i < elements.length; i++) {
             if (elements[i].denotesRoot()) {
                 continue;
             }
             builder.addLast(elements[i]);
         }
-        try {
-            return builder.getPath();
-        } catch (MalformedPathException e) {
-            throw new RepositoryException(e);
-        }
+        return builder.getPath();
     }
 }
Index: src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/ZombieHierarchyManager.java	(working copy)
@@ -21,7 +21,7 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 import java.util.Iterator;
 
@@ -96,7 +96,7 @@
      * Also allows for removed/renamed child node entries.
      */
     protected NodeState.ChildNodeEntry getChildNodeEntry(NodeState parent,
-                                                         QName name,
+                                                         Name name,
                                                          int index) {
         // check removed child node entries first
         Iterator iter = parent.getRemovedChildNodeEntries().iterator();
Index: src/main/java/org/apache/jackrabbit/core/xml/NamespaceContext.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/NamespaceContext.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/NamespaceContext.java	(working copy)
@@ -16,12 +16,7 @@
  */
 package org.apache.jackrabbit.core.xml;
 
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.UnknownPrefixException;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
 import javax.jcr.NamespaceException;
 import java.util.HashMap;
@@ -122,16 +117,4 @@
             throw new NamespaceException("Unknown URI: " + uri);
         }
     }
-
-    /** {@inheritDoc} */
-    public String getJCRName(QName name) throws NoPrefixDeclaredException {
-        return NameFormat.format(name, this);
-    }
-
-    /** {@inheritDoc} */
-    public QName getQName(String name)
-            throws IllegalNameException, UnknownPrefixException {
-        return NameFormat.parse(name, this);
-    }
-
 }
Index: src/main/java/org/apache/jackrabbit/core/xml/NodeInfo.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/NodeInfo.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/NodeInfo.java	(working copy)
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.core.xml;
 
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 
 /**
  * Information about a node being imported. This class is used
@@ -33,17 +33,17 @@
     /**
      * Name of the node being imported.
      */
-    private final QName name;
+    private final Name name;
 
     /**
      * Name of the primary type of the node being imported.
      */
-    private final QName nodeTypeName;
+    private final Name nodeTypeName;
 
     /**
      * Names of the mixin types of the node being imported.
      */
-    private final QName[] mixinNames;
+    private final Name[] mixinNames;
 
     /**
      * Identifier of the node being imported.
@@ -58,7 +58,7 @@
      * @param mixinNames names of the mixin types of the node being imported
      * @param id identifier of the node being imported
      */
-    public NodeInfo(QName name, QName nodeTypeName, QName[] mixinNames,
+    public NodeInfo(Name name, Name nodeTypeName, Name[] mixinNames,
                     NodeId id) {
         this.name = name;
         this.nodeTypeName = nodeTypeName;
@@ -71,7 +71,7 @@
      *
      * @return node name
      */
-    public QName getName() {
+    public Name getName() {
         return name;
     }
 
@@ -80,7 +80,7 @@
      *
      * @return primary type name
      */
-    public QName getNodeTypeName() {
+    public Name getNodeTypeName() {
         return nodeTypeName;
     }
 
@@ -89,7 +89,7 @@
      *
      * @return mixin type names
      */
-    public QName[] getMixinNames() {
+    public Name[] getMixinNames() {
         return mixinNames;
     }
 
Index: src/main/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java	(working copy)
@@ -16,9 +16,10 @@
  */
 package org.apache.jackrabbit.core.xml;
 
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.apache.jackrabbit.core.NodeId;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -26,6 +27,7 @@
 import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -47,7 +49,7 @@
     /**
      * fields used temporarily while processing sv:property and sv:value elements
      */
-    private QName currentPropName;
+    private Name currentPropName;
     private int currentPropType = PropertyType.UNDEFINED;
     // list of AppendableValue objects
     private ArrayList currentPropValues = new ArrayList();
@@ -57,7 +59,6 @@
      * Constructs a new <code>SysViewImportHandler</code>.
      *
      * @param importer
-     * @param nsContext
      */
     SysViewImportHandler(Importer importer) {
         super(importer);
@@ -68,10 +69,10 @@
         if (!start && !end) {
             return;
         }
-        QName[] mixinNames = null;
+        Name[] mixinNames = null;
         if (state.mixinNames != null) {
-            mixinNames = (QName[]) state.mixinNames.toArray(
-                    new QName[state.mixinNames.size()]);
+            mixinNames = (Name[]) state.mixinNames.toArray(
+                    new Name[state.mixinNames.size()]);
         }
         NodeId id = null;
         if (state.uuid != null) {
@@ -106,13 +107,13 @@
     public void startElement(String namespaceURI, String localName,
                              String qName, Attributes atts)
             throws SAXException {
-        QName name = new QName(namespaceURI, localName);
+        Name name = NameFactoryImpl.getInstance().create(namespaceURI, localName);
         // check element name
-        if (name.equals(QName.SV_NODE)) {
+        if (name.equals(NameConstants.SV_NODE)) {
             // sv:node element
 
             // node name (value of sv:name attribute)
-            String svName = getAttribute(atts, QName.SV_NAME);
+            String svName = getAttribute(atts, NameConstants.SV_NAME);
             if (name == null) {
                 throw new SAXException(new InvalidSerializedDataException(
                         "missing mandatory sv:name attribute of element sv:node"));
@@ -131,30 +132,34 @@
             // push new ImportState instance onto the stack
             ImportState state = new ImportState();
             try {
-                state.nodeName = NameFormat.parse(svName, nsContext);
+                state.nodeName = resolver.getQName(svName);
             } catch (NameException e) {
                 throw new SAXException(new InvalidSerializedDataException("illegal node name: " + name, e));
+            } catch (NamespaceException e) {
+                throw new SAXException(new InvalidSerializedDataException("illegal node name: " + name, e));
             }
             stack.push(state);
-        } else if (name.equals(QName.SV_PROPERTY)) {
+        } else if (name.equals(NameConstants.SV_PROPERTY)) {
             // sv:property element
 
             // reset temp fields
             currentPropValues.clear();
 
             // property name (value of sv:name attribute)
-            String svName = getAttribute(atts, QName.SV_NAME);
+            String svName = getAttribute(atts, NameConstants.SV_NAME);
             if (name == null) {
                 throw new SAXException(new InvalidSerializedDataException(
                         "missing mandatory sv:name attribute of element sv:property"));
             }
             try {
-                currentPropName = NameFormat.parse(svName, nsContext);
+                currentPropName = resolver.getQName(svName);
             } catch (NameException e) {
                 throw new SAXException(new InvalidSerializedDataException("illegal property name: " + name, e));
+            } catch (NamespaceException e) {
+                throw new SAXException(new InvalidSerializedDataException("illegal property name: " + name, e));
             }
             // property type (sv:type attribute)
-            String type = getAttribute(atts, QName.SV_TYPE);
+            String type = getAttribute(atts, NameConstants.SV_TYPE);
             if (type == null) {
                 throw new SAXException(new InvalidSerializedDataException(
                         "missing mandatory sv:type attribute of element sv:property"));
@@ -165,11 +170,11 @@
                 throw new SAXException(new InvalidSerializedDataException(
                         "Unknown property type: " + type, e));
             }
-        } else if (name.equals(QName.SV_VALUE)) {
+        } else if (name.equals(NameConstants.SV_VALUE)) {
             // sv:value element
 
             // reset temp fields
-            currentPropValue = new BufferedStringValue(nsContext);
+            currentPropValue = new BufferedStringValue(resolver);
         } else {
             throw new SAXException(new InvalidSerializedDataException(
                     "Unexpected element in system view xml document: " + name));
@@ -216,10 +221,10 @@
      */
     public void endElement(String namespaceURI, String localName, String qName)
             throws SAXException {
-        QName name = new QName(namespaceURI, localName);
+        Name name = NameFactoryImpl.getInstance().create(namespaceURI, localName);
         // check element name
         ImportState state = (ImportState) stack.peek();
-        if (name.equals(QName.SV_NODE)) {
+        if (name.equals(NameConstants.SV_NODE)) {
             // sv:node element
             if (!state.started) {
                 // need to start & end current node
@@ -231,23 +236,25 @@
             }
             // pop current state from stack
             stack.pop();
-        } else if (name.equals(QName.SV_PROPERTY)) {
+        } else if (name.equals(NameConstants.SV_PROPERTY)) {
             // sv:property element
 
             // check if all system properties (jcr:primaryType, jcr:uuid etc.)
             // have been collected and create node as necessary
-            if (currentPropName.equals(QName.JCR_PRIMARYTYPE)) {
+            if (currentPropName.equals(NameConstants.JCR_PRIMARYTYPE)) {
                 BufferedStringValue val = (BufferedStringValue) currentPropValues.get(0);
                 String s = null;
                 try {
                     s = val.retrieve();
-                    state.nodeTypeName = NameFormat.parse(s, nsContext);
+                    state.nodeTypeName = resolver.getQName(s);
                 } catch (IOException ioe) {
                     throw new SAXException("error while retrieving value", ioe);
                 } catch (NameException e) {
                     throw new SAXException(new InvalidSerializedDataException("illegal node type name: " + s, e));
+                } catch (NamespaceException e) {
+                    throw new SAXException(new InvalidSerializedDataException("illegal node type name: " + s, e));
                 }
-            } else if (currentPropName.equals(QName.JCR_MIXINTYPES)) {
+            } else if (currentPropName.equals(NameConstants.JCR_MIXINTYPES)) {
                 if (state.mixinNames == null) {
                     state.mixinNames = new ArrayList(currentPropValues.size());
                 }
@@ -257,15 +264,17 @@
                     String s = null;
                     try {
                         s = val.retrieve();
-                        QName mixin = NameFormat.parse(s, nsContext);
+                        Name mixin = resolver.getQName(s);
                         state.mixinNames.add(mixin);
                     } catch (IOException ioe) {
                         throw new SAXException("error while retrieving value", ioe);
                     } catch (NameException e) {
                         throw new SAXException(new InvalidSerializedDataException("illegal mixin type name: " + s, e));
+                    } catch (NamespaceException e) {
+                        throw new SAXException(new InvalidSerializedDataException("illegal mixin type name: " + s, e));
                     }
                 }
-            } else if (currentPropName.equals(QName.JCR_UUID)) {
+            } else if (currentPropName.equals(NameConstants.JCR_UUID)) {
                 BufferedStringValue val = (BufferedStringValue) currentPropValues.get(0);
                 try {
                     state.uuid = val.retrieve();
@@ -281,7 +290,7 @@
             }
             // reset temp fields
             currentPropValues.clear();
-        } else if (name.equals(QName.SV_VALUE)) {
+        } else if (name.equals(NameConstants.SV_VALUE)) {
             // sv:value element
             currentPropValues.add(currentPropValue);
             // reset temp fields
@@ -296,11 +305,11 @@
         /**
          * name of current node
          */
-        QName nodeName;
+        Name nodeName;
         /**
          * primary type of current node
          */
-        QName nodeTypeName;
+        Name nodeTypeName;
         /**
          * list of mixin types of current node
          */
@@ -331,7 +340,7 @@
      * @return attribute value,
      *         or <code>null</code> if the named attribute is not found
      */
-    private static String getAttribute(Attributes attributes, QName name) {
+    private static String getAttribute(Attributes attributes, Name name) {
         return attributes.getValue(name.getNamespaceURI(), name.getLocalName());
     }
 
Index: src/main/java/org/apache/jackrabbit/core/xml/StringValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/StringValue.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/StringValue.java	(working copy)
@@ -17,10 +17,10 @@
 package org.apache.jackrabbit.core.xml;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
 import org.apache.jackrabbit.util.Base64;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -36,7 +36,7 @@
 
     private final String value;
 
-    private final NamespaceResolver nsContext;
+    private final NamePathResolver nsContext;
 
     /**
      * Constructs a new <code>StringValue</code> representing the given
@@ -44,14 +44,14 @@
      *
      * @param value
      */
-    protected StringValue(String value, NamespaceResolver nsContext) {
+    protected StringValue(String value, NamePathResolver nsContext) {
         this.value = value;
         this.nsContext = nsContext;
     }
 
     //--------------------------------------------------------< TextValue >
 
-    public Value getValue(int type, NamespaceResolver resolver)
+    public Value getValue(int type, NamePathResolver resolver)
             throws ValueFormatException, RepositoryException {
         if (type == PropertyType.NAME || type == PropertyType.PATH) {
             // NAME and PATH require special treatment because
Index: src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/SessionImporter.java	(working copy)
@@ -20,9 +20,11 @@
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.util.ReferenceChangeTracker;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.value.ReferenceValue;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,9 +83,9 @@
     }
 
     protected NodeImpl createNode(NodeImpl parent,
-                                  QName nodeName,
-                                  QName nodeTypeName,
-                                  QName[] mixinNames,
+                                  Name nodeName,
+                                  Name nodeTypeName,
+                                  Name[] mixinNames,
                                   NodeId id)
             throws RepositoryException {
         NodeImpl node;
@@ -102,9 +104,9 @@
                 // assume this property has been imported as well;
                 // rename conflicting property
                 // @todo use better reversible escaping scheme to create unique name
-                QName newName = new QName(nodeName.getNamespaceURI(), nodeName.getLocalName() + "_");
+                Name newName = NameFactoryImpl.getInstance().create(nodeName.getNamespaceURI(), nodeName.getLocalName() + "_");
                 if (parent.hasProperty(newName)) {
-                    newName = new QName(newName.getNamespaceURI(), newName.getLocalName() + "_");
+                    newName = NameFactoryImpl.getInstance().create(newName.getNamespaceURI(), newName.getLocalName() + "_");
                 }
 
                 if (conflicting.getDefinition().isMultiple()) {
@@ -138,7 +140,7 @@
             node = createNode(parent, nodeInfo.getName(),
                     nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), null);
             // remember uuid mapping
-            if (node.isNodeType(QName.MIX_REFERENCEABLE)) {
+            if (node.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
                 refTracker.mappedUUID(nodeInfo.getId().getUUID(), node.getNodeId().getUUID());
             }
         } else if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW) {
@@ -197,9 +199,9 @@
 
         NodeImpl node = null;
         NodeId id = nodeInfo.getId();
-        QName nodeName = nodeInfo.getName();
-        QName ntName = nodeInfo.getNodeTypeName();
-        QName[] mixins = nodeInfo.getMixinNames();
+        Name nodeName = nodeInfo.getName();
+        Name ntName = nodeInfo.getNodeTypeName();
+        Name[] mixins = nodeInfo.getMixinNames();
 
         if (parent == null) {
             // parent node was skipped, skip this child node too
@@ -264,7 +266,7 @@
         Iterator iter = propInfos.iterator();
         while (iter.hasNext()) {
             PropInfo pi = (PropInfo) iter.next();
-            pi.apply(node, session.getNamespaceResolver(), refTracker);
+            pi.apply(node, session.getNamePathResolver(), refTracker);
         }
 
         parents.push(node);
Index: src/main/java/org/apache/jackrabbit/core/xml/BufferedStringValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/BufferedStringValue.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/BufferedStringValue.java	(working copy)
@@ -17,11 +17,11 @@
 package org.apache.jackrabbit.core.xml;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
 import org.apache.jackrabbit.util.Base64;
 import org.apache.jackrabbit.util.TransientFileFactory;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFactoryImpl;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,12 +81,13 @@
      */
     private Writer writer;
 
-    private final NamespaceResolver nsContext;
+    private final NamePathResolver nsContext;
 
     /**
      * Constructs a new empty <code>BufferedStringValue</code>.
+     * @param nsContext
      */
-    protected BufferedStringValue(NamespaceResolver nsContext) {
+    protected BufferedStringValue(NamePathResolver nsContext) {
         buffer = new char[0x2000];
         bufferPos = 0;
         tmpFile = null;
@@ -229,7 +230,7 @@
 
     //--------------------------------------------------------< TextValue >
 
-    public Value getValue(int targetType, NamespaceResolver resolver)
+    public Value getValue(int targetType, NamePathResolver resolver)
             throws ValueFormatException, RepositoryException {
         try {
             if (targetType == PropertyType.NAME
Index: src/main/java/org/apache/jackrabbit/core/xml/ImportHandler.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/ImportHandler.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/ImportHandler.java	(working copy)
@@ -22,8 +22,8 @@
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
@@ -175,7 +175,7 @@
         if (targetHandler == null) {
             // the namespace of the first element determines the type of XML
             // (system view/document view)
-            if (QName.NS_SV_URI.equals(namespaceURI)) {
+            if (Name.NS_SV_URI.equals(namespaceURI)) {
                 targetHandler = new SysViewImportHandler(importer);
             } else {
                 targetHandler = new DocViewImportHandler(importer);
Index: src/main/java/org/apache/jackrabbit/core/xml/TargetImportHandler.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/TargetImportHandler.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/TargetImportHandler.java	(working copy)
@@ -18,6 +18,8 @@
 
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
 
 import java.util.Map;
 
@@ -41,6 +43,8 @@
      */
     protected NamespaceContext nsContext;
 
+    protected NamePathResolver resolver;
+
     protected TargetImportHandler(Importer importer) {
         this.importer = importer;
     }
@@ -87,6 +91,7 @@
      */
     public final void startNamespaceContext(Map mappings) {
         nsContext = new NamespaceContext(nsContext, mappings);
+        resolver = new DefaultNamePathResolver(nsContext);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java	(working copy)
@@ -32,10 +32,12 @@
 import org.apache.jackrabbit.core.util.ReferenceChangeTracker;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.version.VersionManager;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -156,7 +158,7 @@
                     nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), null);
             // remember uuid mapping
             EffectiveNodeType ent = itemOps.getEffectiveNodeType(node);
-            if (ent.includesNodeType(QName.MIX_REFERENCEABLE)) {
+            if (ent.includesNodeType(NameConstants.MIX_REFERENCEABLE)) {
                 refTracker.mappedUUID(nodeInfo.getId().getUUID(), node.getNodeId().getUUID());
             }
         } else if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW) {
@@ -293,7 +295,7 @@
          * todo FIXME delegate to 'node type instance handler'
          */
         EffectiveNodeType ent = itemOps.getEffectiveNodeType(node);
-        if (ent.includesNodeType(QName.MIX_VERSIONABLE)) {
+        if (ent.includesNodeType(NameConstants.MIX_VERSIONABLE)) {
             /**
              * check if there's already a version history for that
              * node; this would e.g. be the case if a versionable node
@@ -310,22 +312,22 @@
 
             // jcr:versionHistory
             conditionalAddProperty(
-                    node, QName.JCR_VERSIONHISTORY, PropertyType.REFERENCE, false,
+                    node, NameConstants.JCR_VERSIONHISTORY, PropertyType.REFERENCE, false,
                     InternalValue.create(new UUID(history.getUUID())));
 
             // jcr:baseVersion
             conditionalAddProperty(
-                    node, QName.JCR_BASEVERSION, PropertyType.REFERENCE, false,
+                    node, NameConstants.JCR_BASEVERSION, PropertyType.REFERENCE, false,
                     InternalValue.create(new UUID(rootVersion.getUUID())));
 
             // jcr:predecessors
             conditionalAddProperty(
-                    node, QName.JCR_PREDECESSORS, PropertyType.REFERENCE, true,
+                    node, NameConstants.JCR_PREDECESSORS, PropertyType.REFERENCE, true,
                     InternalValue.create(new UUID(rootVersion.getUUID())));
 
             // jcr:isCheckedOut
             conditionalAddProperty(
-                    node, QName.JCR_ISCHECKEDOUT, PropertyType.BOOLEAN, false,
+                    node, NameConstants.JCR_ISCHECKEDOUT, PropertyType.BOOLEAN, false,
                     InternalValue.create(true));
         }
     }
@@ -342,7 +344,7 @@
      * @throws RepositoryException if the property could not be added
      */
     private void conditionalAddProperty(
-            NodeState node, QName name, int type, boolean multiple,
+            NodeState node, Name name, int type, boolean multiple,
             InternalValue value)
             throws RepositoryException {
         if (!node.hasPropertyName(name)) {
@@ -392,9 +394,9 @@
 
             NodeState node = null;
             NodeId id = nodeInfo.getId();
-            QName nodeName = nodeInfo.getName();
-            QName ntName = nodeInfo.getNodeTypeName();
-            QName[] mixins = nodeInfo.getMixinNames();
+            Name nodeName = nodeInfo.getName();
+            Name ntName = nodeInfo.getNodeTypeName();
+            Name[] mixins = nodeInfo.getMixinNames();
 
             if (parent == null) {
                 // parent node was skipped, skip this child node too
@@ -534,7 +536,7 @@
      * @param name name of the node being imported
      * @throws RepositoryException
      */
-    private void resolvePropertyNameConflict(NodeState parent, QName name)
+    private void resolvePropertyNameConflict(NodeState parent, Name name)
             throws RepositoryException {
         PropertyId propId = new PropertyId(parent.getNodeId(), name);
         PropertyState conflicting = itemOps.getPropertyState(propId);
@@ -542,9 +544,9 @@
             // assume this property has been imported as well;
             // rename conflicting property
             // @todo use better reversible escaping scheme to create unique name
-            QName newName = new QName(name.getNamespaceURI(), name.getLocalName() + "_");
+            Name newName = NameFactoryImpl.getInstance().create(name.getNamespaceURI(), name.getLocalName() + "_");
             while (parent.hasPropertyName(newName)) {
-                newName = new QName(newName.getNamespaceURI(), newName.getLocalName() + "_");
+                newName = NameFactoryImpl.getInstance().create(newName.getNamespaceURI(), newName.getLocalName() + "_");
             }
             InternalValue[] values = conflicting.getValues();
             PropertyState newProp = itemOps.createPropertyState(
Index: src/main/java/org/apache/jackrabbit/core/xml/TextValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/TextValue.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/TextValue.java	(working copy)
@@ -21,7 +21,7 @@
 import javax.jcr.ValueFormatException;
 
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 /**
  * <code>TextValue</code> represents a serialized property value read
@@ -29,7 +29,7 @@
  */
 public interface TextValue {
 
-    Value getValue(int type, NamespaceResolver resolver)
+    Value getValue(int type, NamePathResolver resolver)
         throws ValueFormatException, RepositoryException;
 
     InternalValue getInternalValue(int type)
Index: src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java	(working copy)
@@ -16,9 +16,8 @@
  */
 package org.apache.jackrabbit.core.xml;
 
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO9075;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.slf4j.Logger;
@@ -69,9 +68,9 @@
         props = new ArrayList();
     }
 
-    private QName getQName(String rawName) throws RepositoryException {
+    private Name getQName(String rawName) throws RepositoryException {
         try {
-            return NameFormat.parse(rawName, nsResolver);
+            return resolver.getQName(rawName);
         } catch (NameException e) {
             // should never get here...
             String msg = "internal error: failed to resolve namespace mappings";
@@ -154,7 +153,7 @@
 
                 // attribute name (encode property name to make sure it's a valid xml name)
                 String attrName = ISO9075.encode(propName);
-                QName qName = getQName(attrName);
+                Name qName = getQName(attrName);
 
                 // attribute value
                 if (prop.getType() == PropertyType.BINARY && skipBinary) {
@@ -172,7 +171,7 @@
             }
 
             // start element (node)
-            QName qName = getQName(elemName);
+            Name qName = getQName(elemName);
             contentHandler.startElement(qName.getNamespaceURI(),
                     qName.getLocalName(), elemName, attrs);
         }
@@ -200,7 +199,7 @@
         }
 
         // end element (node)
-        QName qName = getQName(elemName);
+        Name qName = getQName(elemName);
         contentHandler.endElement(qName.getNamespaceURI(), qName.getLocalName(),
                 elemName);
     }
Index: src/main/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java	(working copy)
@@ -19,11 +19,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.SessionNamespaceResolver;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.namespace.SessionNamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
@@ -36,6 +37,7 @@
 import javax.jcr.PropertyIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.NamespaceException;
 
 /**
  * <code>AbstractSAXEventGenerator</code> serves as the base class for
@@ -66,6 +68,8 @@
      */
     protected final NamespaceResolver nsResolver;
 
+    protected final NamePathResolver resolver;
+
     /**
      * the content handler to feed the SAX events to
      */
@@ -130,16 +134,18 @@
         // start with an empty set of known prefixes
         this.namespaces = new NamespaceStack(null);
 
+        resolver = new DefaultNamePathResolver(nsResolver);
+
         // resolve the names of some wellknown properties
         // allowing for session-local prefix mappings
         try {
-            jcrPrimaryType = NameFormat.format(QName.JCR_PRIMARYTYPE, nsResolver);
-            jcrMixinTypes = NameFormat.format(QName.JCR_MIXINTYPES, nsResolver);
-            jcrUUID = NameFormat.format(QName.JCR_UUID, nsResolver);
-            jcrRoot = NameFormat.format(QName.JCR_ROOT, nsResolver);
-            jcrXMLText = NameFormat.format(QName.JCR_XMLTEXT, nsResolver);
-            jcrXMLCharacters = NameFormat.format(QName.JCR_XMLCHARACTERS, nsResolver);
-        } catch (NameException e) {
+            jcrPrimaryType = resolver.getJCRName(NameConstants.JCR_PRIMARYTYPE);
+            jcrMixinTypes = resolver.getJCRName(NameConstants.JCR_MIXINTYPES);
+            jcrUUID = resolver.getJCRName(NameConstants.JCR_UUID);
+            jcrRoot = resolver.getJCRName(NameConstants.JCR_ROOT);
+            jcrXMLText = resolver.getJCRName(NameConstants.JCR_XMLTEXT);
+            jcrXMLCharacters = resolver.getJCRName(NameConstants.JCR_XMLCHARACTERS);
+        } catch (NamespaceException e) {
             // should never get here...
             String msg = "internal error: failed to resolve namespace mappings";
             log.error(msg, e);
@@ -177,7 +183,7 @@
         String[] prefixes = session.getNamespacePrefixes();
         for (int i = 0; i < prefixes.length; i++) {
             String prefix = prefixes[i];
-            if (QName.NS_XML_PREFIX.equals(prefix)) {
+            if (Name.NS_XML_PREFIX.equals(prefix)) {
                 // skip 'xml' prefix as this would be an illegal namespace declaration
                 continue;
             }
@@ -196,7 +202,7 @@
         String[] prefixes = session.getNamespacePrefixes();
         for (int i = 0; i < prefixes.length; i++) {
             String prefix = prefixes[i];
-            if (QName.NS_XML_PREFIX.equals(prefix)) {
+            if (Name.NS_XML_PREFIX.equals(prefix)) {
                 // skip 'xml' prefix as this would be an illegal namespace declaration
                 continue;
             }
@@ -224,7 +230,7 @@
             String prefix = prefixes[i];
 
             if (prefix.length() > 0
-                    && !QName.NS_XML_PREFIX.equals(prefix)) {
+                    && !Name.NS_XML_PREFIX.equals(prefix)) {
                 String uri = session.getNamespaceURI(prefix);
 
                 // get the matching namespace from previous declarations
@@ -233,9 +239,9 @@
                 if (!uri.equals(mappedToNs)) {
                     // when not the same, add a declaration
                     attributes.addAttribute(
-                        QName.NS_XMLNS_URI,
+                        Name.NS_XMLNS_URI,
                         prefix,
-                        QName.NS_XMLNS_PREFIX + ":" + prefix,
+                        Name.NS_XMLNS_PREFIX + ":" + prefix,
                         "CDATA",
                         uri);
 
Index: src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java	(working copy)
@@ -17,10 +17,12 @@
 package org.apache.jackrabbit.core.xml;
 
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.IllegalNameException;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NameParser;
+import org.apache.jackrabbit.conversion.IllegalNameException;
+import org.apache.jackrabbit.name.NameConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.util.ISO9075;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,6 +31,7 @@
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.ArrayList;
@@ -70,14 +73,16 @@
      * @return the parsed names
      * @throws SAXException if an invalid name was encountered
      */
-    private QName[] parseNames(String value) throws SAXException {
+    private Name[] parseNames(String value) throws SAXException {
         String[] names = value.split("\\p{Space}+");
-        QName[] qnames = new QName[names.length];
+        Name[] qnames = new Name[names.length];
         for (int i = 0; i < names.length; i++) {
             try {
-                qnames[i] = NameFormat.parse(names[i], nsContext);
+                qnames[i] = resolver.getQName(names[i]);
             } catch (NameException ne) {
                 throw new SAXException("Invalid name: " + names[i], ne);
+            } catch (NamespaceException e) {
+                throw new SAXException("Invalid name: " + names[i], e);
             }
         }
         return qnames;
@@ -97,7 +102,7 @@
     private void appendCharacters(char[] ch, int start, int length)
             throws SAXException {
         if (textHandler == null) {
-            textHandler = new BufferedStringValue(nsContext);
+            textHandler = new BufferedStringValue(resolver);
         }
         try {
             textHandler.append(ch, start, length);
@@ -147,12 +152,12 @@
                 }
 
                 NodeInfo node =
-                        new NodeInfo(QName.JCR_XMLTEXT, null, null, null);
+                        new NodeInfo(NameConstants.JCR_XMLTEXT, null, null, null);
                 TextValue[] values =
                         new TextValue[]{textHandler};
                 ArrayList props = new ArrayList();
                 PropInfo prop = new PropInfo(
-                        QName.JCR_XMLCHARACTERS, PropertyType.STRING, values);
+                        NameConstants.JCR_XMLCHARACTERS, PropertyType.STRING, values);
                 props.add(prop);
                 // call Importer
                 importer.startNode(node, props);
@@ -179,14 +184,15 @@
      * @return the decoded and valid jcr name or the original name if it is
      *         not encoded or if the resulting decoded name would be illegal.
      */
-    private QName processName(QName name) {
-        QName decoded = ISO9075.decode(name);
-        if (decoded != name) {
+    private Name processName(Name name) {
+        String decodedLocalName = ISO9075.decode(name.getLocalName());
+        Name decoded = NameFactoryImpl.getInstance().create(name.getNamespaceURI(), decodedLocalName);
+        if (!decoded.equals(name)) {
             // only need to check format of decoded name since
             // an xml name is always a legal jcr name
             // (http://issues.apache.org/jira/browse/JCR-821)
             try {
-                NameFormat.checkFormat(decoded.getLocalName());
+                NameParser.checkFormat(decoded.getLocalName());
                 return decoded;
             } catch (IllegalNameException ine) {
                 // decoded name would be illegal according to jsr 170,
@@ -214,23 +220,23 @@
         processCharacters();
 
         try {
-            QName nodeName = new QName(namespaceURI, localName);
+            Name nodeName = NameFactoryImpl.getInstance().create(namespaceURI, localName);
             // process node name
             nodeName = processName(nodeName);
 
             // properties
             NodeId id = null;
-            QName nodeTypeName = null;
-            QName[] mixinTypes = null;
+            Name nodeTypeName = null;
+            Name[] mixinTypes = null;
 
             ArrayList props = new ArrayList(atts.getLength());
             for (int i = 0; i < atts.getLength(); i++) {
-                if (atts.getURI(i).equals(QName.NS_XMLNS_URI)) {
+                if (atts.getURI(i).equals(Name.NS_XMLNS_URI)) {
                     // skip namespace declarations reported as attributes
                     // see http://issues.apache.org/jira/browse/JCR-620#action_12448164
                     continue;
                 }
-                QName propName = new QName(atts.getURI(i), atts.getLocalName(i));
+                Name propName = NameFactoryImpl.getInstance().create(atts.getURI(i), atts.getLocalName(i));
                 // process property name
                 propName = processName(propName);
 
@@ -244,22 +250,22 @@
                 // see also DocViewSAXEventGenerator#leavingProperties(Node, int)
                 // todo proper multi-value serialization support
                 propValues = new TextValue[1];
-                propValues[0] = new StringValue(attrValue, nsContext);
+                propValues[0] = new StringValue(attrValue, resolver);
 
-                if (propName.equals(QName.JCR_PRIMARYTYPE)) {
+                if (propName.equals(NameConstants.JCR_PRIMARYTYPE)) {
                     // jcr:primaryType
                     if (attrValue.length() > 0) {
                         try {
-                            nodeTypeName = NameFormat.parse(attrValue, nsContext);
+                            nodeTypeName = resolver.getQName(attrValue);
                         } catch (NameException ne) {
                             throw new SAXException("illegal jcr:primaryType value: "
                                     + attrValue, ne);
                         }
                     }
-                } else if (propName.equals(QName.JCR_MIXINTYPES)) {
+                } else if (propName.equals(NameConstants.JCR_MIXINTYPES)) {
                     // jcr:mixinTypes
                     mixinTypes = parseNames(attrValue);
-                } else if (propName.equals(QName.JCR_UUID)) {
+                } else if (propName.equals(NameConstants.JCR_UUID)) {
                     // jcr:uuid
                     if (attrValue.length() > 0) {
                         id = NodeId.valueOf(attrValue);
Index: src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/PropInfo.java	(working copy)
@@ -33,8 +33,8 @@
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.util.ReferenceChangeTracker;
 import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,7 +58,7 @@
     /**
      * Name of the property being imported.
      */
-    private final QName name;
+    private final Name name;
 
     /**
      * Type of the property being imported.
@@ -77,7 +77,7 @@
      * @param type type of the property being imported
      * @param values value(s) of the property being imported
      */
-    public PropInfo(QName name, int type, TextValue[] values) {
+    public PropInfo(Name name, int type, TextValue[] values) {
         this.name = name;
         this.type = type;
         this.values = values;
@@ -115,7 +115,7 @@
     }
 
     public void apply(
-            NodeImpl node, NamespaceResolver resolver,
+            NodeImpl node, NamePathResolver resolver,
             ReferenceChangeTracker refTracker) throws RepositoryException {
         // find applicable definition
         PropDef def = getApplicablePropertyDef(node.getEffectiveNodeType());
Index: src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java	(working copy)
@@ -16,10 +16,12 @@
  */
 package org.apache.jackrabbit.core.xml;
 
-import org.apache.jackrabbit.name.NameResolver;
-import org.apache.jackrabbit.name.ParsingNameResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.NameResolver;
+import org.apache.jackrabbit.conversion.ParsingNameResolver;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.value.ValueHelper;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.NameConstants;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -52,8 +54,8 @@
     private static final Attributes ATTRS_BINARY_ENCODED_VALUE;
     static {
         AttributesImpl attrs = new AttributesImpl();
-        attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_INSTANCE_PREFIX, "xmlns:" + NS_XMLSCHEMA_INSTANCE_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_INSTANCE_URI);
-        attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_PREFIX, "xmlns:" + NS_XMLSCHEMA_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_URI);
+        attrs.addAttribute(Name.NS_XMLNS_URI, NS_XMLSCHEMA_INSTANCE_PREFIX, "xmlns:" + NS_XMLSCHEMA_INSTANCE_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_INSTANCE_URI);
+        attrs.addAttribute(Name.NS_XMLNS_URI, NS_XMLSCHEMA_PREFIX, "xmlns:" + NS_XMLSCHEMA_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_URI);
         attrs.addAttribute(NS_XMLSCHEMA_INSTANCE_URI, "type", NS_XMLSCHEMA_INSTANCE_PREFIX + ":type", "CDATA", NS_XMLSCHEMA_PREFIX + ":base64Binary");
         ATTRS_BINARY_ENCODED_VALUE = attrs;
     }
@@ -79,7 +81,7 @@
                                     ContentHandler contentHandler)
             throws RepositoryException {
         super(node, noRecurse, skipBinary, contentHandler);
-        resolver = new ParsingNameResolver(nsResolver);
+        resolver = new ParsingNameResolver(NameFactoryImpl.getInstance(), nsResolver);
     }
 
     /**
@@ -99,9 +101,9 @@
             nodeName = node.getName();
         }
 
-        addAttribute(attrs, QName.SV_NAME, CDATA_TYPE, nodeName);
+        addAttribute(attrs, NameConstants.SV_NAME, CDATA_TYPE, nodeName);
         // start node element
-        startElement(QName.SV_NODE, attrs);
+        startElement(NameConstants.SV_NODE, attrs);
     }
 
     /**
@@ -126,7 +128,7 @@
     protected void leaving(Node node, int level)
             throws RepositoryException, SAXException {
         // end node element
-        endElement(QName.SV_NODE);
+        endElement(NameConstants.SV_NODE);
     }
 
     /**
@@ -136,11 +138,11 @@
             throws RepositoryException, SAXException {
         AttributesImpl attrs = new AttributesImpl();
         // name attribute
-        addAttribute(attrs, QName.SV_NAME, CDATA_TYPE, prop.getName());
+        addAttribute(attrs, NameConstants.SV_NAME, CDATA_TYPE, prop.getName());
         // type attribute
         try {
             String typeName = PropertyType.nameFromValue(prop.getType());
-            addAttribute(attrs, QName.SV_TYPE, ENUMERATION_TYPE, typeName);
+            addAttribute(attrs, NameConstants.SV_TYPE, ENUMERATION_TYPE, typeName);
         } catch (IllegalArgumentException e) {
             // should never be getting here
             throw new RepositoryException(
@@ -148,13 +150,13 @@
         }
 
         // start property element
-        startElement(QName.SV_PROPERTY, attrs);
+        startElement(NameConstants.SV_PROPERTY, attrs);
 
         // values
         if (prop.getType() == PropertyType.BINARY && skipBinary) {
             // empty value element
-            startElement(QName.SV_VALUE, new AttributesImpl());
-            endElement(QName.SV_VALUE);
+            startElement(NameConstants.SV_VALUE, new AttributesImpl());
+            endElement(NameConstants.SV_VALUE);
         } else {
             boolean multiValued = prop.getDefinition().isMultiple();
             Value[] vals;
@@ -186,7 +188,7 @@
                 }
 
                 // start value element
-                startElement(QName.SV_VALUE, attributes);
+                startElement(NameConstants.SV_VALUE, attributes);
 
                 // characters
                 Writer writer = new Writer() {
@@ -220,7 +222,7 @@
                 }
 
                 // end value element
-                endElement(QName.SV_VALUE);
+                endElement(NameConstants.SV_VALUE);
 
                 if (mustSendBinary) {
                     contentHandler.endPrefixMapping(NS_XMLSCHEMA_INSTANCE_PREFIX);
@@ -235,14 +237,14 @@
      */
     protected void leaving(Property prop, int level)
             throws RepositoryException, SAXException {
-        endElement(QName.SV_PROPERTY);
+        endElement(NameConstants.SV_PROPERTY);
     }
 
     //-------------------------------------------------------------< private >
 
     /**
      * Adds an attribute to the given XML attribute set. The local part of
-     * the given {@link QName} is assumed to be a valid XML NCName, i.e. it
+     * the given {@link Name} is assumed to be a valid XML NCName, i.e. it
      * won't be encoded.
      *
      * @param attributes the XML attribute set
@@ -252,7 +254,7 @@
      * @throws NamespaceException if the namespace of the attribute is not found
      */
     private void addAttribute(
-            AttributesImpl attributes, QName name, String type, String value)
+            AttributesImpl attributes, Name name, String type, String value)
             throws NamespaceException {
         attributes.addAttribute(
                 name.getNamespaceURI(), name.getLocalName(),
@@ -260,14 +262,14 @@
     }
 
     /**
-     * Starts an XML element. The local part of the given {@link QName} is
+     * Starts an XML element. The local part of the given {@link Name} is
      * assumed to be a valid XML NCName, i.e. it won't be encoded.
      *
      * @param name name of the element
      * @param attributes XML attributes
      * @throws NamespaceException if the namespace of the element is not found
      */
-    private void startElement(QName name, Attributes attributes)
+    private void startElement(Name name, Attributes attributes)
             throws NamespaceException, SAXException {
         contentHandler.startElement(
                 name.getNamespaceURI(), name.getLocalName(),
@@ -275,13 +277,13 @@
     }
 
     /**
-     * Ends an XML element. The local part of the given {@link QName} is
+     * Ends an XML element. The local part of the given {@link Name} is
      * assumed to be a valid XML NCName, i.e. it won't be encoded.
      *
      * @param name name of the element
      * @throws NamespaceException if the namespace of the element is not found
      */
-    private void endElement(QName name)
+    private void endElement(Name name)
             throws NamespaceException, SAXException {
         contentHandler.endElement(
                 name.getNamespaceURI(), name.getLocalName(),
Index: src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java	(working copy)
@@ -32,8 +32,8 @@
 import org.apache.jackrabbit.core.xml.Importer;
 import org.apache.jackrabbit.core.xml.SAXParserProvider;
 import org.apache.jackrabbit.core.xml.WorkspaceImporter;
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.spi.Path;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
Index: src/main/java/org/apache/jackrabbit/core/ItemImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/ItemImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/ItemImpl.java	(working copy)
@@ -34,10 +34,11 @@
 import org.apache.jackrabbit.core.state.StaleItemStateException;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.version.VersionManager;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.name.NameConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -524,7 +525,7 @@
                 PropDef[] pda = ent.getMandatoryPropDefs();
                 for (int i = 0; i < pda.length; i++) {
                     PropDef pd = pda[i];
-                    if (pd.getDeclaringNodeType().equals(QName.MIX_VERSIONABLE)) {
+                    if (pd.getDeclaringNodeType().equals(NameConstants.MIX_VERSIONABLE)) {
                         /**
                          * todo FIXME workaround for mix:versionable:
                          * the mandatory properties are initialized at a
@@ -767,8 +768,8 @@
             if (itemState.isNode()) {
                 NodeState nodeState = (NodeState) itemState;
                 EffectiveNodeType nt = validator.getEffectiveNodeType(nodeState);
-                if (nt.includesNodeType(QName.MIX_VERSIONABLE)) {
-                    if (!nodeState.hasPropertyName(QName.JCR_VERSIONHISTORY)) {
+                if (nt.includesNodeType(NameConstants.MIX_VERSIONABLE)) {
+                    if (!nodeState.hasPropertyName(NameConstants.JCR_VERSIONHISTORY)) {
                         NodeImpl node = (NodeImpl) itemMgr.getItem(itemState.getId());
                         VersionManager vMgr = session.getVersionManager();
                         /**
@@ -783,10 +784,10 @@
                         if (vh == null) {
                             vh = vMgr.createVersionHistory(session, nodeState);
                         }
-                        node.internalSetProperty(QName.JCR_VERSIONHISTORY, InternalValue.create(new UUID(vh.getUUID())));
-                        node.internalSetProperty(QName.JCR_BASEVERSION, InternalValue.create(new UUID(vh.getRootVersion().getUUID())));
-                        node.internalSetProperty(QName.JCR_ISCHECKEDOUT, InternalValue.create(true));
-                        node.internalSetProperty(QName.JCR_PREDECESSORS,
+                        node.internalSetProperty(NameConstants.JCR_VERSIONHISTORY, InternalValue.create(new UUID(vh.getUUID())));
+                        node.internalSetProperty(NameConstants.JCR_BASEVERSION, InternalValue.create(new UUID(vh.getRootVersion().getUUID())));
+                        node.internalSetProperty(NameConstants.JCR_ISCHECKEDOUT, InternalValue.create(true));
+                        node.internalSetProperty(NameConstants.JCR_PREDECESSORS,
                                 new InternalValue[]{InternalValue.create(new UUID(vh.getRootVersion().getUUID()))});
                         createdTransientState = true;
                     }
@@ -822,7 +823,7 @@
         // check state of this instance
         sanityCheck();
 
-        Path.PathElement thisName = getPrimaryPath().getNameElement();
+        Path.Element thisName = getPrimaryPath().getNameElement();
 
         // check if protected
         if (isNode()) {
@@ -883,13 +884,13 @@
 
     /**
      * Same as <code>{@link Item#getName()}</code> except that
-     * this method returns a <code>QName</code> instead of a
+     * this method returns a <code>Name</code> instead of a
      * <code>String</code>.
      *
-     * @return the name of this item as <code>QName</code>
+     * @return the name of this item as <code>Name</code>
      * @throws RepositoryException if an error occurs.
      */
-    public abstract QName getQName() throws RepositoryException;
+    public abstract Name getQName() throws RepositoryException;
 
     //----------------------------------------------------< ItemStateListener >
     /**
Index: src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java	(revision 583889)
+++ src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java	(working copy)
@@ -23,11 +23,13 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.NodeStateListener;
 import org.apache.jackrabbit.core.util.Dumpable;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.util.PathMap;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.PathMap;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.name.PathFactoryImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -118,8 +120,8 @@
 
         if (state.isNode() && !isCached(state.getId())) {
             try {
-                Path.PathBuilder builder = new Path.PathBuilder();
-                Path.PathElement[] elements = path.getElements();
+                PathBuilder builder = new PathBuilder();
+                Path.Element[] elements = path.getElements();
                 for (int i = 0; i < next; i++) {
                     builder.addLast(elements[i]);
                 }
@@ -140,14 +142,14 @@
      * being used. If no mapping is found, the item is cached instead after
      * the base implementation has been invoked.
      */
-    protected void buildPath(Path.PathBuilder builder, ItemState state)
+    protected void buildPath(PathBuilder builder, ItemState state)
             throws ItemStateException, RepositoryException {
 
         if (state.isNode()) {
             PathMap.Element element = get(state.getId());
             if (element != null) {
                 try {
-                    Path.PathElement[] elements = element.getPath().getElements();
+                    Path.Element[] elements = element.getPath().getElements();
                     for (int i = elements.length - 1; i >= 0; i--) {
                         builder.addFirst(elements[i]);
                     }
@@ -227,7 +229,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getName(ItemId id)
+    public Name getName(ItemId id)
             throws ItemNotFoundException, RepositoryException {
 
         if (id.denotesNode()) {
@@ -351,12 +353,12 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeAdded(NodeState state, QName name, int index, NodeId id) {
+    public void nodeAdded(NodeState state, Name name, int index, NodeId id) {
         // Optimization: ignore notifications for nodes that are not in the cache
         synchronized (cacheMonitor) {
             if (idCache.containsKey(state.getNodeId())) {
                 try {
-                    Path path = Path.create(getPath(state.getNodeId()), name, index, true);
+                    Path path = PathFactoryImpl.getInstance().create(getPath(state.getNodeId()), name, index, true);
                     insert(path, id);
                 } catch (PathNotFoundException e) {
                     log.warn("Unable to get path of node " + state.getNodeId()
@@ -415,7 +417,7 @@
                      * whether their position changed or not - as we might need
                      * to reorder them later on.
                      */
-                    Path.PathElement newNameIndex = Path.PathElement.create(
+                    Path.Element newNameIndex = PathFactoryImpl.getInstance().createElement(
                             cne.getName(), cne.getIndex());
                     newChildrenOrder.put(newNameIndex, child);
 
@@ -435,12 +437,12 @@
     /**
      * {@inheritDoc}
      */
-    public void nodeRemoved(NodeState state, QName name, int index, NodeId id) {
+    public void nodeRemoved(NodeState state, Name name, int index, NodeId id) {
         // Optimization: ignore notifications for nodes that are not in the cache
         synchronized (cacheMonitor) {
             if (idCache.containsKey(state.getNodeId())) {
                 try {
-                    Path path = Path.create(getPath(state.getNodeId()), name, index, true);
+                    Path path = PathFactoryImpl.getInstance().create(getPath(state.getNodeId()), name, index, true);
                     remove(path, id);
                 } catch (PathNotFoundException e) {
                     log.warn("Unable to get path of node " + state.getNodeId()
Index: src/main/java/org/apache/jackrabbit/core/security/AMContext.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/security/AMContext.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/security/AMContext.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.apache.jackrabbit.core.HierarchyManager;
 import org.apache.jackrabbit.core.fs.FileSystem;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
 import javax.security.auth.Subject;
 import java.io.File;
Index: src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.journal;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 import org.apache.jackrabbit.util.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -292,7 +292,7 @@
             selectRevisionsStmt.execute();
 
             return new DatabaseRecordIterator(
-                    selectRevisionsStmt.getResultSet(), getResolver());
+                    selectRevisionsStmt.getResultSet(), getResolver(), getNamePathResolver());
         } catch (SQLException e) {
             close(true);
 
Index: src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java	(working copy)
@@ -16,15 +16,12 @@
  */
 package org.apache.jackrabbit.core.journal;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
-import org.apache.jackrabbit.name.NoPrefixDeclaredException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathFormat;
-import org.apache.jackrabbit.name.UnknownPrefixException;
-import org.apache.jackrabbit.name.IllegalNameException;
-import org.apache.jackrabbit.name.MalformedPathException;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.name.PathFactoryImpl;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.NameException;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
@@ -33,7 +30,9 @@
 import org.apache.jackrabbit.core.nodetype.compact.ParseException;
 import org.apache.jackrabbit.uuid.Constants;
 import org.apache.jackrabbit.uuid.UUID;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
+import javax.jcr.NamespaceException;
 import java.util.ArrayList;
 import java.util.List;
 import java.io.StringWriter;
@@ -63,22 +62,25 @@
     /**
      * Namespace resolver.
      */
-    protected final NamespaceResolver resolver;
+    protected final NamespaceResolver nsResolver;
 
+    protected final NamePathResolver resolver;
+
     /**
      * Create a new instance of this class.
      */
-    public AbstractRecord(NamespaceResolver resolver) {
+    public AbstractRecord(NamespaceResolver nsResolver, NamePathResolver resolver) {
+        this.nsResolver = nsResolver;
         this.resolver = resolver;
     }
 
     /**
      * {@inheritDoc}
      */
-    public void writeQName(QName name) throws JournalException {
+    public void writeQName(Name name) throws JournalException {
         try {
-            writeString(NameFormat.format(name, resolver));
-        } catch (NoPrefixDeclaredException e) {
+            writeString(resolver.getJCRName(name));
+        } catch (NamespaceException e) {
             String msg = "Undeclared prefix error while writing name.";
             throw new JournalException(msg, e);
         }
@@ -87,7 +89,7 @@
     /**
      * {@inheritDoc}
      */
-    public void writePathElement(Path.PathElement element) throws JournalException {
+    public void writePathElement(Path.Element element) throws JournalException {
         writeQName(element.getName());
         writeInt(element.getIndex());
     }
@@ -97,8 +99,8 @@
      */
     public void writePath(Path path) throws JournalException {
         try {
-            writeString(PathFormat.format(path, resolver));
-        } catch (NoPrefixDeclaredException e) {
+            writeString(resolver.getJCRPath(path));
+        } catch (NamespaceException e) {
             String msg = "Undeclared prefix error while writing path.";
             throw new JournalException(msg, e);
         }
@@ -137,7 +139,7 @@
     public void writeNodeTypeDef(NodeTypeDef ntd) throws JournalException {
         try {
             StringWriter sw = new StringWriter();
-            CompactNodeTypeDefWriter writer = new CompactNodeTypeDefWriter(sw, resolver, true);
+            CompactNodeTypeDefWriter writer = new CompactNodeTypeDefWriter(sw, nsResolver, resolver, true);
             writer.write(ntd);
             writer.close();
 
@@ -151,13 +153,13 @@
     /**
      * {@inheritDoc}
      */
-    public QName readQName() throws JournalException {
+    public Name readQName() throws JournalException {
         try {
-            return NameFormat.parse(readString(), resolver);
-        } catch (UnknownPrefixException e) {
+            return resolver.getQName(readString());
+        } catch (NameException e) {
             String msg = "Unknown prefix error while reading name.";
             throw new JournalException(msg, e);
-        } catch (IllegalNameException e) {
+        } catch (NamespaceException e) {
             String msg = "Illegal name error while reading name.";
             throw new JournalException(msg, e);
         }
@@ -166,19 +168,19 @@
     /**
      * {@inheritDoc}
      */
-    public Path.PathElement readPathElement() throws JournalException {
+    public Path.Element readPathElement() throws JournalException {
         try {
-            QName name = NameFormat.parse(readString(), resolver);
+            Name name = resolver.getQName(readString());
             int index = readInt();
             if (index != 0) {
-                return Path.PathElement.create(name, index);
+                return PathFactoryImpl.getInstance().createElement(name, index);
             } else {
-                return Path.PathElement.create(name);
+                return PathFactoryImpl.getInstance().createElement(name);
             }
-        } catch (UnknownPrefixException e) {
+        } catch (NameException e) {
             String msg = "Unknown prefix error while reading path element.";
             throw new JournalException(msg, e);
-        } catch (IllegalNameException e) {
+        } catch (NamespaceException e) {
             String msg = "Illegal name error while reading path element.";
             throw new JournalException(msg, e);
         }
@@ -189,10 +191,16 @@
      */
     public Path readPath() throws JournalException {
         try {
-            return PathFormat.parse(readString(), resolver);
+            return resolver.getQPath(readString());
         } catch (MalformedPathException e) {
             String msg = "Malformed path error while reading path.";
             throw new JournalException(msg, e);
+        } catch (NamespaceException e) {
+            String msg = "Malformed path error while reading path.";
+            throw new JournalException(msg, e);
+        } catch (NameException e) {
+            String msg = "Malformed path error while reading path.";
+            throw new JournalException(msg, e);
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/AppendRecord.java	(working copy)
@@ -106,7 +106,7 @@
      * @param producerId producer identifier
      */
     public AppendRecord(AbstractJournal journal, String producerId) {
-        super(journal.getResolver());
+        super(journal.getResolver(), journal.getNamePathResolver());
 
         this.journal = journal;
         this.producerId = producerId;
Index: src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/FileJournal.java	(working copy)
@@ -18,7 +18,7 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
 import java.util.Arrays;
 import java.util.Comparator;
@@ -156,7 +156,7 @@
                 }
             });
         }
-        return new FileRecordIterator(logFiles, startRevision, stopRevision, getResolver());
+        return new FileRecordIterator(logFiles, startRevision, stopRevision, getResolver(), getNamePathResolver());
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/journal/Journal.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/Journal.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/Journal.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.journal;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
 
 /**
  * Generic journal interface.
Index: src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/ReadRecord.java	(working copy)
@@ -16,8 +16,9 @@
  */
 package org.apache.jackrabbit.core.journal;
 
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import java.io.IOException;
 import java.io.DataInputStream;
@@ -62,9 +63,9 @@
      */
     public ReadRecord(String journalId, String producerId,
                       long revision, DataInputStream dataIn, int length,
-                      NamespaceResolver resolver) {
+                      NamespaceResolver resolver, NamePathResolver npResolver) {
 
-        super(resolver);
+        super(resolver, npResolver);
 
         this.journalId = journalId;
         this.producerId = producerId;
@@ -244,7 +245,7 @@
         throw unsupported();
     }
 
-    public void writeQName(QName name) throws JournalException {
+    public void writeQName(Name name) throws JournalException {
         throw unsupported();
     }
 
Index: src/main/java/org/apache/jackrabbit/core/journal/DatabaseRecordIterator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/DatabaseRecordIterator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/DatabaseRecordIterator.java	(working copy)
@@ -18,7 +18,8 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import java.util.NoSuchElementException;
 import java.sql.ResultSet;
@@ -47,6 +48,11 @@
     private final NamespaceResolver resolver;
 
     /**
+     * Name and Path resolver.
+     */
+    private final NamePathResolver npResolver;
+
+    /**
      * Current record.
      */
     private ReadRecord record;
@@ -64,9 +70,10 @@
     /**
      * Create a new instance of this class.
      */
-    public DatabaseRecordIterator(ResultSet rs, NamespaceResolver resolver) {
+    public DatabaseRecordIterator(ResultSet rs, NamespaceResolver resolver, NamePathResolver npResolver) {
         this.rs = rs;
         this.resolver = resolver;
+        this.npResolver = npResolver;
     }
 
     /**
@@ -131,7 +138,7 @@
             String journalId = rs.getString(2);
             String producerId = rs.getString(3);
             DataInputStream dataIn = new DataInputStream(rs.getBinaryStream(4));
-            record = new ReadRecord(journalId, producerId, revision, dataIn, 0, resolver);
+            record = new ReadRecord(journalId, producerId, revision, dataIn, 0, resolver, npResolver);
         } else {
             isEOF = true;
         }
Index: src/main/java/org/apache/jackrabbit/core/journal/Record.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/Record.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/Record.java	(working copy)
@@ -19,8 +19,8 @@
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.Path;
 
 /**
  * Record interface.
@@ -97,20 +97,20 @@
     public void readFully(byte[] b) throws JournalException;
 
     /**
-     * Read a <code>QName</code> frmo the underlying stream.
+     * Read a <code>Name</code> frmo the underlying stream.
      *
      * @return name name
      * @throws JournalException if an error occurs
      */
-    public QName readQName() throws JournalException;
+    public Name readQName() throws JournalException;
 
     /**
-     * Read a <code>Path.PathElement</code> from the underlying stream.
+     * Read a <code>Path.Element</code> from the underlying stream.
      *
      * @return path element
      * @throws JournalException if an error occurs
      */
-    public Path.PathElement readPathElement() throws JournalException;
+    public Path.Element readPathElement() throws JournalException;
 
     /**
      * Read a <code>Path</code> from the underlying stream.
@@ -193,20 +193,20 @@
     public void write(byte[] b) throws JournalException;
 
     /**
-     * Write a <code>QName</code> to the underlying stream.
+     * Write a <code>Name</code> to the underlying stream.
      *
      * @param name name
      * @throws JournalException if an error occurs
      */
-    public void writeQName(QName name) throws JournalException;
+    public void writeQName(Name name) throws JournalException;
 
     /**
-     * Write a <code>Path.PathElement</code> to the underlying stream.
+     * Write a <code>Path.Element</code> to the underlying stream.
      *
      * @param element path element
      * @throws JournalException if an error occurs
      */
-    public void writePathElement(Path.PathElement element) throws JournalException;
+    public void writePathElement(Path.Element element) throws JournalException;
 
     /**
      * Write a <code>Path</code> to the underlying stream.
Index: src/main/java/org/apache/jackrabbit/core/journal/FileRecordLog.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/FileRecordLog.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/FileRecordLog.java	(working copy)
@@ -18,7 +18,8 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import java.io.File;
 import java.io.DataInputStream;
@@ -223,7 +224,7 @@
      * @return file record
      * @throws java.io.IOException if an I/O error occurs
      */
-    public ReadRecord read(NamespaceResolver resolver) throws IOException {
+    public ReadRecord read(NamespaceResolver resolver, NamePathResolver npResolver) throws IOException {
         String journalId = in.readUTF();
         String producerId = in.readUTF();
         int length = in.readInt();
@@ -233,7 +234,7 @@
                 4 + length;
 
         long revision = previousRevision + position;
-        return new ReadRecord(journalId, producerId, revision, in, length, resolver);
+        return new ReadRecord(journalId, producerId, revision, in, length, resolver, npResolver);
     }
 
     /**
Index: src/main/java/org/apache/jackrabbit/core/journal/FileRecordIterator.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/FileRecordIterator.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/FileRecordIterator.java	(working copy)
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.core.journal;
 
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
 
 import java.io.File;
 import java.io.IOException;
@@ -49,6 +50,11 @@
     private NamespaceResolver resolver;
 
     /**
+     * Name and Path resolver.
+     */
+    private NamePathResolver npResolver;
+
+    /**
      * Current record log, containing file records.
      */
     private FileRecordLog recordLog;
@@ -66,11 +72,12 @@
      * @param stopRevision stop point (inclusive)
      */
     public FileRecordIterator(File[] logFiles, long startRevision, long stopRevision,
-                              NamespaceResolver resolver) {
+                              NamespaceResolver resolver, NamePathResolver npResolver) {
         this.logFiles = logFiles;
         this.revision = startRevision;
         this.stopRevision = stopRevision;
         this.resolver = resolver;
+        this.npResolver = npResolver;
     }
 
 
@@ -117,7 +124,7 @@
         }
 
         try {
-            record = recordLog.read(resolver);
+            record = recordLog.read(resolver, npResolver);
             revision = record.getRevision();
             return record;
         } catch (IOException e) {
Index: src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/journal/AbstractJournal.java	(working copy)
@@ -26,7 +26,9 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.conversion.NamePathResolver;
+import org.apache.jackrabbit.conversion.DefaultNamePathResolver;
 
 /**
  * Base journal implementation.
@@ -49,6 +51,11 @@
     private NamespaceResolver resolver;
 
     /**
+     * NamePathResolver
+     */
+    private NamePathResolver npResolver;
+
+    /**
      * Map of registered consumers.
      */
     private final Map consumers = new HashMap();
@@ -70,6 +77,7 @@
     public void init(String id, NamespaceResolver resolver) throws JournalException {
         this.id = id;
         this.resolver = resolver;
+        this.npResolver = new DefaultNamePathResolver(resolver, true);
     }
 
     /**
@@ -320,4 +328,13 @@
     public NamespaceResolver getResolver() {
         return resolver;
     }
+
+    /**
+     * Return this journal's NamePathResolver.
+     *
+     * @return name and path resolver
+     */
+    public NamePathResolver getNamePathResolver() {
+        return npResolver;
+    }
 }
\ No newline at end of file
Index: src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java	(revision 581921)
+++ src/main/java/org/apache/jackrabbit/core/HierarchyManagerImpl.java	(working copy)
@@ -22,10 +22,13 @@
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.name.PathResolver;
-import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.conversion.MalformedPathException;
+import org.apache.jackrabbit.conversion.PathResolver;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.name.PathBuilder;
+import org.apache.jackrabbit.name.PathFactoryImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,9 +45,9 @@
 
     /**
      * The parent name returned for orphaned or root nodes.
-     * TODO: Is it proper to use an invalid QName for this.
+     * TODO: Is it proper to use an invalid Name for this.
      */
-    private static final QName EMPTY_NAME = new QName("", "");
+    private static final Name EMPTY_NAME = NameFactoryImpl.getInstance().create("", "");
 
     protected final NodeId rootNodeId;
     protected final ItemStateManager provider;
@@ -177,10 +180,10 @@
      * @return the <code>ChildNodeEntry</code> of <code>parent</code> with
      *         the specified <code>name</code> and <code>index</code> or
      *         <code>null</code> if there's no such entry.
-     * @see ZombieHierarchyManager#getChildNodeEntry(NodeState, QName, int)
+     * @see ZombieHierarchyManager#getChildNodeEntry(NodeState, Name, int)
      */
     protected NodeState.ChildNodeEntry getChildNodeEntry(NodeState parent,
-                                                         QName name,
+                                                         Name name,
                                                          int index) {
         return parent.getChildNodeEntry(name, index);
     }
@@ -225,13 +228,13 @@
     protected ItemId resolvePath(Path path, ItemState state, int next)
             throws ItemStateException {
 
-        Path.PathElement[] elements = path.getElements();
+        Path.Element[] elements = path.getElements();
         if (elements.length == next) {
             return state.getId();
         }
-        Path.PathElement elem = elements[next];
+        Path.Element elem = elements[next];
 
-        QName name = elem.getName();
+        Name name = elem.getName();
         int index = elem.getIndex();
         if (index == 0) {
             index = 1;
@@ -275,7 +278,7 @@
      * @param builder builder currently being used
      * @param state   item to find path of
      */
-    protected void buildPath(Path.PathBuilder builder, ItemState state)
+    protected void buildPath(PathBuilder builder, ItemState state)
             throws ItemStateException, RepositoryException {
 
         // shortcut
@@ -315,7 +318,7 @@
             }
         } else {
             PropertyState propState = (PropertyState) state;
-            QName name = propState.getName();
+            Name name = propState.getName();
             // add to path
             builder.addLast(name);
         }
@@ -347,10 +350,10 @@
             throws ItemNotFoundException, RepositoryException {
         // shortcut
         if (id.equals(rootNodeId)) {
-            return Path.ROOT;
+            return PathFactoryImpl.getInstance().getRootPath();
         }
 
-        Path.PathBuilder builder = new Path.PathBuilder();
+        PathBuilder builder = new PathBuilder();
 
         try {
             buildPath(builder, getItemState(id));
@@ -373,7 +376,7 @@
     /**
      * {@inheritDoc}
      */
-    public QName getName(ItemId itemId)
+    public Name getName(ItemId itemId)
             throws ItemNotFoundException, RepositoryException {
         if (itemId.denotesNode()) {
             NodeId nodeId = (NodeId) itemId;
Index: src/main/javacc/sql/JCRSQL.jjt
===================================================================
--- src/main/javacc/sql/JCRSQL.jjt	(revision 584082)
+++ src/main/javacc/sql/JCRSQL.jjt	(working copy)
@@ -41,31 +41,33 @@
  */
 package org.apache.jackrabbit.core.query.sql;
 
-import org.apache.jackrabbit.name.NameException;
-import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.conversion.NameException;
+import org.apache.jackrabbit.conversion.NameResolver;
 import org.apache.jackrabbit.core.query.QueryConstants;
+import org.apache.jackrabbit.name.NameFactoryImpl;
+import org.apache.jackrabbit.spi.Name;
 
+import javax.jcr.NamespaceException;
+
 public class JCRSQLParser {
 
   private String statement;
 
-  private NamespaceResolver resolver;
+  private NameResolver resolver;
 
   public static void main(String args[]) throws ParseException {
   	JCRSQLParser parser = new JCRSQLParser(System.in);
   	parser.Query().dump("");
   }
 
-  public static ASTQuery parse(String statement, NamespaceResolver resolver) throws ParseException {
+  public static ASTQuery parse(String statement, NameResolver resolver) throws ParseException {
   	java.io.StringReader sReader = new java.io.StringReader(statement);
   	JCRSQLParser parser = new JCRSQLParser(sReader);
-  	parser.setNamespaceResolver(resolver);
+  	parser.setNameResolver(resolver);
   	return parser.Query();
   }
 
-  void setNamespaceResolver(NamespaceResolver resolver) {
+  void setNameResolver(NameResolver resolver) {
         this.resolver = resolver;
   }
 
@@ -300,7 +302,7 @@
 void Predicate() :
 {
   int operationType;
-  QName identifier;
+  Name identifier;
   String value;
   String escapeString;
 }
@@ -376,9 +378,9 @@
   )
 }
 
-QName PropertyFunction() #void :
+Name PropertyFunction() #void :
 {
-  QName identifier;
+  Name identifier;
 }
 {
   (
@@ -390,9 +392,9 @@
   }
 }
 
-QName LowerFunction() :
+Name LowerFunction() :
 {
-  QName identifier;
+  Name identifier;
 }
 {
   (
@@ -403,9 +405,9 @@
   }
 }
 
-QName UpperFunction() :
+Name UpperFunction() :
 {
-  QName identifier;
+  Name identifier;
 }
 {
   (
@@ -495,7 +497,7 @@
 void ContainsExpression() :
 {
   Token t = null;
-  QName name = null;
+  Name name = null;
 }
 {
   <CONTAINS>
@@ -567,28 +569,32 @@
   }
 }
 
-QName Identifier() :
+Name Identifier() :
 {
   Token t = null;
-  QName name = null;
+  Name name = null;
 }
 {
   (
     t = <REGULAR_IDENTIFIER>
       {
         try {
-          jjtThis.setName(NameFormat.parse(t.image, resolver));
+          jjtThis.setName(resolver.getQName(t.image));
         } catch (NameException e) {
           throw new ParseException(e.getMessage());
+        } catch (NamespaceException e) {
+          throw new ParseException(e.getMessage());
         }
       }
   |
     t = <DELIMITED_IDENTIFIER>
       {
         try {
-          jjtThis.setName(NameFormat.parse(t.image.substring(1, t.image.length()-1), resolver));
+          jjtThis.setName(resolver.getQName(t.image.substring(1, t.image.length()-1)));
         } catch (NameException e) {
           throw new ParseException(e.getMessage());
+        } catch (NamespaceException e) {
+          throw new ParseException(e.getMessage());
         }
       }
   |
@@ -611,9 +617,11 @@
       )
       {
         try {
-          jjtThis.setName(NameFormat.parse(t.image, resolver));
+          jjtThis.setName(resolver.getQName(t.image));
         } catch (NameException e) {
           throw new ParseException(e.getMessage());
+        } catch (NamespaceException e) {
+          throw new ParseException(e.getMessage());
         }
       }
     )
@@ -623,12 +631,12 @@
   }
 }
 
-QName ExcerptFunction() :
+Name ExcerptFunction() :
 {}
 {
   <EXCERPT> "(" <PERIOD> ")"
   {
-    return new QName(QName.NS_REP_URI, "excerpt(.)");
+    return NameFactoryImpl.getInstance().create(Name.NS_REP_URI, "excerpt(.)");
   }
 }
 
Index: pom.xml
===================================================================
--- pom.xml	(revision 581921)
+++ pom.xml	(working copy)
@@ -272,6 +272,14 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-spi-commons</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-spi</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
       <artifactId>jackrabbit-text-extractors</artifactId>
     </dependency>
     <dependency>
