diff --git a/branch-info.txt b/branch-info.txt
index d3fe056..f36f674 100644
--- a/branch-info.txt
+++ b/branch-info.txt
@@ -7,3 +7,10 @@
 /branches/2.1M3/ was created (r8601) as a straight copy from /trunk/@r8598
 
 Merge:
+Cherry-picks
+  r8599 Get rid of yellow background during cell selection
+  r8603 Snip a stray logging line
+  r8607 Add more tests to check that relationships are persisted correctly
+  r8608 Ignoring __gwt_ObjectId in AbstractRequest#processRelated
+  r8609 Snip stray debugging println.
+commited as  
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
index 833fbb1..8cf92e8 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -79,10 +79,10 @@
   /**
    * @deprecated use {@link #with(String...)} instead.
    * @param properties
-   * @return
    */
+  @Deprecated
   public R forProperties(Collection<Property<?>> properties) {
-    for (Property p : properties) {
+    for (Property<?> p : properties) {
       with(p.getName());
     }
     return getThis();
@@ -134,6 +134,8 @@
 
   protected native void processRelated(JavaScriptObject related) /*-{
     for(var recordKey in related) {
+      // Workaround for __gwt_ObjectId appearing in Chrome dev mode.
+      if (!related.hasOwnProperty(recordKey)) continue;
       var schemaAndId = recordKey.split(/-/, 2);
       var jso = related[recordKey];
       this.@com.google.gwt.requestfactory.client.impl.AbstractRequest::setSchemaAndRecord(Ljava/lang/String;Lcom/google/gwt/requestfactory/client/impl/RecordJsoImpl;)(schemaAndId[0], jso);
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index 8597d49..564a3d1 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -247,7 +247,6 @@
         int ordinal = Integer.parseInt(parameterValue);
         Method valuesMethod = parameterType.getDeclaredMethod("values",
             new Class[0]);
-        log.severe("Type is " + parameterType + " valuesMethod " + valuesMethod);
 
         if (valuesMethod != null) {
           valuesMethod.setAccessible(true);
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
index c3d1fb2..72dc579 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
@@ -66,7 +66,6 @@
     ensureConfig();
     String jsonRequestString = RPCServletUtils.readContent(
         request, JSON_CONTENT_TYPE, JSON_CHARSET);
-    System.err.println(jsonRequestString);
     response.setStatus(HttpServletResponse.SC_OK);
     PrintWriter writer = response.getWriter();
 
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTree.css b/user/src/com/google/gwt/user/cellview/client/CellTree.css
index 4ea469f..ee00850 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTree.css
+++ b/user/src/com/google/gwt/user/cellview/client/CellTree.css
@@ -28,7 +28,7 @@
 */
 
 .keyboardSelectedItem {
-  background-color: #ffff00;
+/*  background-color: #ffff00; */
 }
 	
 .openItem {
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTreeClean.css b/user/src/com/google/gwt/user/cellview/client/CellTreeClean.css
index 4c84711..5c393c7 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTreeClean.css
+++ b/user/src/com/google/gwt/user/cellview/client/CellTreeClean.css
@@ -28,7 +28,7 @@
 */
 
 .keyboardSelectedItem {
-  background-color: #ffff00;
+/*  background-color: #ffff00; */
 }
 
 .openItem {
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 651a46a..3ac6136 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -33,11 +33,182 @@
  */
 public class RequestFactoryTest extends GWTTestCase {
 
+  /*
+   * TODO: all these tests should check the final values. It will be easy when
+   * we have better persistence than the singleton pattern.
+   */
+  public void testPersistExistingEntityExistingRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    req.simpleBarRequest().findSimpleBarById(999L).fire(
+        new Receiver<SimpleBarRecord>() {
+          public void onSuccess(final SimpleBarRecord barRecord,
+              Set<SyncResult> syncResults) {
+            req.simpleFooRequest().findSimpleFooById(999L).fire(
+                new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord fooRecord,
+                      Set<SyncResult> syncResults) {
+                    RequestObject<Void> updReq = req.simpleFooRequest().persist(
+                        fooRecord);
+                    fooRecord = updReq.edit(fooRecord);
+                    fooRecord.setBarField(barRecord);
+                    updReq.fire(new Receiver<Void>() {
+                      public void onSuccess(Void response,
+                          Set<SyncResult> syncResults) {
+                        finishTest();
+                      }
+                    });
+                  }
+                });
+          }
+        });
+  }
+
+  /*
+   * Find Entity Create Entity2 Relate Entity2 to Entity Persist Entity
+   */
+  public void testPersistExistingEntityNewRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    SimpleBarRecord newBar = (SimpleBarRecord) req.create(SimpleBarRecord.class);
+
+    final RequestObject<Void> barReq = req.simpleBarRequest().persist(newBar);
+    newBar = barReq.edit(newBar);
+    newBar.setUserName("Amit");
+
+    final SimpleBarRecord finalNewBar = newBar;
+    req.simpleFooRequest().findSimpleFooById(999L).fire(
+        new Receiver<SimpleFooRecord>() {
+          public void onSuccess(SimpleFooRecord response,
+              Set<SyncResult> syncResults) {
+            RequestObject<Void> fooReq = req.simpleFooRequest().persist(
+                response);
+            response = fooReq.edit(response);
+            response.setBarField(finalNewBar);
+            fooReq.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).with(
+                    "barField.userName").fire(new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord finalFooRecord,
+                      Set<SyncResult> syncResults) {
+                    // barReq hasn't been persisted, so old value
+                    assertEquals("FOO",
+                        finalFooRecord.getBarField().getUserName());
+                    finishTest();
+                  }
+
+                });
+              }
+            });
+          }
+        });
+  }
+
+  /*
+   * Find Entity2 Create Entity, Persist Entity Relate Entity2 to Entity Persist
+   * Entity
+   */
+  public void testPersistNewEntityExistingRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+    SimpleFooRecord newFoo = (SimpleFooRecord) req.create(SimpleFooRecord.class);
+
+    final RequestObject<Void> fooReq = req.simpleFooRequest().persist(newFoo);
+
+    newFoo = fooReq.edit(newFoo);
+    newFoo.setUserName("Ray");
+
+    final SimpleFooRecord finalFoo = newFoo;
+    req.simpleBarRequest().findSimpleBarById(999L).fire(
+        new Receiver<SimpleBarRecord>() {
+          public void onSuccess(SimpleBarRecord response,
+              Set<SyncResult> syncResults) {
+            finalFoo.setBarField(response);
+            fooReq.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).fire(
+                    new Receiver<SimpleFooRecord>() {
+                      public void onSuccess(SimpleFooRecord finalFooRecord,
+                          Set<SyncResult> syncResults) {
+                        // newFoo hasn't been persisted, so userName is the old value.
+                        assertEquals("GWT", finalFooRecord.getUserName());
+                        finishTest();
+                      }
+
+                    });
+              }
+            });
+          }
+        });
+  }
+
+  /*
+   * Create Entity, Persist Entity Create Entity2, Perist Entity2 relate Entity2
+   * to Entity Persist
+   */
+  public void testPersistNewEntityNewRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+    SimpleFooRecord newFoo = (SimpleFooRecord) req.create(SimpleFooRecord.class);
+    SimpleBarRecord newBar = (SimpleBarRecord) req.create(SimpleBarRecord.class);
+
+    final RequestObject<SimpleFooRecord> fooReq = req.simpleFooRequest().persistAndReturnSelf(
+        newFoo);
+
+    newFoo = fooReq.edit(newFoo);
+    newFoo.setUserName("Ray");
+
+    final RequestObject<SimpleBarRecord> barReq = req.simpleBarRequest().persistAndReturnSelf(
+        newBar);
+    newBar = barReq.edit(newBar);
+    newBar.setUserName("Amit");
+
+    fooReq.fire(new Receiver<SimpleFooRecord>() {
+      public void onSuccess(final SimpleFooRecord persistedFoo,
+          Set<SyncResult> syncResult) {
+        barReq.fire(new Receiver<SimpleBarRecord>() {
+          public void onSuccess(final SimpleBarRecord persistedBar,
+              Set<SyncResult> syncResults) {
+            assertEquals("Ray", persistedFoo.getUserName());
+            final RequestObject<Void> fooReq2 = req.simpleFooRequest().persist(
+                persistedFoo);
+            SimpleFooRecord editablePersistedFoo = fooReq2.edit(persistedFoo);
+            editablePersistedFoo.setBarField(persistedBar);
+            fooReq2.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).with(
+                    "barField.userName").fire(new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord finalFooRecord,
+                      Set<SyncResult> syncResults) {
+                    assertEquals("Amit",
+                        finalFooRecord.getBarField().getUserName());
+                    finishTest();
+                  }
+
+                });
+              }
+            });
+          }
+        });
+      }
+    });
+  }
+
   public void testPersistRelation() {
     final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
     HandlerManager hm = new HandlerManager(null);
     req.init(hm);
-    delayTestFinish(500000);
+    delayTestFinish(5000);
 
     SimpleFooRecord rayFoo = req.create(SimpleFooRecord.class);
     final RequestObject<SimpleFooRecord> persistRay = req.simpleFooRequest().persistAndReturnSelf(
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java b/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
index 1b2bccd..4839ce8 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.valuestore.shared;
 
 import com.google.gwt.requestfactory.shared.Instance;
+import com.google.gwt.requestfactory.shared.RecordListRequest;
 import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.requestfactory.shared.Service;
@@ -26,9 +27,15 @@
 @Service(com.google.gwt.valuestore.server.SimpleBar.class)
 public interface SimpleBarRequest {
 
+  RequestObject<Long> countSimpleBar();
+
+  RecordListRequest<SimpleBarRecord> findAll();
+
+  RecordRequest<SimpleBarRecord> findSimpleBarById(Long id);
+
   @Instance
   RequestObject<Void> persist(SimpleBarRecord record);
-  
+
   @Instance
   RecordRequest<SimpleBarRecord> persistAndReturnSelf(SimpleBarRecord record);
 }
