diff --git a/bikeshed/src/com/google/gwt/valuestore/client/DeltaValueStoreJsonImpl.java b/bikeshed/src/com/google/gwt/valuestore/client/DeltaValueStoreJsonImpl.java
index 57e0126..d42bcee 100644
--- a/bikeshed/src/com/google/gwt/valuestore/client/DeltaValueStoreJsonImpl.java
+++ b/bikeshed/src/com/google/gwt/valuestore/client/DeltaValueStoreJsonImpl.java
@@ -256,7 +256,10 @@
   }
 
   public Record create(String token) {
-    assert !used;
+    if (used) {
+      throw new IllegalStateException(
+          "create can only be called on an un-used DeltaValueStore");
+    }
     String futureId = futureIdGenerator.getFutureId();
 
     RecordSchema<? extends Record> schema = recordToTypeMap.getType(token);
@@ -270,8 +273,7 @@
   }
 
   public void delete(Record record) {
-    assert !used;
-    assert record instanceof RecordImpl;
+    checkArgumentsAndState(record, "delete");
     RecordImpl recordImpl = (RecordImpl) record;
     RecordKey recordKey = new RecordKey(recordImpl);
     WriteOperation priorOperation = operations.get(recordKey);
@@ -312,8 +314,7 @@
   }
 
   public <V> void set(Property<V> property, Record record, V value) {
-    assert !used;
-    assert record instanceof RecordImpl;
+    checkArgumentsAndState(record, "set");
     RecordImpl recordImpl = (RecordImpl) record;
     RecordKey recordKey = new RecordKey(recordImpl);
 
@@ -424,6 +425,17 @@
     return false;
   }
 
+  private void checkArgumentsAndState(Record record, String methodName) {
+    if (used) {
+      throw new IllegalStateException(
+          methodName + " can only be called on an un-used DeltaValueStore");
+    }
+    if (!(record instanceof RecordImpl)) {
+      throw new IllegalArgumentException(record + " + must be an instance of "
+          + RecordImpl.class);
+    }
+  }
+
   private String getJsonForOperation(WriteOperation writeOperation) {
     Map<RecordKey, RecordJsoImpl> recordsMap = getRecordsMap(writeOperation);
     if (recordsMap.size() == 0) {
diff --git a/bikeshed/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java b/bikeshed/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
index 8ff7638..9ed849f 100644
--- a/bikeshed/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
+++ b/bikeshed/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
@@ -51,10 +51,13 @@
   }
 
   public static native RecordJsoImpl fromJson(String json) /*-{
-    return eval(json);
+    // TODO: clean this
+    eval("xyz=" + json);
+    return xyz;
   }-*/;
 
-  private static native RecordJsoImpl create() /*-{
+  /* Made protected, for testing */
+  protected static native RecordJsoImpl create() /*-{
     return {};
   }-*/;
 
diff --git a/bikeshed/test/com/google/gwt/valuestore/ValueStoreSuite.java b/bikeshed/test/com/google/gwt/valuestore/ValueStoreSuite.java
new file mode 100644
index 0000000..2c9d81e
--- /dev/null
+++ b/bikeshed/test/com/google/gwt/valuestore/ValueStoreSuite.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.valuestore;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.valuestore.client.DeltaValueStoreJsonImplTest;
+import com.google.gwt.valuestore.shared.impl.RecordJsoImplTest;
+
+import junit.framework.Test;
+
+/**
+ *
+ */
+public class ValueStoreSuite {
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite(
+        "Test suite for all valuestore code.");
+    suite.addTestSuite(DeltaValueStoreJsonImplTest.class);
+    suite.addTestSuite(RecordJsoImplTest.class);
+    return suite;
+  }
+}
diff --git a/bikeshed/test/com/google/gwt/valuestore/ValueStoreTest.gwt.xml b/bikeshed/test/com/google/gwt/valuestore/ValueStoreTest.gwt.xml
new file mode 100644
index 0000000..97b83ce
--- /dev/null
+++ b/bikeshed/test/com/google/gwt/valuestore/ValueStoreTest.gwt.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+<!--
+  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.
+-->
+<module>
+  <inherits name='com.google.gwt.valuestore.ValueStore'/>
+  <!-- use this old inefficient JSON library just for the time being, replace soon -->
+  <inherits name='com.google.gwt.json.JSON'/>
+</module>
diff --git a/bikeshed/test/com/google/gwt/valuestore/client/DeltaValueStoreJsonImplTest.java b/bikeshed/test/com/google/gwt/valuestore/client/DeltaValueStoreJsonImplTest.java
index cf159e6..e766120 100644
--- a/bikeshed/test/com/google/gwt/valuestore/client/DeltaValueStoreJsonImplTest.java
+++ b/bikeshed/test/com/google/gwt/valuestore/client/DeltaValueStoreJsonImplTest.java
@@ -15,21 +15,169 @@
  */
 package com.google.gwt.valuestore.client;
 
