diff --git a/user/src/com/google/gwt/requestfactory/client/SyncResultImpl.java b/user/src/com/google/gwt/requestfactory/client/SyncResultImpl.java
index 7fd3136..e01dc46 100644
--- a/user/src/com/google/gwt/requestfactory/client/SyncResultImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/SyncResultImpl.java
@@ -32,15 +32,15 @@
 
   private final EntityProxy record;
   private final Map<String, String> violations;
-  private final Long futureId;
+  private final Object futureId;
   
-  public SyncResultImpl(EntityProxy record, Map<String, String> violations, Long futureId) {
+  public SyncResultImpl(EntityProxy record, Map<String, String> violations, Object futureId) {
     this.record = record;
     this.violations = violations;
     this.futureId = futureId;
   }
 
-  public Long getFutureId() {
+  public Object getFutureId() {
     return futureId;
   }
 
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 b47b399..ea086b2 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -18,8 +18,9 @@
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.requestfactory.client.SyncResultImpl;
-import com.google.gwt.requestfactory.shared.Property;
 import com.google.gwt.requestfactory.shared.EntityProxy;
+import com.google.gwt.requestfactory.shared.EntityProxyId;
+import com.google.gwt.requestfactory.shared.Property;
 import com.google.gwt.requestfactory.shared.SyncResult;
 import com.google.gwt.requestfactory.shared.WriteOperation;
 
@@ -162,23 +163,31 @@
       }
 
       for (Map.Entry<EntityProxyId, ProxyJsoImpl> entry : creates.entrySet()) {
-        final EntityProxyId futureKey = entry.getKey();
+        final EntityProxyIdImpl futureKey = (EntityProxyIdImpl) entry.getKey();
         // TODO change violationsMap to <Long, String>
         Map<String, String> violations = violationsMap.get(futureKey.id);
         assert violations != null;
         if (violations == NULL_VIOLATIONS) {
           Long datastoreId = futureToDatastoreId.get(futureKey.id);
           assert datastoreId != null;
-          final EntityProxyId key = new EntityProxyId(datastoreId, futureKey.schema,
-              RequestFactoryJsonImpl.NOT_FUTURE);
+          
+          // populate the two maps first.
+          requestFactory.datastoreToFutureMap.put(datastoreId, futureKey.schema, futureKey.id);
+          requestFactory.futureToDatastoreMap.put(futureKey.id, datastoreId);
+          final EntityProxyIdImpl key = getPersistedProxyId(datastoreId, futureKey.schema);
           ProxyJsoImpl value = entry.getValue();
-          value.set(EntityProxy.id, datastoreId);
+
+          // make a copy of value and set the id there.
+          // TODO (amitmanjhi): get all the data from the server.
+          ProxyJsoImpl copy = ProxyJsoImpl.emptyCopy(value);
+          copy.merge(value);
+          copy.set(EntityProxy.id, datastoreId);
+
           ProxyJsoImpl masterRecord = master.records.get(key);
           assert masterRecord == null;
-          master.records.put(key, value);
-          masterRecord = value;
-          toRemove.add(new EntityProxyId(datastoreId, futureKey.schema,
-              RequestFactoryJsonImpl.IS_FUTURE));
+
+          masterRecord = copy;
+          toRemove.add(key);
           requestFactory.postChangeEvent(masterRecord, WriteOperation.CREATE);
           syncResults.add(makeSyncResult(masterRecord, null, futureKey.id));
         } else {
@@ -198,9 +207,8 @@
       int length = deletedRecords.length();
 
       for (int i = 0; i < length; i++) {
-        final EntityProxyId key = new EntityProxyId(deletedRecords.get(i).getId(),
-            requestFactory.getSchema(deletedRecords.get(i).getSchema()),
-            RequestFactoryJsonImpl.NOT_FUTURE);
+        final EntityProxyIdImpl key = getPersistedProxyId(deletedRecords.get(i).getId(),
+            requestFactory.getSchema(deletedRecords.get(i).getSchema()));
         Map<String, String> violations = violationsMap.get(key.id);
         assert violations != null;
         /*
@@ -210,7 +218,7 @@
          * with update events.
          */
         if (violations == NULL_VIOLATIONS) {
-          requestFactory.postChangeEvent(ProxyJsoImpl.create(key.id, 1,
+          requestFactory.postChangeEvent(ProxyJsoImpl.create((Long) key.id, 1,
               key.schema, requestFactory), WriteOperation.DELETE);
         }
         ProxyJsoImpl masterRecord = master.records.get(key);
@@ -230,14 +238,13 @@
 
       int length = updatedRecords.length();
       for (int i = 0; i < length; i++) {
-        final EntityProxyId key = new EntityProxyId(updatedRecords.get(i).getId(),
-            requestFactory.getSchema(updatedRecords.get(i).getSchema()),
-            RequestFactoryJsonImpl.NOT_FUTURE);
+        final EntityProxyIdImpl key = getPersistedProxyId(updatedRecords.get(i).getId(),
+            requestFactory.getSchema(updatedRecords.get(i).getSchema()));
         Map<String, String> violations = violationsMap.get(key.id);
         assert violations != null;
         // post change events if no violations.
         if (violations == NULL_VIOLATIONS) {
-          requestFactory.postChangeEvent(ProxyJsoImpl.create(key.id, 1,
+          requestFactory.postChangeEvent(ProxyJsoImpl.create((Long) key.id, 1,
               key.schema, requestFactory), WriteOperation.UPDATE);
         }
 
@@ -268,7 +275,7 @@
   public <V> void set(Property<V> property, EntityProxy record, V value) {
     checkArgumentsAndState(record, "set");
     ProxyImpl recordImpl = (ProxyImpl) record;
-    EntityProxyId recordKey = new EntityProxyId(recordImpl);
+    EntityProxyId recordKey = recordImpl.getStableId();
 
     ProxyJsoImpl rawMasterRecord = master.records.get(recordKey);
     WriteOperation priorOperation = operations.get(recordKey);
@@ -387,6 +394,13 @@
     return requestData.toString();
   }
 
+  private EntityProxyIdImpl getPersistedProxyId(Long datastoreId,
+      ProxySchema<?> schema) {
+    return new EntityProxyIdImpl(datastoreId, schema,
+        RequestFactoryJsonImpl.NOT_FUTURE,
+        requestFactory.datastoreToFutureMap.get(datastoreId, schema));
+  }
+
   private Map<EntityProxyId, ProxyJsoImpl> getRecordsMap(
       WriteOperation writeOperation) {
     switch (writeOperation) {
@@ -446,7 +460,7 @@
   }
 
   private SyncResultImpl makeSyncResult(ProxyJsoImpl jso,
-      Map<String, String> violations, Long futureId) {
+      Map<String, String> violations, Object futureId) {
     return new SyncResultImpl(jso.getSchema().create(jso), violations, futureId);
   }
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyId.java b/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyId.java
deleted file mode 100644
index b01f613..0000000
--- a/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyId.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.requestfactory.client.impl;
-
-/**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
- * The key used to store {@link com.google.gwt.requestfactory.shared.EntityProxy Proxy}.
- */
-class EntityProxyId {
-  final ProxySchema<?> schema;
-  final Long id;
-  final boolean isFuture;
-
-  EntityProxyId(ProxyImpl record) {
-    this(record.getId(), record.getSchema(), record.isFuture());
-  }
-
-  EntityProxyId(ProxyJsoImpl record, boolean isFuture) {
-    this(record.getId(), record.getSchema(), isFuture);
-  }
-
-  protected EntityProxyId(Long id, ProxySchema<?> schema, boolean isFuture) {
-    assert id != null;
-    assert schema != null;
-
-    this.id = id;
-    this.schema = schema;
-    this.isFuture = isFuture;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null) {
-      return false;
-    }
-    if (getClass() != obj.getClass()) {
-      return false;
-    }
-    EntityProxyId other = (EntityProxyId) obj;
-    if (isFuture != other.isFuture) {
-      return false;
-    }
-    if (!id.equals(other.id)) {
-      return false;
-    }
-    if (!schema.equals(other.schema)) {
-      return false;
-    }
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = (isFuture ? 0 : 1);
-    result = prime * result + ((id == null) ? 0 : id.hashCode());
-    result = prime * result + ((schema == null) ? 0 : schema.hashCode());
-    return result;
-  }
-
-  @Override
-  public String toString() {
-    return "[RecordKey schema: " + schema.getClass().getName() + " id: " + id
-        + " isFuture: " + (isFuture ? "true" : "false") + "]";
-  }
-}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyIdImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyIdImpl.java
new file mode 100644
index 0000000..17d8b7f
--- /dev/null
+++ b/user/src/com/google/gwt/requestfactory/client/impl/EntityProxyIdImpl.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory.client.impl;
+
+import com.google.gwt.requestfactory.shared.EntityProxyId;
+
+/**
+ * <p>
+ * <span style="color:red">Experimental API: This class is still under rapid
+ * development, and is very likely to be deleted. Use it at your own risk.
+ * </span>
+ * </p>
+ * The key used to store
+ * {@link com.google.gwt.requestfactory.shared.EntityProxy Proxy}. This is
+ * stable across creates and updates on the client.
+ * <p>
+ * At all times, the id is not null. If the isFuture flag is true, the
+ * corresponding proxy has not been persisted and the id field is a futureId. If
+ * the isFuture flag is false, the corresponding proxy has been persisted and
+ * the id is the data-store id. The futureId is non-null if the entity was
+ * created on this client.
+ */
+final class EntityProxyIdImpl implements EntityProxyId {
+  static final String SEPARATOR = "---";
+
+  private static int hashCode(ProxySchema<?> proxySchema, boolean hasFutureId, Object finalId) {
+    final int prime = 31;
+    int result = hasFutureId ? 0 : 1;
+    result = prime * result + finalId.hashCode();
+    result = prime * result + proxySchema.hashCode();
+    return result;
+  }
+
+  final ProxySchema<?> schema;
+  final Object id;
+  final Object futureId;
+
+  final boolean isFuture;
+
+  protected EntityProxyIdImpl(Object id, ProxySchema<?> schema,
+      boolean isFuture, Object futureId) {
+    assert id != null;
+    assert schema != null;
+    if (isFuture) {
+      assert futureId == null;
+    }
+
+    this.id = id;
+    this.schema = schema;
+    this.isFuture = isFuture;
+    this.futureId = futureId;
+  }
+
+  public String asString() {
+    if (isFuture) {
+      throw new IllegalStateException("Need to persist this proxy first");
+    }
+    return id + SEPARATOR + schema.getToken();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+    EntityProxyIdImpl other = (EntityProxyIdImpl) obj;
+    if (!schema.equals(other.schema)) {
+      return false;
+    }
+    if (isFuture == other.isFuture && id.equals(other.id)) {
+      return true;
+    }
+    // one of the isFuture is false. check its futureId
+    if (!isFuture && other.id.equals(futureId)) {
+      return true;
+    }
+    if (!other.isFuture && id.equals(other.futureId)) {
+      return true;
+    }
+    return false;
+  }
+
+  /*
+   * This hashcode is complicated.
+   */
+  @Override
+  public int hashCode() {
+    if (futureId == null && !isFuture) {
+      // does not have a futureId.
+      return hashCode(schema, false, id); 
+    }
+    // has futureId
+    return hashCode(schema, true, isFuture ? id : futureId);
+  }
+
+  @Override
+  public String toString() {
+    return "[RecordKey schema: " + schema.getClass().getName() + " id: " + id
+        + " isFuture: " + (isFuture ? "true" : "false")
+        + (futureId != null ? ("futureId : " + futureId) : "") + "]";
+  }
+}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/ProxyImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/ProxyImpl.java
index 041b5e6..a6255ff 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/ProxyImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/ProxyImpl.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
+import com.google.gwt.requestfactory.shared.EntityProxyId;
 import com.google.gwt.requestfactory.shared.Property;
 import com.google.gwt.requestfactory.shared.PropertyReference;
 import com.google.gwt.requestfactory.shared.EntityProxy;
@@ -34,7 +35,7 @@
  */
 public class ProxyImpl implements EntityProxy {
 
-  protected static String getUniqueId(Long id, boolean isFuture,
+  protected static String getWireFormatId(Long id, boolean isFuture,
       ProxySchema<?> schema) {
     return id + "-" + (isFuture ? "IS" : "NO") + "-" + schema.getToken();
   }
@@ -82,14 +83,25 @@
     return jso.getSchema();
   }
 
-  public String getUniqueId() {
-    return getUniqueId(jso.getId(), isFuture, jso.getSchema());
+  public EntityProxyId getStableId() {
+    if (!isFuture) {
+      return new EntityProxyIdImpl(
+          getId(),
+          getSchema(),
+          false,
+          jso.getRequestFactory().datastoreToFutureMap.get(getId(), getSchema()));
+    }
+    return new EntityProxyIdImpl(getId(), getSchema(), isFuture, null);
   }
 
   public Integer getVersion() {
     return jso.getVersion();
   }
 
+  public String getWireFormatId() {
+    return getWireFormatId(jso.getId(), isFuture, jso.getSchema());
+  }
+
   public boolean isChanged() {
     if (deltaValueStore == null) {
       return false;
@@ -109,16 +121,11 @@
     deltaValueStore.set(property, record, value);
   }
 
-  /*
-   * TODO: this method is public for the time being. Will become
-   * package-protected once {@link RecordImpl} moves to the same package as
-   * {@link AbstractRequest}.
-   */
-  public void setDeltaValueStore(DeltaValueStoreJsonImpl deltaValueStore) {
-    this.deltaValueStore = deltaValueStore;
-  }
-
   protected ValueStoreJsonImpl getValueStore() {
     return jso.getRequestFactory().getValueStore();
   }
+
+  void setDeltaValueStore(DeltaValueStoreJsonImpl deltaValueStore) {
+    this.deltaValueStore = deltaValueStore;
+  }
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/ProxyJsoImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/ProxyJsoImpl.java
index b76410d..d69c1aa 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/ProxyJsoImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/ProxyJsoImpl.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.requestfactory.shared.EntityProxy;
+import com.google.gwt.requestfactory.shared.EntityProxyId;
 import com.google.gwt.requestfactory.shared.EnumProperty;
 import com.google.gwt.requestfactory.shared.Property;
 import com.google.gwt.requestfactory.shared.PropertyReference;
@@ -178,7 +179,7 @@
       assert schemaAndId.length == 2;
       ProxySchema<?> schema = getRequestFactory().getSchema(schemaAndId[0]);
       return (V) getRequestFactory().getValueStore().getRecordBySchemaAndId(schema,
-          Long.valueOf(schemaAndId[1]));
+          Long.valueOf(schemaAndId[1]), getRequestFactory());
     }
   }
 
@@ -201,6 +202,10 @@
   public final native ProxySchema<?> getSchema() /*-{
     return this['__key'];
   }-*/;
+  
+  public final EntityProxyId getStableId() {
+    throw new IllegalArgumentException("Can't call stableId on the jso");
+  }
 
   public final Integer getVersion() {
     return this.get(version);
@@ -291,7 +296,7 @@
     }
 
     if (value instanceof ProxyImpl) {
-      setString(property.getName(), ((ProxyImpl) value).getUniqueId());
+      setString(property.getName(), ((ProxyImpl) value).getWireFormatId());
       return;
     }
 
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 c8eeb81..f8802d8 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
@@ -24,13 +24,16 @@
 import com.google.gwt.http.client.Response;
 import com.google.gwt.requestfactory.client.RequestFactoryLogHandler;
 import com.google.gwt.requestfactory.shared.EntityProxy;
+import com.google.gwt.requestfactory.shared.EntityProxyId;
 import com.google.gwt.requestfactory.shared.RequestEvent;
+import com.google.gwt.requestfactory.shared.RequestEvent.State;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.requestfactory.shared.WriteOperation;
-import com.google.gwt.requestfactory.shared.RequestEvent.State;
 import com.google.gwt.user.client.Window.Location;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -56,7 +59,39 @@
 
   private static String SERVER_ERROR = "Server Error";
 
-  private static final Integer INITIAL_VERSION = 1;
+  private final Integer initialVersion = 1;
+  
+  /*
+   * Keeping these maps forever is not a desirable solution because of the
+   * memory overhead but need these if want to provide stable {@EntityProxyId}.
+   * 
+   * futureToDatastoreMap is currently not used, will be useful in find requests.
+   */
+  final Map<Object, Object> futureToDatastoreMap = new HashMap<Object, Object>();
+  final DataStoreToFutureMap datastoreToFutureMap = new DataStoreToFutureMap(); 
+  
+  final class DataStoreToFutureMap {
+    
+    Map<ProxySchema<? extends ProxyImpl>, Map<Object, Object>> internalMap = new HashMap<ProxySchema<? extends ProxyImpl>, Map<Object, Object>>();
+
+    /* returns the previous futureId, if any*/
+    Object put(Object datastoreId, ProxySchema<? extends ProxyImpl> schema, Object futureId) {
+      Map<Object, Object> perSchemaMap = internalMap.get(schema);
+      if (perSchemaMap == null) {
+        perSchemaMap = new HashMap<Object, Object>();
+        internalMap.put(schema, perSchemaMap);
+      }
+      return perSchemaMap.put(datastoreId, futureId);
+    }
+    
+    Object get(Object datastoreId, ProxySchema<? extends ProxyImpl> schema) {
+      Map<Object, Object> perSchemaMap = internalMap.get(schema);
+      if (perSchemaMap == null) {
+        return null;
+      }
+      return perSchemaMap.get(datastoreId);
+    }
+  }
 
   private long currentFutureId = 0;
 
@@ -144,7 +179,10 @@
     }
     return schema.getProxyClass();
   }
-
+  
+  /**
+   * TODO(amitmanjhi): remove this method, use getProxyId instead.
+   */
   protected EntityProxy getProxy(String token, ProxyToTypeMap recordToTypeMap) {
     String[] bits = token.split("-");
     if (bits.length < 2 || bits.length > 3) {
@@ -170,6 +208,31 @@
     return schema.create(ProxyJsoImpl.create(id, -1, schema, this));
   }
 
+  protected EntityProxyId getProxyId(String token, ProxyToTypeMap recordToTypeMap) {
+    String[] bits = token.split(EntityProxyIdImpl.SEPARATOR);
+    if (bits.length != 2) {
+      return null;
+    }
+
+    ProxySchema<? extends EntityProxy> schema = recordToTypeMap.getType(bits[1]);
+    if (schema == null) {
+      return null;
+    }
+
+    Long id = null;
+    try {
+      id = Long.valueOf(bits[0]);
+    } catch (NumberFormatException e) {
+      return null;
+    }
+
+    Object futureId = datastoreToFutureMap.get(id, schema);
+    return new EntityProxyIdImpl(id, schema, false, futureId);
+  }
+
+  /*
+   * can this method use the EntityProxyIdImpl.asString() method?
+   */
   protected String getToken(EntityProxy record, ProxyToTypeMap recordToTypeMap) {
     Class<? extends EntityProxy> proxyClass = ((ProxyImpl) record).getSchema().getProxyClass();
     String rtn = recordToTypeMap.getClassToken(proxyClass) + "-";
@@ -185,6 +248,9 @@
     return valueStore;
   }
 
+  /*
+   * use ProxyId instead here.
+   */
   void postChangeEvent(ProxyJsoImpl newJsoRecord, WriteOperation op) {
     /*
      * Ensure event receivers aren't accidentally using cached info by making an
@@ -198,7 +264,7 @@
 
   private <R extends ProxyImpl> R createFuture(ProxySchema<R> schema) {
     Long futureId = ++currentFutureId;
-    ProxyJsoImpl newRecord = ProxyJsoImpl.create(futureId, INITIAL_VERSION,
+    ProxyJsoImpl newRecord = ProxyJsoImpl.create(futureId, initialVersion,
         schema, this);
     return schema.create(newRecord, IS_FUTURE);
   }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
index 7582a7e..96d2609 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
@@ -29,26 +29,27 @@
  * </span>
  * </p>
  */
-public class ValueStoreJsonImpl {
+class ValueStoreJsonImpl {
   // package protected fields for use by DeltaValueStoreJsonImpl
 
-  final Map<EntityProxyId, ProxyJsoImpl> records = new HashMap<EntityProxyId, ProxyJsoImpl>();
+  final Map<EntityProxyIdImpl, ProxyJsoImpl> records = new HashMap<EntityProxyIdImpl, ProxyJsoImpl>();
 
-  public EntityProxy getRecordBySchemaAndId(ProxySchema<?> schema,
-      Long id) {
+  EntityProxy getRecordBySchemaAndId(ProxySchema<?> schema, Long id,
+      RequestFactoryJsonImpl requestFactory) {
     if (id == null) {
       return null;
     }
     // TODO: pass isFuture to this method from decoding ID string
-    EntityProxyId key = new EntityProxyId(id, schema, false);
+    EntityProxyIdImpl key = new EntityProxyIdImpl(id, schema, false,
+        requestFactory.datastoreToFutureMap.get(id, schema));
     return schema.create(records.get(key));
   }
 
-  public void setProxy(ProxyJsoImpl newRecord) {
+  void setProxy(ProxyJsoImpl newRecord) {
     setRecordInList(newRecord, 0, null);
   }
 
-  public void setRecords(JsArray<ProxyJsoImpl> newRecords) {
+  void setRecords(JsArray<ProxyJsoImpl> newRecords) {
     for (int i = 0, l = newRecords.length(); i < l; i++) {
       ProxyJsoImpl newRecord = newRecords.get(i);
       setRecordInList(newRecord, i, newRecords);
@@ -57,8 +58,11 @@
 
   private void setRecordInList(ProxyJsoImpl newJsoRecord, int i,
       JsArray<ProxyJsoImpl> array) {
-    EntityProxyId recordKey = new EntityProxyId(newJsoRecord, RequestFactoryJsonImpl.NOT_FUTURE);
-    
+    EntityProxyIdImpl recordKey = new EntityProxyIdImpl(newJsoRecord.getId(),
+        newJsoRecord.getSchema(), RequestFactoryJsonImpl.NOT_FUTURE,
+        newJsoRecord.getRequestFactory().datastoreToFutureMap.get(
+            newJsoRecord.getId(), newJsoRecord.getSchema()));
+
     ProxyJsoImpl oldRecord = records.get(recordKey);
     if (oldRecord == null) {
       records.put(recordKey, newJsoRecord);
@@ -73,7 +77,8 @@
         array.set(i, newJsoRecord);
       }
       if (changed) {
-        newJsoRecord.getRequestFactory().postChangeEvent(newJsoRecord, WriteOperation.UPDATE);
+        newJsoRecord.getRequestFactory().postChangeEvent(newJsoRecord,
+            WriteOperation.UPDATE);
       }
     }
   }
diff --git a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
index 2302bb8..4477645 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
@@ -52,6 +52,7 @@
 import com.google.gwt.requestfactory.server.ReflectionBasedOperationRegistry;
 import com.google.gwt.requestfactory.shared.EntityProxy;
 import com.google.gwt.requestfactory.shared.EntityProxyChangedEvent;
+import com.google.gwt.requestfactory.shared.EntityProxyId;
 import com.google.gwt.requestfactory.shared.Property;
 import com.google.gwt.requestfactory.shared.PropertyReference;
 import com.google.gwt.requestfactory.shared.ProxyListRequest;
@@ -361,6 +362,14 @@
     sw.println("}");
     sw.println();
 
+    // write getProxyId(String)
+    sw.println("public " + EntityProxyId.class.getName() + " getProxyId(String token) {");
+    sw.indent();
+    sw.println("return getProxyId(token, new " + proxyToTypeMapName + "());");
+    sw.outdent();
+    sw.println("}");
+    sw.println();
+
     // write getToken(Proxy)
     sw.println("public String getToken(EntityProxy proxy) {");
     sw.indent();
@@ -493,7 +502,6 @@
     sw.outdent();
     sw.println("}");
 
-
     sw.outdent();
     sw.println("}");
     sw.println();
@@ -670,7 +678,7 @@
       }
       if (classType != null
           && classType.isAssignableTo(typeOracle.findType(EntityProxy.class.getName()))) {
-        sb.append(").getUniqueId()");
+        sb.append(").getWireFormatId()");
       }
     }
     return "new Object[] {" + sb.toString() + "}";
diff --git a/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java b/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
index 131b411..d51ec44 100644
--- a/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
+++ b/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
@@ -56,6 +56,11 @@
   <V> PropertyReference<V> getRef(Property<V> property);
 
   /**
+   * @return {@link EntityProxyId} that is stable across changes.
+   */
+  EntityProxyId getStableId();
+
+  /**
    * @return the version of this Proxy.
    */
   Integer getVersion();
diff --git a/user/src/com/google/gwt/requestfactory/shared/EntityProxyId.java b/user/src/com/google/gwt/requestfactory/shared/EntityProxyId.java
new file mode 100644
index 0000000..77336a3
--- /dev/null
+++ b/user/src/com/google/gwt/requestfactory/shared/EntityProxyId.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory.shared;
+
+/**
+ * A stable, opaque id of an {@link EntityProxy} that remains stable across
+ * updates, creates, deletes on the client.
+ * <p>
+ * In particular, an {@link EntityProxy} foo that is yet to be persisted and a
+ * copy of foo after being persisted have equal {@link EntityProxyId}.
+ */
+public interface EntityProxyId {
+  /**
+   * Returns a stable string that remains the same across updates and creates on
+   * the client. Note that calling this method on an instance that has not been
+   * persisted throws IllegalStateException.
+   * 
+   * @return a stable string that remains the same across updates and creates on
+   *         the client.
+   */
+  String asString();
+}
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
index cf58c18..9d40015 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
@@ -52,10 +52,17 @@
 
   /**
    * Return the appropriate proxy, which may have only its id attribute set.
+   * 
+   * @deprecated, use the getProxyId method below.
    */
   EntityProxy getProxy(String token);
 
   /**
+   * Return the appropriate {@link EntityProxyId}, a stable id for the Proxy.
+   */
+  EntityProxyId getProxyId(String token);
+
+  /**
    * Get a {@link com.google.gwt.user.client.History} compatible token that
    * represents the given class. It can be processed by
    * {@link #getClass(String)}
diff --git a/user/src/com/google/gwt/requestfactory/shared/SyncResult.java b/user/src/com/google/gwt/requestfactory/shared/SyncResult.java
index 858d6a8..bf40616 100644
--- a/user/src/com/google/gwt/requestfactory/shared/SyncResult.java
+++ b/user/src/com/google/gwt/requestfactory/shared/SyncResult.java
@@ -30,7 +30,7 @@
   boolean hasViolations();
   
   // TODO: futureId isn't working out so well, leaving soon
-  Long getFutureId();
+  Object getFutureId();
 
   EntityProxy getProxy();
   
diff --git a/user/test/com/google/gwt/requestfactory/RequestFactoryJreSuite.java b/user/test/com/google/gwt/requestfactory/RequestFactoryJreSuite.java
index f2685e8..bd124d9 100644
--- a/user/test/com/google/gwt/requestfactory/RequestFactoryJreSuite.java
+++ b/user/test/com/google/gwt/requestfactory/RequestFactoryJreSuite.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.requestfactory;
 
-import com.google.gwt.requestfactory.client.impl.EntityProxyIdTest;
+import com.google.gwt.requestfactory.client.impl.EntityProxyIdImplTest;
 import com.google.gwt.requestfactory.server.JsonRequestProcessorTest;
 import com.google.gwt.requestfactory.server.ReflectionBasedOperationRegistryTest;
 import com.google.gwt.requestfactory.server.RequestPropertyTest;
@@ -30,7 +30,7 @@
   public static Test suite() {
     TestSuite suite = new TestSuite(
         "requestfactory package tests that require the JRE");
-    suite.addTestSuite(EntityProxyIdTest.class);
+    suite.addTestSuite(EntityProxyIdImplTest.class);
     suite.addTestSuite(JsonRequestProcessorTest.class);
     suite.addTestSuite(ReflectionBasedOperationRegistryTest.class);
     suite.addTestSuite(RequestPropertyTest.class);
diff --git a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java
index 2b6d77c..f9d4d72 100644
--- a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java
@@ -18,6 +18,7 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.shared.HandlerManager;
 import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.requestfactory.client.impl.ProxyImpl;
 import com.google.gwt.requestfactory.shared.EntityProxy;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
@@ -34,10 +35,108 @@
  */
 public class RequestFactoryTest extends GWTTestCase {
 
+  private SimpleRequestFactory req;
+  private HandlerManager eventBus;
+
+  @Override
+  public void gwtSetUp() {
+    req = GWT.create(SimpleRequestFactory.class);
+    eventBus = new HandlerManager(null);
+    req.init(eventBus);
+  }
+
+  @Override
+  public void gwtTearDown() {
+    req.simpleFooRequest().reset().fire(new Receiver<Void>() {
+      public void onSuccess(Void response, Set<SyncResult> syncResults) {
+      }
+    });
+    req.simpleBarRequest().reset().fire(new Receiver<Void>() {
+      public void onSuccess(Void response, Set<SyncResult> syncResults) {
+      }
+    });
+  }
+
+  /*
+   * TODO(amitmanjhi) : new test that needs to be re-enabled.
+   */
+  public void disabled_testDummyCreate() {
+    delayTestFinish(5000);
+
+    final SimpleFooProxy foo = (SimpleFooProxy) req.create(SimpleFooProxy.class);
+    RequestObject<SimpleFooProxy> fooReq = req.simpleFooRequest().persistAndReturnSelf(
+        foo);
+    fooReq.fire(new Receiver<SimpleFooProxy>() {
+
+      public void onSuccess(final SimpleFooProxy returned,
+          Set<SyncResult> syncResults) {
+        assertNotSame(foo.getStableId(), returned.getStableId());
+        assertEquals(foo.getStableId(), returned.getStableId());
+        finishTest();
+      }
+    });
+  }
+
+  public void testStableId() {
+    delayTestFinish(5000);
+
+    final SimpleFooProxy foo = (SimpleFooProxy) req.create(SimpleFooProxy.class);
+    final Object futureId = foo.getId();
+    assertTrue(((ProxyImpl) foo).isFuture());
+    RequestObject<SimpleFooProxy> fooReq = req.simpleFooRequest().persistAndReturnSelf(
+        foo);
+        
+    final SimpleFooProxy newFoo = fooReq.edit(foo);
+    assertEquals(futureId, foo.getId());
+    assertTrue(((ProxyImpl) foo).isFuture());
+    assertEquals(futureId, newFoo.getId());
+    assertTrue(((ProxyImpl) newFoo).isFuture());
+    
+    newFoo.setUserName("GWT basic user"); 
+    fooReq.fire(new Receiver<SimpleFooProxy>() {
+
+      public void onSuccess(final SimpleFooProxy returned,
+          Set<SyncResult> syncResults) {
+        assertEquals(futureId, foo.getId());
+        assertTrue(((ProxyImpl) foo).isFuture());
+        assertEquals(futureId, newFoo.getId());
+        assertTrue(((ProxyImpl) newFoo).isFuture());
+
+        assertFalse(((ProxyImpl) returned).isFuture());
+
+        checkStableIdEquals(foo, returned);
+        checkStableIdEquals(newFoo, returned);
+        
+        RequestObject<SimpleFooProxy> editRequest = req.simpleFooRequest().persistAndReturnSelf(
+            returned);
+        final SimpleFooProxy editableFoo = editRequest.edit(returned);
+        editableFoo.setUserName("GWT power user");
+        editRequest.fire(new Receiver<SimpleFooProxy>() {
+
+          public void onSuccess(SimpleFooProxy returnedAfterEdit,
+              Set<SyncResult> syncResults) {
+            assertNotSame(returnedAfterEdit, editableFoo); // Mutation above.
+            assertEquals(returnedAfterEdit.getStableId(),
+                returned.getStableId());
+            assertEquals(returnedAfterEdit.getId(), returned.getId());
+            finishTest();
+          }
+        });
+      }
+    });
+  }
+  
+  private void checkStableIdEquals(SimpleFooProxy expected, SimpleFooProxy actual) {
+    assertNotSame(expected.getStableId(), actual.getStableId());
+    assertEquals(expected.getStableId(), actual.getStableId());
+    assertEquals(expected.getStableId().hashCode(), actual.getStableId().hashCode());
+    
+    // No assumptions about the proxy objects (being proxies and all)
+    assertNotSame(expected, actual);
+    assertFalse(expected.equals(actual));
+  }
+
   public void testViolationPresent() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
 
     SimpleFooProxy newFoo = req.create(SimpleFooProxy.class);
@@ -70,9 +169,6 @@
   }
 
   public void testViolationAbsent() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
 
     SimpleFooProxy newFoo = req.create(SimpleFooProxy.class);
@@ -96,9 +192,6 @@
    * 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(
@@ -129,9 +222,6 @@
    * 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);
 
     SimpleBarProxy newBar = req.create(SimpleBarProxy.class);
@@ -173,9 +263,6 @@
    * Entity
    */
   public void testPersistNewEntityExistingRelation() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
     SimpleFooProxy newFoo = req.create(SimpleFooProxy.class);
 
@@ -214,9 +301,6 @@
    * to Entity Persist
    */
   public void testPersistNewEntityNewRelation() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
     SimpleFooProxy newFoo = req.create(SimpleFooProxy.class);
     SimpleBarProxy newBar = req.create(SimpleBarProxy.class);
@@ -264,9 +348,6 @@
   }
 
   public void testPersistRecursiveRelation() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
 
     SimpleFooProxy rayFoo = req.create(SimpleFooProxy.class);
@@ -284,9 +365,6 @@
   }
 
   public void testPersistRelation() {
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
 
     SimpleFooProxy rayFoo = req.create(SimpleFooProxy.class);
@@ -333,9 +411,6 @@
   }
 
   public void testFetchEntity() {
-    SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
     req.simpleFooRequest().findSimpleFooById(999L).fire(
         new Receiver<SimpleFooProxy>() {
@@ -353,9 +428,6 @@
   }
 
   public void testFetchEntityWithRelation() {
-    SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
     req.simpleFooRequest().findSimpleFooById(999L).with("barField").fire(
         new Receiver<SimpleFooProxy>() {
@@ -373,10 +445,6 @@
   }
 
   public void testProxysAsInstanceMethodParams() {
-
-    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
-    HandlerManager hm = new HandlerManager(null);
-    req.init(hm);
     delayTestFinish(5000);
     req.simpleFooRequest().findSimpleFooById(999L).fire(
         new Receiver<SimpleFooProxy>() {
@@ -402,9 +470,6 @@
    * (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(
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdImplTest.java
new file mode 100644
index 0000000..246a782
--- /dev/null
+++ b/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdImplTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory.client.impl;
+
+import com.google.gwt.requestfactory.shared.EntityProxy;
+import com.google.gwt.requestfactory.shared.EntityProxyChangedEvent;
+import com.google.gwt.requestfactory.shared.WriteOperation;
+
+import junit.framework.TestCase;
+
+/**
+ * Eponymous unit test.
+ */
+public class EntityProxyIdImplTest extends TestCase {
+
+  static class Schema1 extends ProxySchema<ProxyImpl> {
+    public Schema1() {
+      super("schemey");
+    }
+
+    @Override
+    public ProxyImpl create(ProxyJsoImpl jso, boolean isFuture) {
+      throw new UnsupportedOperationException("Auto-generated method stub");
+    }
+
+    @Override
+    public EntityProxyChangedEvent<?, ?> createChangeEvent(EntityProxy proxy,
+        WriteOperation writeOperation) {
+      throw new UnsupportedOperationException("Auto-generated method stub");
+    }
+
+    @Override
+    public Class<? extends EntityProxy> getProxyClass() {
+      throw new UnsupportedOperationException("Auto-generated method stub");
+    }
+  }
+  
+  static class Schema2 extends Schema1 {
+  }
+
+  public void testEquals() {
+    EntityProxyIdImpl newKey1 = new EntityProxyIdImpl(1L, new Schema1(),
+        RequestFactoryJsonImpl.IS_FUTURE, null);
+
+    EntityProxyIdImpl anotherNewKey1 = new EntityProxyIdImpl(newKey1.id, newKey1.schema,
+        newKey1.isFuture, null);
+    assertTrue(newKey1.equals(anotherNewKey1));
+    assertTrue(newKey1.hashCode() == anotherNewKey1.hashCode());
+
+    EntityProxyIdImpl newKey2 = new EntityProxyIdImpl((Long) newKey1.id + 1, newKey1.schema,
+        newKey1.isFuture, null);
+    assertFalse(newKey1.equals(newKey2));
+    assertFalse(newKey1.hashCode() == newKey2.hashCode());
+
+    EntityProxyIdImpl newKey1NoSchema = new EntityProxyIdImpl(newKey1.id,
+        new Schema2(), newKey1.isFuture, null);
+    assertFalse(newKey1.equals(newKey1NoSchema));
+    assertFalse(newKey1.hashCode() == newKey1NoSchema.hashCode());
+
+    EntityProxyIdImpl oldKey1 = new EntityProxyIdImpl(newKey1.id, newKey1.schema,
+        !newKey1.isFuture, null);
+    assertFalse(newKey1.equals(oldKey1));
+    assertFalse(newKey1.hashCode() == oldKey1.hashCode());
+  }
+  
+  public void testEqualsWithFuture() {
+    EntityProxyIdImpl newKey1 = new EntityProxyIdImpl(1L, new Schema1(),
+        RequestFactoryJsonImpl.IS_FUTURE, null);
+
+    EntityProxyIdImpl persistedNewKey1 = new EntityProxyIdImpl(1000L,
+        newKey1.schema, RequestFactoryJsonImpl.NOT_FUTURE, newKey1.id);
+    assertTrue(persistedNewKey1.equals(persistedNewKey1));
+    assertTrue(newKey1.equals(persistedNewKey1));
+    assertTrue(persistedNewKey1.equals(newKey1));
+    assertTrue(newKey1.hashCode() == persistedNewKey1.hashCode());
+
+    EntityProxyIdImpl anotherPersistedNewKey1 = new EntityProxyIdImpl(1024L,
+        newKey1.schema, RequestFactoryJsonImpl.NOT_FUTURE,
+        (Long) newKey1.id + 1);
+    assertTrue(anotherPersistedNewKey1.equals(anotherPersistedNewKey1));
+    assertFalse(persistedNewKey1.equals(anotherPersistedNewKey1));
+    assertFalse(anotherPersistedNewKey1.equals(persistedNewKey1));
+    assertFalse(newKey1.hashCode() == anotherPersistedNewKey1.hashCode());
+  }
+}
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdTest.java b/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdTest.java
deleted file mode 100644
index 47c97a2..0000000
--- a/user/test/com/google/gwt/requestfactory/client/impl/EntityProxyIdTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.requestfactory.client.impl;
-
-import com.google.gwt.requestfactory.shared.EntityProxy;
-import com.google.gwt.requestfactory.shared.EntityProxyChangedEvent;
-import com.google.gwt.requestfactory.shared.WriteOperation;
-
-import junit.framework.TestCase;
-
-/**
- * Eponymous unit test.
- */
-public class EntityProxyIdTest extends TestCase {
-
-  static class Schema1 extends ProxySchema<ProxyImpl> {
-    public Schema1() {
-      super("schemey");
-    }
-
-    @Override
-    public ProxyImpl create(ProxyJsoImpl jso, boolean isFuture) {
-      throw new UnsupportedOperationException("Auto-generated method stub");
-    }
-
-    @Override
-    public EntityProxyChangedEvent<?, ?> createChangeEvent(EntityProxy proxy,
-        WriteOperation writeOperation) {
-      throw new UnsupportedOperationException("Auto-generated method stub");
-    }
-
-    @Override
-    public Class<? extends EntityProxy> getProxyClass() {
-      throw new UnsupportedOperationException("Auto-generated method stub");
-    }
-  }
-  
-  static class Schema2 extends Schema1 {
-  }
-
-  public void testEquals() {
-    EntityProxyId newKey1 = new EntityProxyId(1L, new Schema1(),
-        RequestFactoryJsonImpl.IS_FUTURE);
-
-    EntityProxyId anotherNewKey1 = new EntityProxyId(newKey1.id, newKey1.schema,
-        newKey1.isFuture);
-    assertTrue(newKey1.equals(anotherNewKey1));
-    assertTrue(newKey1.hashCode() == anotherNewKey1.hashCode());
-
-    EntityProxyId newKey2 = new EntityProxyId(newKey1.id + 1, newKey1.schema,
-        newKey1.isFuture);
-    assertFalse(newKey1.equals(newKey2));
-    assertFalse(newKey1.hashCode() == newKey2.hashCode());
-
-    EntityProxyId newKey1NoSchema = new EntityProxyId(newKey1.id,
-        new Schema2(), newKey1.isFuture);
-    assertFalse(newKey1.equals(newKey1NoSchema));
-    assertFalse(newKey1.hashCode() == newKey1NoSchema.hashCode());
-
-    EntityProxyId oldKey1 = new EntityProxyId(newKey1.id, newKey1.schema,
-        !newKey1.isFuture);
-    assertFalse(newKey1.equals(oldKey1));
-    assertFalse(newKey1.hashCode() == oldKey1.hashCode());
-  }
-}
