Index: src/java/javax/jdo/spi/StateManager.java
===================================================================
--- src/java/javax/jdo/spi/StateManager.java	(revision 230614)
+++ src/java/javax/jdo/spi/StateManager.java	(working copy)
@@ -466,51 +466,13 @@
      * @return the new value for the field
      */    
     Object replacingObjectField (PersistenceCapable pc, int field);
-
-    /** The replacing value of the object id in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param oid the current value of the oid
-     * @return the new value for the oid
-     * @since 2.0
-     */
-    Object replacingObjectId (PersistenceCapable pc, Object oid);
     
-    /** The replacing value of the version in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param version the current value of the version
-     * @return the new value for the version
+    /** The replacing value of the detached state in the calling instance.
+     * @param pc the calling <code>Detachable</code> instance
+     * @param state the current value of the detached state
+     * @return the replacement value for the detached state
      * @since 2.0
      */
-    Object replacingVersion (PersistenceCapable pc, Object version);
-
-    /** The provided value of the loaded field list in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param loaded the current value of the loaded field list
-     * @since 2.0
-     */
-    void providedLoadedFieldList (PersistenceCapable pc, BitSet loaded);
-
-    /** The replacing value of the loaded field list in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param loaded the current value of the loaded field list
-     * @return the replacement value for the loaded field list
-     * @since 2.0
-     */
-    BitSet replacingLoadedFieldList (PersistenceCapable pc, BitSet loaded);
-
-    /** The provided value of the modified field list in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param modified the current value of the modified field list
-     * @since 2.0
-     */
-    void providedModifiedFieldList (PersistenceCapable pc, BitSet modified);
-
-    /** The replacing value of the modified field list in the calling instance.
-     * @param pc the calling <code>PersistenceCapable</code> instance
-     * @param modified the current value of the modified field list
-     * @return the replacement value for the modified field list
-     * @since 2.0
-     */
-    BitSet replacingModifiedFieldList (PersistenceCapable pc, BitSet modified);
+    Object[] replacingDetachedState (Detachable pc, Object[] state);
 }
 
Index: src/java/javax/jdo/spi/Detachable.java
===================================================================
--- src/java/javax/jdo/spi/Detachable.java	(revision 230614)
+++ src/java/javax/jdo/spi/Detachable.java	(working copy)
@@ -14,44 +14,33 @@
  * limitations under the License.
  */
 
-/*
- * Detachable.java
- *
- */
-
 package javax.jdo.spi;
 
 /**
  * This interface is implemented by classes that can be detached from the
  * persistence context and later attached. The interface includes the 
- * contract by which the StateManager can set the object id and version
+ * contract by which the StateManager can set the object id, version,
+ * BitSet of loaded fields, and BitSet of modified fields 
  * so they are preserved while outside the persistence environment.
- * @version 2.0
- * @since 2.0
+ * <P>The detached state is stored as a field in each instance of Detachable. 
+ * The field is serialized so as to maintain the state of the instance 
+ * while detached. While detached, only the BitSet of modified fields 
+ * will be modified. The structure of the Object[] jdoDetachedState
+ * is as follows:
+ *  <ul><li>jdoDetachedState[0]: the Object Id of the instance
+ * </li><li>jdoDetachedState[1]: the Version of the instance
+ * </li><li>jdoDetachedState[2]: a BitSet of loaded fields
+ * </li><li>jdoDetachedState[3]: a BitSet of modified fields
+ * </li></ul>
  */
+
 public interface Detachable {
-    
-    /** Replace the object id in the detached object.
-     */
-    void jdoReplaceObjectId();
-    
-    /** Replace the version in the detached object.
-     */
-    void jdoReplaceVersion();
-    
-    /** Provide the loaded field list in the detached object.
-     */
-    void jdoProvideLoadedFieldList();
-    
-    /** Replace the loaded field list in the detached object.
-     */
-    void jdoReplaceLoadedFieldList();
-    
-    /** Provide the modified field list in the detached object.
-     */
-    void jdoProvideModifiedFieldList();
-    
-    /** Replace the modified field list in the detached object.
-     */
-    void jdoReplaceModifiedFieldList();
+
+    /** This method calls the StateManager with the current detached 
+     * state instance as a parameter and replaces the current detached 
+     * state instance with the value provided by the StateManager.  
+     * @version 2.0
+     * @since 2.0
+     */    
+    public void jdoReplaceDetachedState();
 }
Index: src/java/javax/jdo/spi/PersistenceCapable.java
===================================================================
--- src/java/javax/jdo/spi/PersistenceCapable.java	(revision 230614)
+++ src/java/javax/jdo/spi/PersistenceCapable.java	(working copy)
@@ -25,11 +25,9 @@
  */
 
 /**
- * A class that can be managed by a JDO implementation must implement this interface.
+ * A class that can be managed by a binary-compatible JDO implementation 
+ * must implement this interface.
  *
- * <P>Every class whose instances can be managed by a JDO PersistenceManager must
- * implement the PersistenceCapable interface.
- *
  * <P>This interface defines methods that allow the implementation to manage
  * the instances.  It also defines methods that allow a JDO aware
  * application to examine the runtime state of instances.  For example,
@@ -347,8 +345,18 @@
      */
     PersistenceCapable jdoNewInstance(StateManager sm, Object oid);
     
-    /** Create a new instance of the ObjectId class for this PersistenceCapable class.
-     * The fields will have their Java default values.
+    /** Create a new instance of the 
+     * ObjectId class for this PersistenceCapable class.
+     * This method creates a new instance of the class used for JDO identity.
+     * It is intended only for application identity. If the class has been 
+     * enhanced for datastore identity, or if the class is abstract, 
+     * null is returned.
+     * <P>For classes using single field identity, this method must be called 
+     * on an instance of a persistence-capable class with its primary key 
+     * field initialized (not null), or a 
+     * <code>JDONullIdentityException</code> is thrown.
+     * <P>The instance returned is initialized with the value(s) of the 
+     * primary key field(s) of the instance on which the method is called.
      * @return the new instance created.
      */
     Object jdoNewObjectIdInstance();
@@ -365,7 +373,9 @@
      */
     Object jdoNewObjectIdInstance(Object o);
     
-    /** Copy fields from this PersistenceCapable instance to the Object Id instance.
+    /** Copy fields from this PersistenceCapable instance to the Object Id 
+     * instance. For classes using single field identity, this method always
+     * throws JDOUserException.
      * @param oid the ObjectId target of the key fields
      */
     void jdoCopyKeyFieldsToObjectId(Object oid);
@@ -384,6 +394,8 @@
      * <P>}
      * <P>The implementation is responsible for implementing the
      * ObjectIdFieldSupplier to produce the values for the key fields.
+     * <P>For classes using single field identity, this method always
+     * throws JDOUserException.
      * @param oid the ObjectId target of the copy.
      * @param fm the field supplier that supplies the field values.
      */
@@ -402,7 +414,7 @@
      * <P>     fm.storeObjectField (2, oid.salary);
      * <P>}
      * <P>The implementation is responsible for implementing the
-     * ObjectIdFieldManager to store the values for the key fields.
+     * ObjectIdFieldConsumer to store the values for the key fields.
      * @param oid the ObjectId source of the copy.
      * @param fm the field manager that receives the field values.
      */