+import com.google.gwt.json.client.JSONArray;
+import com.google.gwt.json.client.JSONObject;
+import com.google.gwt.json.client.JSONParser;
 import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.valuestore.shared.DeltaValueStore;
+import com.google.gwt.valuestore.shared.Record;
+import com.google.gwt.valuestore.shared.SimpleFooRecord;
+import com.google.gwt.valuestore.shared.ValueStore;
+import com.google.gwt.valuestore.shared.WriteOperation;
+import com.google.gwt.valuestore.shared.impl.RecordImpl;
+import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
+import com.google.gwt.valuestore.shared.impl.RecordSchema;
+import com.google.gwt.valuestore.shared.impl.RecordToTypeMap;
+import com.google.gwt.valuestore.shared.impl.SimpleFooRecordImpl;
+
+import java.util.Date;
 
 /**
  * Tests for {@link DeltaValueStoreJsonImpl}.
  */
 public class DeltaValueStoreJsonImplTest extends GWTTestCase {
-  
-  public String getModuleName() {
-    return "com.google.gwt.valuestore.ValueStore";
+
+  /*
+   * sub-classed it here so that the protected constructor of {@link RecordImpl}
+   * can remain as such.
+   */
+  private class MyRecordImpl extends RecordImpl {
+
+    protected MyRecordImpl(RecordJsoImpl record) {
+      super(record);
+    }
   }
-  
-  public void testValidation() {
-    ValueStoreJsonImpl valueStore = new ValueStoreJsonImpl(null, null);
+
+  ValueStoreJsonImpl valueStore = null;
+  RecordJsoImpl jso = null;
+
+  public String getModuleName() {
+    return "com.google.gwt.valuestore.ValueStoreTest";
+  }
+
+  @Override
+  public void gwtSetUp() {
+    valueStore = new ValueStoreJsonImpl(null, new RecordToTypeMap() {
+      public RecordSchema<? extends Record> getType(String token) {
+        if (token.equals(SimpleFooRecordImpl.TOKEN)) {
+          return SimpleFooRecordImpl.SCHEMA;
+        }
+        throw new IllegalArgumentException("Unknown token " + token);
+      }
+
+    });
+
+    // add a record
+    jso = RecordJsoImpl.fromJson("{}");
+    jso.set(SimpleFooRecord.id, "42");
+    jso.set(SimpleFooRecord.version, 1);
+    jso.set(SimpleFooRecord.userName, "bovik");
+    jso.set(SimpleFooRecord.password, "bovik");
+    jso.set(SimpleFooRecord.intId, 4);
+    jso.set(SimpleFooRecord.created, new Date());
+    jso.setSchema(SimpleFooRecordImpl.SCHEMA);
+    valueStore.setRecord(jso);
+  }
+
+  public void testCreate() {
     DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
-    
+    Record created = deltaValueStore.create(SimpleFooRecordImpl.TOKEN);
+    assertNotNull(created.getId());
+    assertNotNull(created.getVersion());
+
+    assertTrue(deltaValueStore.isChanged());
+    testAndGetChangeRecord(deltaValueStore.toJson(), WriteOperation.CREATE);
+  }
+
+  public void testCreateDelete() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    Record created = deltaValueStore.create(SimpleFooRecordImpl.TOKEN);
+    assertTrue(deltaValueStore.isChanged());
+    deltaValueStore.delete(created);
+    assertFalse(deltaValueStore.isChanged());
+
+    String jsonString = deltaValueStore.toJson();
+    assertEquals("{}", jsonString);
+  }
+
+  public void testCreateUpdate() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    Record created = deltaValueStore.create(SimpleFooRecordImpl.TOKEN);
+    assertTrue(deltaValueStore.isChanged());
+    deltaValueStore.set(SimpleFooRecord.userName, created, "harry");
+    assertTrue(deltaValueStore.isChanged());
+    JSONObject changeRecord = testAndGetChangeRecord(deltaValueStore.toJson(),
+        WriteOperation.CREATE);
+    changeRecord.get(SimpleFooRecord.userName.getName());
+  }
+
+  public void testDelete() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    deltaValueStore.delete(new MyRecordImpl(jso));
+    assertTrue(deltaValueStore.isChanged());
+    testAndGetChangeRecord(deltaValueStore.toJson(), WriteOperation.DELETE);
+  }
+
+  public void testDeleteUpdate() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    deltaValueStore.delete(new MyRecordImpl(jso));
+    assertTrue(deltaValueStore.isChanged());
+
+    // update after a delete nullifies the delete.
+    deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
+        "harry");
+    assertTrue(deltaValueStore.isChanged());
+    JSONObject changeRecord = testAndGetChangeRecord(deltaValueStore.toJson(),
+        WriteOperation.UPDATE);
+    changeRecord.get(SimpleFooRecord.userName.getName());
+  }
+
+  public void testOperationAfterJson() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    deltaValueStore.delete(new MyRecordImpl(jso));
+    assertTrue(deltaValueStore.isChanged());
+
+    deltaValueStore.toJson();
+
+    try {
+      deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
+          "harry");
+      fail("Modifying DeltaValueStore after calling toJson should throw a RuntimeException");
+    } catch (RuntimeException ex) {
+      // expected.
+    }
+
+    deltaValueStore.clearUsed();
+    deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
+        "harry");
+  }
+
+  public void testUpdate() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
+        "harry");
+    assertTrue(deltaValueStore.isChanged());
+    JSONObject changeRecord = testAndGetChangeRecord(deltaValueStore.toJson(),
+        WriteOperation.UPDATE);
+    changeRecord.get(SimpleFooRecord.userName.getName());
+  }
+
+  public void testUpdateDelete() {
+    DeltaValueStoreJsonImpl deltaValueStore = valueStore.spawnDeltaView();
+    deltaValueStore.set(SimpleFooRecord.userName, new MyRecordImpl(jso),
+        "harry");
+    assertTrue(deltaValueStore.isChanged());
+
+    // delete after an update nullifies the delete.
+    deltaValueStore.delete(new MyRecordImpl(jso));
+    assertTrue(deltaValueStore.isChanged());
+    testAndGetChangeRecord(deltaValueStore.toJson(), WriteOperation.DELETE);
+  }
+
+  public void testValidation() {
+    ValueStore dummyValueStore = new ValueStoreJsonImpl(null, null);
+    DeltaValueStore deltaValueStore = dummyValueStore.spawnDeltaView();
+
     try {
       deltaValueStore.addValidation();
       fail("Should throw an UnsupportedOperationException");
@@ -37,4 +185,29 @@
       // expected
     }
   }
