Index: platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPUtils.java
===================================================================
--- platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPUtils.java	(revision 3958)
+++ platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPUtils.java	(working copy)
@@ -22,6 +22,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.naming.InvalidNameException;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
@@ -29,12 +30,15 @@
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.SearchResult;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
 
 import org.datanucleus.ClassLoaderResolver;
 import org.datanucleus.FetchPlan;
 import org.datanucleus.ManagedConnection;
 import org.datanucleus.ObjectManager;
 import org.datanucleus.StateManager;
+import org.datanucleus.exceptions.NucleusDataStoreException;
 import org.datanucleus.metadata.AbstractClassMetaData;
 import org.datanucleus.metadata.AbstractMemberMetaData;
 import org.datanucleus.query.compiler.QueryCompilation;
@@ -60,12 +64,23 @@
      * @param sm StateManager
      * @return Distinguished name
      */
-    public static String getDistinguishedNameForObject(StateManager sm)
+    public static LdapName getDistinguishedNameForObject(StateManager sm)
     {
         Object value = sm.provideField(sm.getClassMetaData().getPKMemberPositions()[0]);
         String dnKey = sm.getClassMetaData().getMetaDataForManagedMemberAtPosition(
             sm.getClassMetaData().getPKMemberPositions()[0]).getValueForExtension("dn");
-        return dnKey + "=" + value + "," + sm.getClassMetaData().getValueForExtension("dn");
+        //return dnKey + "=" + value + "," + sm.getClassMetaData().getValueForExtension("dn");
+        try
+        {
+            LdapName dn = new LdapName(sm.getClassMetaData().getValueForExtension("dn"));
+            Rdn rdn = new Rdn(dnKey, value);
+            dn.add(rdn);
+            return dn;
+        }
+        catch(InvalidNameException e)
+        {
+            throw new NucleusDataStoreException(e.getMessage(),e);
+        }
     }
 
     /**
Index: platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPPersistenceHandler.java
===================================================================
--- platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPPersistenceHandler.java	(revision 3958)
+++ platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/LDAPPersistenceHandler.java	(working copy)
@@ -23,6 +23,7 @@
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
+import javax.naming.ldap.LdapName;
 
 import org.datanucleus.store.ldap.fieldmanager.FetchFieldManager;
 import org.datanucleus.store.ldap.fieldmanager.InsertFieldManager;
@@ -116,7 +117,7 @@
             int[] fieldNumbers = sm.getClassMetaData().getAllMemberPositions();
             sm.provideFields(fieldNumbers, new InsertFieldManager(sm, attrs));
 
-            String dn = LDAPUtils.getDistinguishedNameForObject(sm);
+            LdapName dn = LDAPUtils.getDistinguishedNameForObject(sm);
             BasicAttribute objectClass = new BasicAttribute("ObjectClass");
             String[] objectClasses = sm.getClassMetaData().getValuesForExtension("objectClass");
             if (objectClasses!=null)
@@ -192,7 +193,7 @@
             final BasicAttributes attrsToRemove = new BasicAttributes();
             sm.provideFields(fieldNumbers, new UpdateFieldManager(sm, attrs, attrsToRemove));
 
-            String dn = LDAPUtils.getDistinguishedNameForObject(sm);
+            LdapName dn = LDAPUtils.getDistinguishedNameForObject(sm);
             BasicAttribute objectClass = new BasicAttribute("ObjectClass");
             String[] objectClasses = sm.getClassMetaData().getValuesForExtension("objectClass");
             if (objectClasses!=null)
@@ -318,7 +319,7 @@
             }
 
             DirContext ctx = (DirContext) mconn.getConnection();
-            String dn = LDAPUtils.getDistinguishedNameForObject(sm);
+            LdapName dn = LDAPUtils.getDistinguishedNameForObject(sm);
             final Attributes result = ctx.getAttributes(dn, null);
             sm.replaceFields(fieldNumbers, new FetchFieldManager(sm, result));
 
@@ -368,7 +369,7 @@
             try
             {
                 DirContext ctx = (DirContext) mconn.getConnection();
-                String dn = LDAPUtils.getDistinguishedNameForObject(sm);
+                LdapName dn = LDAPUtils.getDistinguishedNameForObject(sm);
                 ctx.getAttributes(dn, LDAPUtils.NO_ATTRIBUTES);
                 return;
             }
Index: platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/UpdateFieldManager.java
===================================================================
--- platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/UpdateFieldManager.java	(revision 3958)
+++ platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/UpdateFieldManager.java	(working copy)
@@ -86,7 +86,7 @@
                     sm.getObjectManager().persistObjectInternal(value, null, null, -1, StateManager.PC);
                 }
                 smpc = sm.getObjectManager().findStateManager(value);
-                attributes.put(new BasicAttribute(name, LDAPUtils.getDistinguishedNameForObject(smpc)));
+                attributes.put(new BasicAttribute(name, LDAPUtils.getDistinguishedNameForObject(smpc).toString()));
             }
             else if (mmd.getCollection() != null)
             {
@@ -104,7 +104,7 @@
                         sm.getObjectManager().persistObjectInternal(pc, null, null, -1, StateManager.PC);
                     }
                     smpc = sm.getObjectManager().findStateManager(pc);
-                    attr.add(LDAPUtils.getDistinguishedNameForObject(smpc));
+                    attr.add(LDAPUtils.getDistinguishedNameForObject(smpc).toString());
                 }
             }
             else
Index: platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/InsertFieldManager.java
===================================================================
--- platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/InsertFieldManager.java	(revision 3958)
+++ platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/InsertFieldManager.java	(working copy)
@@ -73,7 +73,7 @@
                     sm.getObjectManager().persistObjectInternal(value, null, null, -1, StateManager.PC);
                 }
                 smpc = sm.getObjectManager().findStateManager(value);
-                attributes.put(new BasicAttribute(name, LDAPUtils.getDistinguishedNameForObject(smpc)));
+                attributes.put(new BasicAttribute(name, LDAPUtils.getDistinguishedNameForObject(smpc).toString()));
             }
             else if (mmd.getCollection() != null)
             {
@@ -91,7 +91,7 @@
                         sm.getObjectManager().persistObjectInternal(pc, null, null, -1, StateManager.PC);
                     }
                     smpc = sm.getObjectManager().findStateManager(pc);
-                    attr.add(LDAPUtils.getDistinguishedNameForObject(smpc));
+                    attr.add(LDAPUtils.getDistinguishedNameForObject(smpc).toString());
                 }
             }
             else
Index: platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/FetchFieldManager.java
===================================================================
--- platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/FetchFieldManager.java	(revision 3958)
+++ platform/store.ldap/trunk/src/java/org/datanucleus/store/ldap/fieldmanager/FetchFieldManager.java	(working copy)
@@ -28,6 +28,8 @@
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
 
 import org.datanucleus.FetchPlan;
 import org.datanucleus.StateManager;
@@ -311,13 +313,9 @@
             final AbstractClassMetaData fieldTypeCmd = sm.getMetaDataManager().getMetaDataForClass(cls,
                 sm.getObjectManager().getClassLoaderResolver());
             String id = attr.get(pos).toString();
-            final BasicAttributes attrs = new BasicAttributes();
-            StringTokenizer token = new StringTokenizer(id, ",");
-            while (token.hasMoreTokens())
-            {
-                StringTokenizer t2 = new StringTokenizer(token.nextToken(), "=");
-                attrs.put(new BasicAttribute(t2.nextToken(), t2.nextToken()));
-            }
+            LdapName dn = new LdapName(id);
+            Rdn rdn = dn.getRdn(dn.size()-1);
+            final Attributes attrs = rdn.toAttributes();
             return sm.getObjectManager().findObjectUsingAID(cls, new FieldValues()
             {
                 public void fetchFields(StateManager sm)

