diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
index 1f82e1a..699e655 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
@@ -15,11 +15,10 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.math.BigDecimal;
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -38,10 +37,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new BigDecimal(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new BigDecimal(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
index 8bfd778..7a20d17 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
@@ -15,12 +15,11 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -39,10 +38,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new BigDecimal(responseText).toBigInteger(),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new BigDecimal(responseText).toBigInteger(), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
index 29c39dc..2ad281e 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Boolean.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Boolean.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
index e1b0f46..b2092c6 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Integer.valueOf(responseText).byteValue(),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Integer.valueOf(responseText).byteValue(), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
index 4ed98fe..89abf70 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(responseText.charAt(0), 
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(responseText.charAt(0), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
index d87264c..d37f07c 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
@@ -15,11 +15,10 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
 import java.util.Date;
+import java.util.Set;
 
 /**
  * <p>
@@ -38,10 +37,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new Date(Long.valueOf(responseText)),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new Date(Long.valueOf(responseText)), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
index 52deeef..7732d0c 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Double.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Double.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
index f25c997..443b483 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -42,13 +41,13 @@
     this.enumValues = enumValues;
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
+      Set<SyncResult> syncResults) {
     int ordinal = Integer.valueOf(responseText);
     for (E e : enumValues) {
       if (ordinal == e.ordinal()) {
-        receiver.onSuccess(ordinal,
-            Collections.<SyncResult> emptySet());
+        receiver.onSuccess(ordinal, syncResults);
       }
     }
     throw new IllegalArgumentException("Invalid enum ordinal value " + ordinal);
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
index a082a035..c0f061f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Float.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Float.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
index fa091c4..de68a2d 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Integer.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Integer.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
index 3880847..995a07f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
@@ -15,15 +15,14 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.requestfactory.shared.RecordListRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -50,7 +49,8 @@
     this.schema = schema;
   }
 
-  public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
+  @Override
+  public void handleResult(Object jsoResult, Set<SyncResult> syncResults) {
 
     JsArray<RecordJsoImpl> valueJsos = (JsArray<RecordJsoImpl>) jsoResult;
     List<T> valueList = new ArrayList<T>(valueJsos.length());
@@ -62,6 +62,6 @@
 
     requestFactory.getValueStore().setRecords(valueJsos, requestFactory);
 
-    receiver.onSuccess(valueList, Collections.<SyncResult> emptySet());
+    receiver.onSuccess(valueList, syncResults);
   }
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
index 7f9cc2b..e4d8cdf 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
@@ -15,12 +15,11 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p> <span style="color:red">Experimental API: This class is still under rapid
@@ -44,14 +43,15 @@
     this.schema = schema;
   }
 
-  public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
+  @Override
+  public void handleResult(Object jsoResult, Set<SyncResult> syncResults) {
 
     RecordJsoImpl jso = (RecordJsoImpl) jsoResult;
     jso.setSchema(schema);
 
     requestFactory.getValueStore().setRecord(jso, requestFactory);
 
-    receiver.onSuccess(schema.create(jso), Collections.<SyncResult>emptySet());
+    receiver.onSuccess(schema.create(jso), syncResults);
   }
 
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
index d72fee2..0314a28 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Long.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Long.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
index 0e797ca..83569e1 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
@@ -15,7 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.valuestore.shared.SyncResult;
+
+import java.util.Set;
 
 /**
  * <p>
@@ -36,10 +38,11 @@
     super(requestFactory);
   }
 
-  public void handleResult(Object result, JavaScriptObject sideEffects) {
-    handlePrimitiveResult(asString(result), sideEffects);
+  @Override
+  public void handleResult(Object result, Set<SyncResult> syncResults) {
+    handlePrimitiveResult(asString(result), syncResults);
   }
 
   protected abstract void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects);
+      Set<SyncResult> syncResults);
 }
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 651b8c9..833fbb1 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -20,6 +20,7 @@
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
+import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -95,9 +96,10 @@
   }
 
   public void handleResponseText(String responseText) {
-     RecordJsoImpl.JsonResults results = RecordJsoImpl.fromResults(responseText);
+    RecordJsoImpl.JsonResults results = RecordJsoImpl.fromResults(responseText);
     processRelated(results.getRelated());
-    handleResult(results.getResult(), results.getSideEffects());
+    handleResult(results.getResult(),
+        deltaValueStore.commit(results.getSideEffects()));
   }
   
   public boolean isChanged() {
@@ -128,7 +130,7 @@
   protected abstract R getThis();
 
   protected abstract void handleResult(Object result,
-      JavaScriptObject sideEffects);
+      Set<SyncResult> syncResults);
 
   protected native void processRelated(JavaScriptObject related) /*-{
     for(var recordKey in related) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
index 9450caf..4c8ab1d 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Short.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Short.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
index c15cd1c..4718f78 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(responseText,
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(responseText, syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
index 2ac72e9..40a2886 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.Set;
@@ -37,9 +36,9 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    Set<SyncResult> syncResults = deltaValueStore.commit(sideEffects);
+      Set<SyncResult> syncResults) {
     receiver.onSuccess(null, syncResults);
   }
 
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 68aca5b..8aec549 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -55,12 +55,6 @@
       }
     }-*/;
 
-    private static native JavaScriptObject getJsoResponse(String response) /*-{
-      // TODO: clean and optimize this.
-      eval("xyz=" + response);
-      return xyz["sideEffects"];
-    }-*/;
-
     protected ReturnRecord() {
     }
 
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index a530606..f1940fe 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -697,16 +697,17 @@
     JSONObject envelop = new JSONObject();
     if (result instanceof List<?>) {
       envelop.put(RequestData.RESULT_TOKEN, toJsonArray(operation, result));
-      envelop.put("sideEffects", sideEffects);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
       return envelop;
     } else if (result instanceof Number || result instanceof Enum
         || result instanceof String || result instanceof Date
         || result instanceof Character || result instanceof Boolean) {
       envelop.put(RequestData.RESULT_TOKEN, result);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
     } else {
       JSONObject jsonObject = toJsonObject(operation, result);
       envelop.put(RequestData.RESULT_TOKEN, jsonObject);
-      envelop.put("sideEffects", sideEffects);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
       return envelop;
     }
     envelop.put(RequestData.RELATED_TOKEN, encodeRelatedObjectsToJson());
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestData.java b/user/src/com/google/gwt/requestfactory/shared/RequestData.java
index b8995cc..15d7421 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestData.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestData.java
@@ -42,6 +42,8 @@
 
   public static final String RELATED_TOKEN = "related";
 
+  public static final String SIDE_EFFECTS_TOKEN = "sideEffects";
+
   // TODO: non-final is a hack for now.
   private String operation;
   private final Object[] parameters;
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 1fa3c73..b82f85a 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -20,6 +20,7 @@
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
+import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SimpleBarRecord;
 import com.google.gwt.valuestore.shared.SimpleFooRecord;
 import com.google.gwt.valuestore.shared.SimpleRequestFactory;
@@ -142,4 +143,48 @@
           }
         });
   }
