Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java	(revision 1374810)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java	(working copy)
@@ -178,8 +178,6 @@
     public Node getNode(final String absPath) throws RepositoryException {
         ensureIsAlive();
 
-        // FIXME: deal with identifier path (OAK-23)
-
         return dlg.perform(new SessionOperation<NodeImpl>() {
             @Override
             public NodeImpl perform() throws RepositoryException {
@@ -197,8 +195,6 @@
     public boolean nodeExists(final String absPath) throws RepositoryException {
         ensureIsAlive();
 
-        // FIXME: deal with identifier path (OAK-23)
-
         return dlg.perform(new SessionOperation<Boolean>() {
             @Override
             public Boolean perform() throws RepositoryException {
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java	(revision 1374810)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java	(working copy)
@@ -462,16 +462,10 @@
                     case PropertyType.PATH:
                     case PropertyType.NAME:
                         String path = value.getString();
-                        if (path.startsWith("[") && path.endsWith("]")) {
-                            // TODO OAK-23
-                            // TODO correct for NAME?
-                            return getSession().getNodeByIdentifier(path.substring(1, path.length() - 1));
-                        } else {
-                            try {
-                                return (path.charAt(0) == '/') ? getSession().getNode(path) : getParent().getNode(path);
-                            } catch (PathNotFoundException e) {
-                                throw new ItemNotFoundException(path);
-                            }
+                        try {
+                            return (path.charAt(0) == '/') ? getSession().getNode(path) : getParent().getNode(path);
+                        } catch (PathNotFoundException e) {
+                            throw new ItemNotFoundException(path);
                         }
 
                     case PropertyType.STRING:
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java	(revision 1374810)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java	(working copy)
@@ -61,7 +61,7 @@
 public class SessionDelegate {
     static final Logger log = LoggerFactory.getLogger(SessionDelegate.class);
 
-    private final NamePathMapper namePathMapper = new NamePathMapperImpl(new SessionNameMapper());
+    private final NamePathMapper namePathMapper;
     private final Repository repository;
     private final ScheduledExecutorService executor;
     private final ContentSession contentSession;
@@ -88,13 +88,14 @@
         this.repository = repository;
         this.executor = executor;
         this.contentSession = contentSession;
-        this.valueFactory = new ValueFactoryImpl(contentSession.getCoreValueFactory(), namePathMapper);
         this.workspace = new WorkspaceImpl(this);
         this.session = new SessionImpl(this);
         this.root = contentSession.getCurrentRoot();
         this.conflictHandler = new AnnotatingConflictHandler(contentSession.getCoreValueFactory());
         this.autoRefresh = autoRefresh;
         this.idManager = new IdentifierManager(contentSession, root);
+        this.namePathMapper = new NamePathMapperImpl(new SessionNameMapper(), idManager);
+        this.valueFactory = new ValueFactoryImpl(contentSession.getCoreValueFactory(), namePathMapper);
     }
 
     /**
Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueFactoryImpl.java
===================================================================
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueFactoryImpl.java	(revision 1374810)
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueFactoryImpl.java	(working copy)
@@ -163,17 +163,9 @@
                     break;
 
                 case PropertyType.PATH:
-                    // TODO we special case identifier paths here for now
-                    // eventually this should be done in the path mapper (OAK-23)
-
-                    String oakValue;
-                    if (value.startsWith("[") && value.endsWith("]")) {
-                        oakValue = value;
-                    } else {
-                        oakValue = namePathMapper.getOakPath(value);
-                        if (oakValue == null) {
-                            throw new ValueFormatException("Invalid path: " + value);
-                        }
+                    String oakValue = namePathMapper.getOakPath(value);
+                    if (oakValue == null) {
+                        throw new ValueFormatException("Invalid path: " + value);
                     }
                     cv = factory.createValue(oakValue, type);
                     break;
Index: oak-jcr/pom.xml
===================================================================
--- oak-jcr/pom.xml	(revision 1374810)
+++ oak-jcr/pom.xml	(working copy)
@@ -34,7 +34,6 @@
   <properties>
     <known.issues>
 org.apache.jackrabbit.test.api.AddNodeTest#testSameNameSiblings<!-- OAK-203 -->
-org.apache.jackrabbit.test.api.PathTest#testGetItem<!-- OAK-23 -->
 org.apache.jackrabbit.test.api.SessionTest#testMoveConstraintViolationExceptionSrc<!--OAK-132-->
 org.apache.jackrabbit.test.api.SessionTest#testMoveConstraintViolationExceptionDest<!--OAK-132-->
 org.apache.jackrabbit.test.api.SessionTest#testSaveConstraintViolationException<!--OAK-66-->
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java	(revision 1374810)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java	(working copy)
@@ -21,6 +21,7 @@
 
 import javax.annotation.Nonnull;
 
+import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,11 +36,18 @@
     private static final Logger log = LoggerFactory.getLogger(NamePathMapperImpl.class);
 
     private final NameMapper nameMapper;
+    private final IdentifierManager idManager;
 
     public NamePathMapperImpl(NameMapper nameMapper) {
         this.nameMapper = nameMapper;
+        this.idManager = null;
     }
 
+    public NamePathMapperImpl(NameMapper nameMapper, IdentifierManager idManager) {
+        this.nameMapper = nameMapper;
+        this.idManager = idManager;
+    }
+
     //---------------------------------------------------------< NameMapper >---
     @Override
     public String getOakName(String jcrName) {
@@ -151,13 +159,28 @@
             return "/";
         }
 
+        int length = jcrPath.length();
+
+        // identifier path?
+        if (length > 0 && jcrPath.charAt(0) == '[') {
+            if (jcrPath.charAt(length - 1) != ']') {
+                // TODO error handling?
+                return null;
+            }
+            if (this.idManager == null) {
+                // TODO error handling?
+                return null;
+            }
+            return this.idManager.getPath(jcrPath.substring(1, length - 1));
+        }
+
         boolean hasClarkBrackets = false;
         boolean hasIndexBrackets = false;
         boolean hasColon = false;
         boolean hasNameStartingWithDot = false;
 
         char prev = 0;
-        for (int i = 0; i < jcrPath.length(); i++) {
+        for (int i = 0; i < length; i++) {
             char c = jcrPath.charAt(i);
 
             if (c == '{' || c == '}') {
