diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditActivity.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditActivity.java
index 75b9e96..7769099 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditActivity.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditActivity.java
@@ -20,6 +20,7 @@
 import com.google.gwt.app.place.RecordEditView;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.requestfactory.shared.Receiver;
+import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.sample.expenses.gwt.request.EmployeeRecord;
 import com.google.gwt.sample.expenses.gwt.request.ExpensesRequestFactory;
@@ -89,9 +90,8 @@
   }
 
   @Override
-  protected void fireFindRequest(Value<Long> id,
-      Receiver<EmployeeRecord> callback) {
-    requests.employeeRequest().findEmployee(id).fire(callback);
+  protected RecordRequest<EmployeeRecord> getFindRequest(Value<Long> id) {
+    return requests.employeeRequest().findEmployee(id);
   }
 
   protected RequestObject<Void> getPersistRequest(EmployeeRecord record) {
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportEditActivity.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportEditActivity.java
index 91586c6..f4b02be 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportEditActivity.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportEditActivity.java
@@ -20,6 +20,7 @@
 import com.google.gwt.app.place.RecordEditView;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.requestfactory.shared.Receiver;
+import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.sample.expenses.gwt.request.EmployeeRecord;
 import com.google.gwt.sample.expenses.gwt.request.ExpensesRequestFactory;
@@ -89,8 +90,8 @@
   }
   
   @Override
-  protected void fireFindRequest(Value<Long> id, Receiver<ReportRecord> callback) {
-    requests.reportRequest().findReport(id).fire(callback);
+  protected RecordRequest<ReportRecord> getFindRequest(Value<Long> id) {
+    return requests.reportRequest().findReport(id);
   }
 
   protected RequestObject<Void> getPersistRequest(ReportRecord record) {
diff --git a/branch-info.txt b/branch-info.txt
index 2d80365..67d3506 100644
--- a/branch-info.txt
+++ b/branch-info.txt
@@ -16,5 +16,9 @@
 commited as r8611  
   r8619 svn merge https://google-web-toolkit.googlecode.com/svn/trunk -r8618:8619 .
 commited as r8620
+  r8600 svn merge https://google-web-toolkit.googlecode.com/svn/trunk -r8599:8600 .
+commited as r8626
+  r8630, 8631, 8632, 8633 svn merge https://google-web-toolkit.googlecode.com/svn/trunk -r8629:8633 .
+commited as r8634
 r8613: Removed the expenses sample from samples
 
diff --git a/user/build.xml b/user/build.xml
index b9ab352..ef30cdd 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -59,6 +59,9 @@
     <pathelement location="${gwt.tools.lib}/easymock/easymock.jar"/>
     <pathelement location="${gwt.tools.lib}/easymock/easymockclassextension.jar"/>
     <pathelement location="${gwt.tools.lib}/objectweb/asm-3.1.jar"/>
+    <pathelement location="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA.jar" />
+    <pathelement location="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA-sources.jar" />
+    <pathelement location="${gwt.tools}/redist/json/r2_20080312/json-1.5.jar" />
     <pathelement location="${gwt.dev.jar}" />
   </path>
 
@@ -108,8 +111,6 @@
         <pathelement location="${javac.out}" />
         <pathelement location="${gwt.tools.lib}/junit/junit-3.8.1.jar" />
         <pathelement location="${gwt.tools.lib}/selenium/selenium-java-client-driver.jar" />
-        <pathelement location="${gwt.tools}/redist/json/r2_20080312/json-1.5.jar" />
-        <pathelement location="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA.jar" />
         <path refid="test.extraclasspath" />
       </classpath>
     </gwt.javac>
diff --git a/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java b/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
index 13e918f..d27a8c6 100644
--- a/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
+++ b/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
@@ -18,6 +18,7 @@
 import com.google.gwt.app.place.ProxyPlace.Operation;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.requestfactory.shared.Receiver;
+import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.user.client.Window;
@@ -146,7 +147,6 @@
     toCommit.fire(receiver);
   }
 
-  @SuppressWarnings("unchecked")
   public void start(Display display, EventBus eventBus) {
     this.display = display;
 
@@ -154,11 +154,12 @@
     view.setCreating(creating);
 
     if (creating) {
-      R tempRecord = (R) requests.create(proxyType);
+      R tempRecord = requests.create(proxyType);
       futureId = tempRecord.getId();
       doStart(display, tempRecord);
     } else {
-      fireFindRequest(Value.of(getRecord().getId()), new Receiver<R>() {
+      RecordRequest<R> findRequest = getFindRequest(Value.of(getRecord().getId()));
+      findRequest.with(getView().getPaths()).fire(new Receiver<R>() {
         public void onSuccess(R record, Set<SyncResult> syncResults) {
           if (AbstractRecordEditActivity.this.display != null) {
             doStart(AbstractRecordEditActivity.this.display, record);
@@ -189,7 +190,7 @@
   /**
    * Called to fetch the details of the edited record.
    */
-  protected abstract void fireFindRequest(Value<Long> id, Receiver<R> callback);
+  protected abstract RecordRequest<R> getFindRequest(Value<Long> id);
 
   protected abstract RequestObject<Void> getPersistRequest(R record);
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/ClientRequestHelper.java b/user/src/com/google/gwt/requestfactory/client/impl/ClientRequestHelper.java
index 0ee5ffc..49c1823 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/ClientRequestHelper.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/ClientRequestHelper.java
@@ -47,7 +47,11 @@
     }-*/;
 
     private native String toJsonString()/*-{
-      return $wnd.JSON.stringify(this);
+      var gwt = this.__gwt_ObjectId;
+      delete this.__gwt_ObjectId;
+      var rtn = $wnd.JSON.stringify(this);
+      this.__gwt_ObjectId = gwt;
+      return rtn;
     }-*/;
   }
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
index c27f61a..c3a81f8 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -273,11 +273,8 @@
     RecordJsoImpl rawMasterRecord = master.records.get(recordKey);
     WriteOperation priorOperation = operations.get(recordKey);
     if (rawMasterRecord == null && priorOperation == null) {
-      // it was a create on RF that has not been pulled in to the DVS.
-      RecordJsoImpl oldRecord = requestFactory.creates.remove(recordKey);
-      assert oldRecord != null;
       operations.put(recordKey, WriteOperation.CREATE);
-      creates.put(recordKey, oldRecord);
+      creates.put(recordKey, recordImpl.asJso());
       priorOperation = WriteOperation.CREATE;
     }
     if (priorOperation == null) {
@@ -322,16 +319,6 @@
   String toJson() {
     used = true;
 
-    /*
-     * pull the creates that only the requestFactory knows about.
-     */
-    for (RecordKey recordKey : requestFactory.creates.keySet()) {
-      RecordJsoImpl oldRecord = requestFactory.creates.remove(recordKey);
-      assert oldRecord != null;
-      operations.put(recordKey, WriteOperation.CREATE);
-      creates.put(recordKey, oldRecord);
-    }
-
     StringBuffer jsonData = new StringBuffer("{");
     for (WriteOperation writeOperation : new WriteOperation[] {
         WriteOperation.CREATE, WriteOperation.UPDATE}) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
index 4209d0a..a41f5c0 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
@@ -359,11 +359,14 @@
     delete this.__rf;
     var vs = this.__vs;
     delete this.__vs;
+    var gwt = this.__gwt_ObjectId;
+    delete this.__gwt_ObjectId;
     // TODO verify that the stringify() from json2.js works on IE
     var rtn = $wnd.JSON.stringify(this);
     this.__key = key;
     this.__rf = rf;
     this.__vs = vs;
+    this.__gwt_ObjectId = gwt;
     return rtn;
   }-*/;
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
index 5b4af09..3228494 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
@@ -31,8 +31,6 @@
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.WriteOperation;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -62,8 +60,6 @@
 
   private long currentFutureId = 0;
 
-  final Map<RecordKey, RecordJsoImpl> creates = new HashMap<RecordKey, RecordJsoImpl>();
-
   private ValueStoreJsonImpl valueStore;
 
   private EventBus eventBus;
@@ -204,8 +200,6 @@
     Long futureId = ++currentFutureId;
     RecordJsoImpl newRecord = RecordJsoImpl.create(futureId, INITIAL_VERSION,
         schema);
-    RecordKey recordKey = new RecordKey(newRecord, IS_FUTURE);
-    creates.put(recordKey, newRecord);
     return schema.create(newRecord, IS_FUTURE);
   }
 
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index a0974cf..1f0d454 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -149,6 +149,7 @@
    * 
    * <li>Find the changes that need to be sent back.
    */
+  private Map<EntityKey, Object> cachedEntityLookup = new HashMap<EntityKey, Object>();
   private Set<EntityKey> involvedKeys = new HashSet<EntityKey>();
   private Map<EntityKey, DvsData> dvsDataMap = new HashMap<EntityKey, DvsData>();
   private Map<EntityKey, SerializedEntity> beforeDataMap = new HashMap<EntityKey, SerializedEntity>();
@@ -287,6 +288,7 @@
       if (service != null) {
         Class<?> sClass = service.value();
         EntityKey entityKey = getEntityKey(parameterValue.toString());
+
         DvsData dvsData = dvsDataMap.get(entityKey);
         try {
           if (dvsData != null) {
@@ -294,7 +296,9 @@
                 dvsData.jsonObject, dvsData.writeOperation);
             return entityData.entityInstance;
           } else {
-            Method findMeth = sClass.getMethod(getMethodNameFromPropertyName(sClass.getSimpleName(), "find"), Long.class);
+            Method findMeth = sClass.getMethod(
+                getMethodNameFromPropertyName(sClass.getSimpleName(), "find"),
+                Long.class);
             return findMeth.invoke(null, entityKey.id);
           }
         } catch (NoSuchMethodException e) {
@@ -396,11 +400,14 @@
       Object entityInstance = getEntityInstance(writeOperation, entity,
           recordObject.get("id"), propertiesInRecord.get("id"));
 
+      cachedEntityLookup.put(entityKey, entityInstance);
+
       Set<ConstraintViolation<Object>> violations = Collections.emptySet();
       Iterator<?> keys = recordObject.keys();
       while (keys.hasNext()) {
         String key = (String) keys.next();
         Class<?> propertyType = propertiesInRecord.get(key);
+        Class<?> dtoType = propertiesToDTO.get(key);
         if (writeOperation == WriteOperation.CREATE && ("id".equals(key))) {
           Long id = generateIdForCreate(key);
           if (id != null) {
@@ -408,8 +415,20 @@
                 propertyType).invoke(entityInstance, id);
           }
         } else {
-          Object propertyValue = getPropertyValueFromRequest(recordObject, key,
-              propertiesToDTO.get(key));
+          Object propertyValue = null;
+          if (Record.class.isAssignableFrom(dtoType)) {
+            EntityKey propKey = getEntityKey(recordObject.getString(key));
+            Object cacheValue = cachedEntityLookup.get(propKey);
+            if (cachedEntityLookup.containsKey(propKey)) {
+              propertyValue = cacheValue;
+            } else {
+              propertyValue = getPropertyValueFromRequest(recordObject, key,
+               propertiesToDTO.get(key));
+            }
+          } else {
+             propertyValue = getPropertyValueFromRequest(recordObject, key,
+               propertiesToDTO.get(key));
+          }
           entity.getMethod(getMethodNameFromPropertyName(key, "set"),
               propertyType).invoke(entityInstance, propertyValue);
         }
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
index 0921b4d..c4a458a 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
@@ -137,7 +137,8 @@
     DeltaValueStoreJsonImpl deltaValueStore = new DeltaValueStoreJsonImpl(
         valueStore, requestFactory);
     String json = deltaValueStore.toJson();
-    testAndGetChangeRecord(json, WriteOperation.CREATE);
+    JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(json);
+    assertFalse(jsonObject.containsKey(WriteOperation.CREATE.name()));
   }
 
   public void testCreateWithSet() {
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
index 301bb8d..63a8e32 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
@@ -103,6 +103,10 @@
     return get(enumField);
   }
 
+  public SimpleFooRecord getFooField() {
+    return (SimpleFooRecord) getValueStore().getRecordBySchemaAndId(SCHEMA, (Long) (Object) get(fooField));
+  }
+
   public java.lang.Integer getIntId() {
     return get(intId);
   }
@@ -131,6 +135,10 @@
     // ignore
   }
 
+  public void setFooField(SimpleFooRecord fooField) {
+    // ignore
+  }
+
   public void setIntId(Integer intId) {
     // ignore
   }
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 3ac6136..02733ec 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -204,6 +204,26 @@
     });
   }
 
+   public void testPersistRecursiveRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    SimpleFooRecord rayFoo = req.create(SimpleFooRecord.class);
+    final RequestObject<SimpleFooRecord> persistRay = req.simpleFooRequest().persistAndReturnSelf(
+        rayFoo);
+    rayFoo = persistRay.edit(rayFoo);
+    rayFoo.setUserName("Ray");
+    rayFoo.setFooField(rayFoo);
+    persistRay.fire(new Receiver<SimpleFooRecord>() {
+      public void onSuccess(final SimpleFooRecord persistedRay,
+          Set<SyncResult> ignored) {
+        finishTest();
+      }
+    });
+  }
+
   public void testPersistRelation() {
     final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
     HandlerManager hm = new HandlerManager(null);
diff --git a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
index 27a967f..aa7be4c 100644
--- a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
@@ -88,6 +88,8 @@
 
   private SimpleBar barField;
 
+  private SimpleFoo fooField;
+
   public SimpleFoo() {
     intId = 42;
     version = 1;
@@ -115,6 +117,10 @@
     return enumField;
   }
 
+  public SimpleFoo getFooField() {
+    return fooField;
+  }
+
   public Long getId() {
     return id;
   }
@@ -164,6 +170,10 @@
     this.enumField = enumField;
   }
 
+  public void setFooField(SimpleFoo fooField) {
+    this.fooField = fooField;
+  }
+
   public void setId(Long id) {
     this.id = id;
   }
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java b/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
index b0cf7a2..a161c2b 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
@@ -42,6 +42,9 @@
   Property<SimpleBarRecord> barField = new Property<SimpleBarRecord>("barField",
       SimpleBarRecord.class);
 
+  Property<SimpleFooRecord> fooField = new Property<SimpleFooRecord>("fooField",
+      SimpleFooRecord.class);
+
   SimpleBarRecord getBarField();
 
   Boolean getBoolField();
@@ -50,6 +53,8 @@
 
   SimpleEnum getEnumField();
 
+  SimpleFooRecord getFooField();
+
   Integer getIntId();
 
   Long getLongField();
@@ -64,6 +69,8 @@
 
   void setCreated(Date created);
 
+  void setFooField(SimpleFooRecord fooField);
+
   void setIntId(Integer intId);
 
   void setLongField(Long longField);