+
+  /*
+   * tests that (a) any method can have a side effect that is handled correctly. (b)
+   * instance methods are handled correctly.
+   */
+  public void testMethodWithSideEffects() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    req.simpleFooRequest().findSimpleFooById(999L).fire(
+        new Receiver<SimpleFooRecord>() {
+
+          public void onSuccess(SimpleFooRecord newFoo,
+              Set<SyncResult> syncResults) {
+            final RequestObject<Long> fooReq = req.simpleFooRequest().countSimpleFooWithUserNameSideEffect(
+                newFoo);
+            newFoo = fooReq.edit(newFoo);
+            newFoo.setUserName("Ray");
+            fooReq.fire(new Receiver<Long>() {
+              public void onSuccess(Long response, Set<SyncResult> syncResults) {
+                assertEquals(new Long(1L), response);
+                // confirm that there was a sideEffect.
+                assertEquals(1, syncResults.size());
+                SyncResult syncResultArray[] = syncResults.toArray(new SyncResult[0]);
+                assertFalse(syncResultArray[0].hasViolations());
+                assertNull(syncResultArray[0].getFutureId());
+                Record record = syncResultArray[0].getRecord();
+                assertEquals(new Long(999L), record.getId());
+                // confirm that the instance method did have the desired sideEffect.
+                req.simpleFooRequest().findSimpleFooById(999L).fire(
+                    new Receiver<SimpleFooRecord>() {
+                      public void onSuccess(SimpleFooRecord finalFoo,
+                          Set<SyncResult> syncResults) {
+                        assertEquals("Ray", finalFoo.getUserName());
+                        finishTest();
+                      }
+                    });
+              }
+            });
+          }
+        });
+  }
 }
diff --git a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
index d7c6639..52d84ac 100644
--- a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
@@ -52,6 +52,11 @@
     return singleton;
   }
 
+  public Long countSimpleFooWithUserNameSideEffect() {
+    singleton.setUserName(userName);
+    return 1L;
+  }
+
   public String hello(SimpleBar bar) {
     return "Greetings " + bar.getUserName() + " from " + getUserName();  
   }
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
index 76ed88f..4ccb524 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
@@ -28,6 +28,9 @@
 public interface SimpleFooRequest {
   RequestObject<Long> countSimpleFoo();
 
+  @Instance
+  RequestObject<Long> countSimpleFooWithUserNameSideEffect(SimpleFooRecord record);
+
   RecordListRequest<SimpleFooRecord> findAll();
 
   RecordRequest<SimpleFooRecord> findSimpleFooById(Long id);