+
+  private JSONObject testAndGetChangeRecord(String jsonString,
+      WriteOperation currentWriteOperation) {
+    JSONObject jsonObject = (JSONObject) JSONParser.parse(jsonString);
+    for (WriteOperation writeOperation : WriteOperation.values()) {
+      if (writeOperation != currentWriteOperation) {
+        assertFalse(jsonObject.containsKey(writeOperation.name()));
+      } else {
+        assertTrue(jsonObject.containsKey(writeOperation.name()));
+      }
+    }
+
+    JSONArray writeOperationArray = jsonObject.get(currentWriteOperation.name()).isArray();
+    assertEquals(1, writeOperationArray.size());
+
+    JSONObject recordWithName = writeOperationArray.get(0).isObject();
+    assertEquals(1, recordWithName.size());
+    assertTrue(recordWithName.containsKey(SimpleFooRecordImpl.TOKEN));
+
+    JSONObject record = recordWithName.get(SimpleFooRecordImpl.TOKEN).isObject();
+    assertTrue(record.containsKey("id"));
+    assertTrue(record.containsKey("version"));
+
+    return record;
+  }
 }
diff --git a/bikeshed/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java b/bikeshed/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
new file mode 100644
index 0000000..c9b459d
--- /dev/null
+++ b/bikeshed/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
@@ -0,0 +1,42 @@
+/*
+ * 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.valuestore.shared;
+
+import java.util.Date;
+
+/**
+ * A simple entity used for testing. Has an int field and date field. Add other
+ * data types as their support gets built in.
+ */
+public interface SimpleFooRecord extends Record {
+
+  String TOKEN = "SimpleFooRecord";
+
+  Property<String> userName = new Property<String>("userName", "User Name",
+      String.class);
+  Property<String> password = new Property<String>("password", "Password",
+      String.class);
+  Property<Integer> intId = new Property<Integer>("intId", Integer.class);
+  Property<Date> created = new Property<Date>("created", Date.class);
+
+  Date getCreated();
+
+  Integer getIntId();
+
+  String getPassword();
+
+  String getUserName();
+}
\ No newline at end of file
diff --git a/bikeshed/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java b/bikeshed/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java
new file mode 100644
index 0000000..680dab3
--- /dev/null
+++ b/bikeshed/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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.valuestore.shared.impl;
+
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.valuestore.shared.SimpleFooRecord;
+
+import java.util.Date;
+
+/**
+ * Tests for {@link RecordJsoImpl}.
+ */
+public class RecordJsoImplTest extends GWTTestCase {
+
+  private static final String EMPTY_JSON = "{}";
+  private static final String ID_VERSION_JSON = "{\"id\":\"42\",\"version\":1}";
+  private static final String ID_VERSION_JSON2 = "{\"id\":\"43\",\"version\":1}";
+  private static final String ALL_PROPERTIES_JSON = "{\"id\":\"42\",\"version\":1,\"userName\":\"bovik\",\"password\":\"bovik\",\"intId\":4,\"created\":400}";
+  
+  private static final boolean SCHEMA_ABSENT = false;
+  private static final boolean SCHEMA_PRESENT = true;
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.valuestore.ValueStoreTest";
+  }
+
+  public void testEmptyCopy() {
+    RecordJsoImpl emptyCopy = RecordJsoImpl.emptyCopy(new RecordImpl(getPopulatedJso()));
+    testMinimalJso(emptyCopy, SCHEMA_PRESENT);
+  }
+  
+  public void testFromJson() {
+    testEmptyJso(RecordJsoImpl.fromJson(EMPTY_JSON), SCHEMA_ABSENT);
+    testMinimalJso(RecordJsoImpl.fromJson(ID_VERSION_JSON), SCHEMA_ABSENT);
+    testPopulatedJso(RecordJsoImpl.fromJson(ALL_PROPERTIES_JSON), SCHEMA_ABSENT);
+  }
+
+  public void testFromJsonArray() {
+    String jsonString = "[" + ID_VERSION_JSON + "," + ID_VERSION_JSON2 + "]";
+    JsArray<RecordJsoImpl> jsArray = RecordJsoImpl.arrayFromJson(jsonString);
+    assertEquals(2, jsArray.length());
+  }
+
+  public void testIsEmpty() {
+    try {
+      getEmptyJso().isEmpty();
+      fail("A Runtime Exception should be thrown because schema is not defined");
+    } catch (RuntimeException ex) {
+      // NullPointerException in dev mode, JavaScriptException in prod mode
+      // expected because schema is not defined.
+    }
+    assertTrue(getMinimalJso().isEmpty());
+    assertFalse(getPopulatedJso().isEmpty());
+  }
+
+  public void testSet() {
+    RecordJsoImpl jso = getMinimalJso();
+    jso.set(SimpleFooRecord.userName, "bovik");
+    jso.set(SimpleFooRecord.password, "bovik");
+    jso.set(SimpleFooRecord.intId, 4);
+    jso.set(SimpleFooRecord.created, new Date(400));
+    testPopulatedJso(jso, SCHEMA_PRESENT);
+  }
+
+  public void testToJson() {
+    assertEquals(ID_VERSION_JSON, getMinimalJso().toJson());
+  }
+
+  public void testToJsonIdVersion() {
+    assertEquals(ID_VERSION_JSON, getPopulatedJso().toJsonIdVersion());
+    assertEquals(ID_VERSION_JSON, getMinimalJso().toJsonIdVersion());
+  }
+
+  private RecordJsoImpl getEmptyJso() {
+    return RecordJsoImpl.create();
+  }
+
+  private RecordJsoImpl getMinimalJso() {
+    return RecordJsoImpl.create("42", 1, SimpleFooRecordImpl.SCHEMA);
+  }
+
+  private RecordJsoImpl getPopulatedJso() {
+    RecordJsoImpl jso = getMinimalJso();
+    jso.set(SimpleFooRecord.userName, "bovik");
+    jso.set(SimpleFooRecord.password, "bovik");
+    jso.set(SimpleFooRecord.intId, 4);
+    jso.set(SimpleFooRecord.created, new Date(400));
+    return jso;
+  }
+  
+  private void testEmptyJso(RecordJsoImpl jso, boolean schemaPresent) {
+    assertFalse(jso.isDefined(SimpleFooRecord.id.getName()));
+    assertFalse(jso.isDefined(SimpleFooRecord.version.getName()));
+    assertEquals("{}", jso.toJson());
+    testSchema(jso, schemaPresent);
+  }
+  
+  private void testMinimalJso(RecordJsoImpl jso, boolean schemaPresent) {
+    for (String property : new String[] {"id", "version"}) {
+      assertTrue(jso.isDefined(property));
+    }
+    for (String property : new String[] {
+        "created", "intId", "userName", "password"}) {
+      assertFalse(jso.isDefined(property));
+      assertNull(jso.get(property));
+    }
+    assertEquals("42", jso.getId());
+    assertEquals(new Integer(1), jso.getVersion());
+    testSchema(jso, schemaPresent);
+  }
+  
+  private void testPopulatedJso(RecordJsoImpl jso, boolean schemaPresent) {
+    for (String property : new String[] {"id", "version", "created", "intId", "userName", "password"}) {
+      assertTrue(jso.isDefined(property));
+    }
+    assertEquals("42", jso.getId());
+    assertEquals(new Integer(1), jso.getVersion());
+    assertEquals("bovik", jso.get(SimpleFooRecord.userName));
+    assertEquals("bovik", jso.get(SimpleFooRecord.password));
+    assertEquals(new Integer(4), jso.get(SimpleFooRecord.intId));
+    assertEquals(new Date(400), jso.get(SimpleFooRecord.created));
+    testSchema(jso, schemaPresent);
+  }
+
+  private void testSchema(RecordJsoImpl jso, boolean schemaPresent) {
+    if (schemaPresent) {
+      assertEquals(SimpleFooRecordImpl.SCHEMA, jso.getSchema());
+    } else {
+      assertNull(jso.getSchema());
+    }
+  }
+  
+}
diff --git a/bikeshed/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java b/bikeshed/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java
new file mode 100644
index 0000000..122b485
--- /dev/null
+++ b/bikeshed/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java
@@ -0,0 +1,94 @@
+/*
+ * 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.valuestore.shared.impl;
+
+import com.google.gwt.valuestore.shared.Property;
+import com.google.gwt.valuestore.shared.Record;
+import com.google.gwt.valuestore.shared.RecordChangedEvent;
+import com.google.gwt.valuestore.shared.SimpleFooRecord;
+import com.google.gwt.valuestore.shared.WriteOperation;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * The actual implementation of {@link SimpleFooRecord}, which is normally
+ * generated.
+ * 
+ * TODO: Use the generator here.
+ */
+public class SimpleFooRecordImpl extends RecordImpl implements SimpleFooRecord {
+
+  /**
+   * The Schema class.
+   */
+  public static class MySchema extends RecordSchema<SimpleFooRecordImpl> {
+    private final Set<Property<?>> allProperties;
+    {
+      Set<Property<?>> set = new HashSet<Property<?>>();
+      set.addAll(super.allProperties());
+      set.add(userName);
+      set.add(password);
+      set.add(intId);
+      set.add(created);
+      allProperties = Collections.unmodifiableSet(set);
+    }
+
+    public Set<Property<?>> allProperties() {
+      return allProperties;
+    }
+
+    @Override
+    public SimpleFooRecordImpl create(RecordJsoImpl jso) {
+      return new SimpleFooRecordImpl(jso);
+    }
+
+    @Override
+    public RecordChangedEvent<?, ?> createChangeEvent(Record record,
+        WriteOperation writeOperation) {
+      // ignore
+      return null;
+    }
+
+    public String getToken() {
+      return SimpleFooRecord.TOKEN; // special field
+    }
+  }
+
+  public static final RecordSchema<SimpleFooRecordImpl> SCHEMA = new MySchema();
+
+  private SimpleFooRecordImpl(RecordJsoImpl jso) {
+    super(jso);
+  }
+
+  public java.util.Date getCreated() {
+    return get(created);
+  }
+
+  public java.lang.Integer getIntId() {
+    return get(intId);
+  }
+
+  public java.lang.String getPassword() {
+    return get(password);
+  }
+
+  public java.lang.String getUserName() {
+    return get(userName);
+  }
+
+}
