Index: src/java/javax/jdo/spi/JDOImplHelper.java
===================================================================
--- src/java/javax/jdo/spi/JDOImplHelper.java	(revision 190415)
+++ src/java/javax/jdo/spi/JDOImplHelper.java	(working copy)
@@ -182,6 +182,18 @@
     }
     
     /** Create a new instance of the ObjectId class of this <code>PersistenceCapable</code>
+     * class, using the <code>Object</code> form of the constructor.
+     * @return the new ObjectId instance, or <code>null</code> if the class is not registered.
+     * @param str the <code>Object</code> form of the object id
+     * @param pcClass the <code>PersistenceCapable</code> class.
+     */    
+    public Object newObjectIdInstance (Class pcClass, Object obj) {
+        Meta meta = getMeta (pcClass);
+        PersistenceCapable pcInstance = meta.getPC();
+        return pcInstance == null?null:pcInstance.jdoNewObjectIdInstance(obj);
+    }
+    
+    /** Create a new instance of the ObjectId class of this <code>PersistenceCapable</code>
      * class, using the <code>String</code> form of the constructor.
      * @return the new ObjectId instance, or <code>null</code> if the class is not registered.
      * @param str the <code>String</code> form of the object id
Index: src/java/javax/jdo/JDOHelper.java
===================================================================
--- src/java/javax/jdo/JDOHelper.java	(revision 190415)
+++ src/java/javax/jdo/JDOHelper.java	(working copy)
@@ -30,6 +30,7 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Map;
 import java.util.Properties;
 
 import javax.jdo.spi.I18NHelper;
@@ -249,7 +250,7 @@
      * @see #getPersistenceManagerFactory(Properties,ClassLoader)
      */
     public static PersistenceManagerFactory getPersistenceManagerFactory
-            (Properties props) {
+            (Map props) {
         ClassLoader cl = Thread.currentThread().getContextClassLoader();
         return getPersistenceManagerFactory (props, cl);
     }
@@ -287,15 +288,49 @@
      * @param cl a class loader to use to load the <code>PersistenceManagerFactory</code> class.
      */
     public static PersistenceManagerFactory getPersistenceManagerFactory
-            (Properties props, ClassLoader cl) {
+            (Map props, ClassLoader cl) {
         String pmfClassName = (String) props.get ("javax.jdo.PersistenceManagerFactoryClass"); //NOI18N
         if (pmfClassName == null) {
             throw new JDOFatalUserException (msg.msg("EXC_NoClassNameProperty")); // NOI18N
         }
+        Method propsMethod = null;
+        Exception propsGetMethodException = null;
+        Method mapMethod = null;
+        Exception mapGetMethodException = null;
+        Method pmfMethod = null;
         try {
             Class pmfClass = cl.loadClass (pmfClassName);
-            Method pmfMethod = pmfClass.getMethod ("getPersistenceManagerFactory",  //NOI18N
-                new Class[] {Properties.class});
+            try {
+                propsMethod = pmfClass.getMethod("getPersistenceManagerFactory",  //NOI18N
+                    new Class[] {Properties.class});
+            } catch (NoSuchMethodException nsme) {
+                propsGetMethodException = nsme;
+            }
+            try {
+                mapMethod = pmfClass.getMethod("getPersistenceManagerFactory",  //NOI18N
+                    new Class[] {Map.class});
+            } catch (NoSuchMethodException nsme) {
+                mapGetMethodException = nsme;
+            }
+            /* If the parameter is not a Properties, 
+             * we need a mapMethod or else throw an exception.
+             */
+            if (!(props instanceof Properties)) {
+                if (mapMethod != null) {
+                    pmfMethod = mapMethod;
+                } else {
+                    throw mapGetMethodException;
+                }
+            } else { // the parameter is a Properties; use either method.
+                if (mapMethod != null) {
+                    pmfMethod = mapMethod;
+                } else if (propsMethod != null) {
+                    pmfMethod = propsMethod;
+                } else {
+                    throw mapGetMethodException;
+                }
+            }
+            
             return (PersistenceManagerFactory) pmfMethod.invoke (null, new Object[] {props});
         } catch (ClassNotFoundException cnfe) {
             throw new JDOFatalUserException (msg.msg("EXC_ClassNotFound", pmfClassName), cnfe); //NOI18N
@@ -312,7 +347,7 @@
             throw new JDOFatalInternalException (msg.msg("ERR_UnexpectedException"), e); //NOI18N
         }
     }
-
+    
     /**
      * Returns a {@link PersistenceManagerFactory} configured based
      * on the properties stored in the resource at
Index: src/java/javax/jdo/Bundle.properties
===================================================================
--- src/java/javax/jdo/Bundle.properties	(revision 190415)
+++ src/java/javax/jdo/Bundle.properties	(working copy)
@@ -46,3 +46,11 @@
 PersistenceManagerFactory at "{0}" from JNDI.
 EXC_StringWrongLength: There must be exactly one character in the id in the input String for CharIdentity.
 EXC_IllegalEventType:The event type is outside the range of valid event types.
+EXC_ObjectIdentityStringConstruction: The instance could not be constructed from \
+the parameter String "{0}". \nThe exception thrown was: "{1}". \n\
+Parsing the class name as "{2}" and key as "{3}".
+EXC_ObjectIdentityStringConstructionNoDelimiter: Missing delimiter ":".
+EXC_ObjectIdentityStringConstructionTooShort: Parameter is too short.
+EXC_ObjectIdentityStringConstructionUsage: The instance could not be constructed \
+from the parameter String "{0}". \
+\nThe parameter String is of the form "<className>:<keyString>".
