diff --git a/src/com/android/contacts/model/AugmentedEntity.java b/src/com/android/contacts/model/EntityDelta.java
similarity index 81%
rename from src/com/android/contacts/model/AugmentedEntity.java
rename to src/com/android/contacts/model/EntityDelta.java
index 24264db..09e2e98 100644
--- a/src/com/android/contacts/model/AugmentedEntity.java
+++ b/src/com/android/contacts/model/EntityDelta.java
@@ -34,7 +34,7 @@
 import java.util.Set;
 
 /**
- * Contains an {@link Entity} that records any modifications separately so the
+ * Contains an {@link Entity} and records any modifications separately so the
  * original {@link Entity} can be swapped out with a newer version and the
  * changes still cleanly applied.
  * <p>
@@ -46,55 +46,55 @@
  * rows are missing from the new {@link Entity}, we know the original data must
  * be deleted, but to preserve the user modifications we treat as an insert.
  */
-public class AugmentedEntity {
+public class EntityDelta {
     // TODO: optimize by using contentvalues pool, since we allocate so many of them
 
     /**
      * Direct values from {@link Entity#getEntityValues()}.
      */
-    private AugmentedValues mValues;
+    private ValuesDelta mValues;
 
     /**
      * Internal map of children values from {@link Entity#getSubValues()}, which
      * we store here sorted into {@link Data#MIMETYPE} bins.
      */
-    private HashMap<String, ArrayList<AugmentedValues>> mEntries;
+    private HashMap<String, ArrayList<ValuesDelta>> mEntries;
 
-    private AugmentedEntity() {
-        mEntries = new HashMap<String, ArrayList<AugmentedValues>>();
+    private EntityDelta() {
+        mEntries = new HashMap<String, ArrayList<ValuesDelta>>();
     }
 
-    public AugmentedEntity(AugmentedValues values) {
+    public EntityDelta(ValuesDelta values) {
         this();
         mValues = values;
     }
 
     /**
-     * Build an {@link AugmentedEntity} using the given {@link Entity} as a
+     * Build an {@link EntityDelta} using the given {@link Entity} as a
      * starting point; the "before" snapshot.
      */
-    public static AugmentedEntity fromBefore(Entity before) {
-        final AugmentedEntity entity = new AugmentedEntity();
-        entity.mValues = AugmentedValues.fromBefore(before.getEntityValues());
+    public static EntityDelta fromBefore(Entity before) {
+        final EntityDelta entity = new EntityDelta();
+        entity.mValues = ValuesDelta.fromBefore(before.getEntityValues());
         entity.mValues.setIdColumn("raw_contacts", RawContacts._ID);
         for (NamedContentValues namedValues : before.getSubValues()) {
-            entity.addEntry(AugmentedValues.fromBefore(namedValues.values));
+            entity.addEntry(ValuesDelta.fromBefore(namedValues.values));
         }
         return entity;
     }
 
-    public AugmentedValues getValues() {
+    public ValuesDelta getValues() {
         return mValues;
     }
 
     /**
-     * Get the {@link AugmentedValues} child marked as {@link Data#IS_PRIMARY}.
+     * Get the {@link ValuesDelta} child marked as {@link Data#IS_PRIMARY}.
      */
-    public AugmentedValues getPrimaryEntry(String mimeType) {
+    public ValuesDelta getPrimaryEntry(String mimeType) {
         // TODO: handle the case where the caller must have a non-null value,
         // for example inserting a displayname automatically
-        final ArrayList<AugmentedValues> mimeEntries = getMimeEntries(mimeType, false);
-        for (AugmentedValues entry : mimeEntries) {
+        final ArrayList<ValuesDelta> mimeEntries = getMimeEntries(mimeType, false);
+        for (ValuesDelta entry : mimeEntries) {
             if (entry.isPrimary()) {
                 return entry;
             }
@@ -103,19 +103,19 @@
     }
 
     /**
-     * Return the list of child {@link AugmentedValues} from our optimized map,
+     * Return the list of child {@link ValuesDelta} from our optimized map,
      * creating the list if requested.
      */
-    private ArrayList<AugmentedValues> getMimeEntries(String mimeType, boolean lazyCreate) {
-        ArrayList<AugmentedValues> mimeEntries = mEntries.get(mimeType);
+    private ArrayList<ValuesDelta> getMimeEntries(String mimeType, boolean lazyCreate) {
+        ArrayList<ValuesDelta> mimeEntries = mEntries.get(mimeType);
         if (mimeEntries == null && lazyCreate) {
-            mimeEntries = new ArrayList<AugmentedValues>();
+            mimeEntries = new ArrayList<ValuesDelta>();
             mEntries.put(mimeType, mimeEntries);
         }
         return mimeEntries;
     }
 
-    public ArrayList<AugmentedValues> getMimeEntries(String mimeType) {
+    public ArrayList<ValuesDelta> getMimeEntries(String mimeType) {
         return getMimeEntries(mimeType, false);
     }
 
@@ -123,25 +123,25 @@
         return mEntries.containsKey(mimeType);
     }
 
-    public void addEntry(AugmentedValues entry) {
+    public void addEntry(ValuesDelta entry) {
         final String mimeType = entry.getMimetype();
         getMimeEntries(mimeType, true).add(entry);
     }
 
     /**
-     * Find the {@link AugmentedValues} that has a specific
+     * Find the {@link ValuesDelta} that has a specific
      * {@link BaseColumns#_ID} value, used when {@link #augmentFrom(Parcel)} is
      * inflating a modified state.
      */
-    public AugmentedValues getEntry(Long childId) {
+    public ValuesDelta getEntry(Long childId) {
         if (childId == null) {
             // Requesting an "insert" entry, which has no "before"
             return null;
         }
 
         // Search all children for requested entry
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues entry : mimeEntries) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta entry : mimeEntries) {
                 if (entry.getId() == childId) {
                     return entry;
                 }
@@ -151,12 +151,12 @@
     }
 
     /**
-     * Return the total number of {@link AugmentedValues} contained.
+     * Return the total number of {@link ValuesDelta} contained.
      */
     public int getEntryCount(boolean onlyVisible) {
         int count = 0;
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues child : mimeEntries) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta child : mimeEntries) {
                 // Skip deleted items when requesting only visible
                 if (onlyVisible && child.isVisible()) continue;
                 count++;
@@ -178,7 +178,7 @@
             final ContentValues after = (ContentValues)parcel.readValue(null);
             if (mValues == null) {
                 // Entity didn't exist before, so "insert"
-                mValues = AugmentedValues.fromAfter(after);
+                mValues = ValuesDelta.fromAfter(after);
             } else {
                 // Existing entity "update"
                 mValues.mAfter = after;
@@ -191,10 +191,10 @@
             final Long childId = readLong(parcel);
             final ContentValues after = (ContentValues)parcel.readValue(null);
 
-            AugmentedValues entry = getEntry(childId);
+            ValuesDelta entry = getEntry(childId);
             if (entry == null) {
                 // Is "insert", or "before" record is missing, so now "insert"
-                entry = AugmentedValues.fromAfter(after);
+                entry = ValuesDelta.fromAfter(after);
                 addEntry(entry);
             } else {
                 // Existing entry "update"
@@ -211,8 +211,8 @@
     public void augmentTo(Parcel parcel) {
         parcel.writeValue(mValues.mAfter);
 
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues child : mimeEntries) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta child : mimeEntries) {
                 parcel.writeInt(MODE_CONTINUE);
                 writeLong(parcel, child.getId());
                 parcel.writeValue(child.mAfter);
@@ -232,14 +232,14 @@
 
     @Override
     public boolean equals(Object object) {
-        if (object instanceof AugmentedEntity) {
-            final AugmentedEntity other = (AugmentedEntity)object;
+        if (object instanceof EntityDelta) {
+            final EntityDelta other = (EntityDelta)object;
 
             // Equality failed if parent values different
             if (!other.mValues.equals(mValues)) return false;
 
-            for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-                for (AugmentedValues child : mimeEntries) {
+            for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+                for (ValuesDelta child : mimeEntries) {
                     // Equality failed if any children unmatched
                     if (!other.containsEntry(child)) return false;
                 }
@@ -251,9 +251,9 @@
         return false;
     }
 
-    private boolean containsEntry(AugmentedValues entry) {
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues child : mimeEntries) {
+    private boolean containsEntry(ValuesDelta entry) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta child : mimeEntries) {
                 // Contained if we find any child that matches
                 if (child.equals(entry)) return true;
             }
@@ -267,8 +267,8 @@
         builder.append("\n(");
         builder.append(mValues.toString());
         builder.append(") = {");
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues child : mimeEntries) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta child : mimeEntries) {
                 builder.append("\n\t");
                 child.toString(builder);
             }
@@ -286,7 +286,7 @@
     /**
      * Build a list of {@link ContentProviderOperation} that will transform the
      * current "before" {@link Entity} state into the modified state which this
-     * {@link AugmentedEntity} represents.
+     * {@link EntityDelta} represents.
      */
     public ArrayList<ContentProviderOperation> buildDiff() {
         final ArrayList<ContentProviderOperation> diff = new ArrayList<ContentProviderOperation>();
@@ -302,8 +302,8 @@
         possibleAdd(diff, builder);
 
         // Build operations for all children
-        for (ArrayList<AugmentedValues> mimeEntries : mEntries.values()) {
-            for (AugmentedValues child : mimeEntries) {
+        for (ArrayList<ValuesDelta> mimeEntries : mEntries.values()) {
+            for (ValuesDelta child : mimeEntries) {
                 // Ignore children if parent was deleted
                 if (isContactDelete) continue;
 
@@ -342,32 +342,32 @@
      * modified version of that state. This allows us to build insert, update,
      * or delete operations based on a "before" {@link Entity} snapshot.
      */
-    public static class AugmentedValues {
+    public static class ValuesDelta {
         private ContentValues mBefore;
         private ContentValues mAfter;
         private String mIdTable = "data";
         private String mIdColumn = BaseColumns._ID;
 
-        private AugmentedValues() {
+        private ValuesDelta() {
         }
 
         /**
-         * Create {@link AugmentedValues}, using the given object as the
+         * Create {@link ValuesDelta}, using the given object as the
          * "before" state, usually from an {@link Entity}.
          */
-        public static AugmentedValues fromBefore(ContentValues before) {
-            final AugmentedValues entry = new AugmentedValues();
+        public static ValuesDelta fromBefore(ContentValues before) {
+            final ValuesDelta entry = new ValuesDelta();
             entry.mBefore = before;
             entry.mAfter = new ContentValues();
             return entry;
         }
 
         /**
-         * Create {@link AugmentedValues}, using the given object as the "after"
+         * Create {@link ValuesDelta}, using the given object as the "after"
          * state, usually when we are inserting a row instead of updating.
          */
-        public static AugmentedValues fromAfter(ContentValues after) {
-            final AugmentedValues entry = new AugmentedValues();
+        public static ValuesDelta fromAfter(ContentValues after) {
+            final ValuesDelta entry = new ValuesDelta();
             entry.mBefore = null;
             entry.mAfter = after;
             return entry;
@@ -481,9 +481,9 @@
 
         @Override
         public boolean equals(Object object) {
-            if (object instanceof AugmentedValues) {
+            if (object instanceof ValuesDelta) {
                 // Only exactly equal with both are identical subsets
-                final AugmentedValues other = (AugmentedValues)object;
+                final ValuesDelta other = (ValuesDelta)object;
                 return this.subsetEquals(other) && other.subsetEquals(this);
             }
             return false;
@@ -512,10 +512,10 @@
         }
 
         /**
-         * Check if the given {@link AugmentedValues} is both a subset of this
+         * Check if the given {@link ValuesDelta} is both a subset of this
          * object, and any defined keys have equal values.
          */
-        public boolean subsetEquals(AugmentedValues other) {
+        public boolean subsetEquals(ValuesDelta other) {
             for (String key : this.keySet()) {
                 final String ourValue = this.getAsString(key);
                 final String theirValue = other.getAsString(key);
diff --git a/src/com/android/contacts/model/EntityModifier.java b/src/com/android/contacts/model/EntityModifier.java
index 33ccf6f..5dd2880 100644
--- a/src/com/android/contacts/model/EntityModifier.java
+++ b/src/com/android/contacts/model/EntityModifier.java
@@ -16,7 +16,7 @@
 
 package com.android.contacts.model;
 
-import com.android.contacts.model.AugmentedEntity.AugmentedValues;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.ContactsSource.DataKind;
 import com.android.contacts.model.ContactsSource.EditType;
 
@@ -29,16 +29,16 @@
 import java.util.List;
 
 /**
- * Helper methods for modifying an {@link AugmentedEntity}, such as inserting
+ * Helper methods for modifying an {@link EntityDelta}, such as inserting
  * new rows, or enforcing {@link ContactsSource}.
  */
 public class EntityModifier {
     /**
-     * For the given {@link AugmentedEntity}, determine if the given
+     * For the given {@link EntityDelta}, determine if the given
      * {@link DataKind} could be inserted under specific
      * {@link ContactsSource}.
      */
-    public static boolean canInsert(AugmentedEntity state, DataKind kind) {
+    public static boolean canInsert(EntityDelta state, DataKind kind) {
         // Insert possible when have valid types and under overall maximum
         final boolean validTypes = hasValidTypes(state, kind);
         final boolean validOverall = (kind.typeOverallMax == -1)
@@ -46,21 +46,21 @@
         return (validTypes && validOverall);
     }
 
-    public static boolean hasValidTypes(AugmentedEntity state, DataKind kind) {
+    public static boolean hasValidTypes(EntityDelta state, DataKind kind) {
         return (getValidTypes(state, kind).size() > 0);
     }
 
     /**
-     * For the given {@link AugmentedEntity} and {@link DataKind}, return the
+     * For the given {@link EntityDelta} and {@link DataKind}, return the
      * list possible {@link EditType} options available based on
      * {@link ContactsSource}.
      */
-    public static ArrayList<EditType> getValidTypes(AugmentedEntity state, DataKind kind) {
+    public static ArrayList<EditType> getValidTypes(EntityDelta state, DataKind kind) {
         return getValidTypes(state, kind, null, true, null);
     }
 
     /**
-     * For the given {@link AugmentedEntity} and {@link DataKind}, return the
+     * For the given {@link EntityDelta} and {@link DataKind}, return the
      * list possible {@link EditType} options available based on
      * {@link ContactsSource}.
      *
@@ -68,13 +68,13 @@
      *            list, even when an otherwise-invalid choice. This is useful
      *            when showing a dialog that includes the current type.
      */
-    public static ArrayList<EditType> getValidTypes(AugmentedEntity state, DataKind kind,
+    public static ArrayList<EditType> getValidTypes(EntityDelta state, DataKind kind,
             EditType forceInclude) {
         return getValidTypes(state, kind, forceInclude, true, null);
     }
 
     /**
-     * For the given {@link AugmentedEntity} and {@link DataKind}, return the
+     * For the given {@link EntityDelta} and {@link DataKind}, return the
      * list possible {@link EditType} options available based on
      * {@link ContactsSource}.
      *
@@ -85,9 +85,9 @@
      *            {@link EditType#secondary}.
      * @param typeCount When provided, will be used for the frequency count of
      *            each {@link EditType}, otherwise built using
-     *            {@link #getTypeFrequencies(AugmentedEntity, DataKind)}.
+     *            {@link #getTypeFrequencies(EntityDelta, DataKind)}.
      */
-    private static ArrayList<EditType> getValidTypes(AugmentedEntity state, DataKind kind,
+    private static ArrayList<EditType> getValidTypes(EntityDelta state, DataKind kind,
             EditType forceInclude, boolean includeSecondary, SparseIntArray typeCount) {
         final ArrayList<EditType> validTypes = new ArrayList<EditType>();
 
@@ -119,19 +119,19 @@
 
     /**
      * Count up the frequency that each {@link EditType} appears in the given
-     * {@link AugmentedEntity}. The returned {@link SparseIntArray} maps from
+     * {@link EntityDelta}. The returned {@link SparseIntArray} maps from
      * {@link EditType#rawValue} to counts, with the total overall count stored
      * as {@link #FREQUENCY_TOTAL}.
      */
-    private static SparseIntArray getTypeFrequencies(AugmentedEntity state, DataKind kind) {
+    private static SparseIntArray getTypeFrequencies(EntityDelta state, DataKind kind) {
         final SparseIntArray typeCount = new SparseIntArray();
 
         // Find all entries for this kind, bailing early if none found
-        final List<AugmentedValues> mimeEntries = state.getMimeEntries(kind.mimeType);
+        final List<ValuesDelta> mimeEntries = state.getMimeEntries(kind.mimeType);
         if (mimeEntries == null) return typeCount;
 
         int totalCount = 0;
-        for (AugmentedValues entry : mimeEntries) {
+        for (ValuesDelta entry : mimeEntries) {
             // Only count visible entries
             if (!entry.isVisible()) continue;
             totalCount++;
@@ -156,10 +156,10 @@
 
     /**
      * Find the {@link EditType} that describes the given
-     * {@link AugmentedValues} row, assuming the given {@link DataKind} dictates
+     * {@link ValuesDelta} row, assuming the given {@link DataKind} dictates
      * the possible types.
      */
-    public static EditType getCurrentType(AugmentedValues entry, DataKind kind) {
+    public static EditType getCurrentType(ValuesDelta entry, DataKind kind) {
         final Long rawValue = entry.getAsLong(kind.typeColumn);
         if (rawValue == null) return null;
         return getType(kind, rawValue.intValue());
@@ -182,7 +182,7 @@
      * first primary type that doesn't already exist. When all valid types
      * exist, we pick the last valid option.
      */
-    public static EditType getBestValidType(AugmentedEntity state, DataKind kind,
+    public static EditType getBestValidType(EntityDelta state, DataKind kind,
             boolean includeSecondary) {
         // Shortcut when no types
         if (kind.typeColumn == null) return null;
@@ -218,10 +218,10 @@
 
     /**
      * Insert a new child of kind {@link DataKind} into the given
-     * {@link AugmentedEntity}. Tries using the best {@link EditType} found
-     * using {@link #getBestValidType(AugmentedEntity, DataKind, boolean)}.
+     * {@link EntityDelta}. Tries using the best {@link EditType} found
+     * using {@link #getBestValidType(EntityDelta, DataKind, boolean)}.
      */
-    public static void insertChild(AugmentedEntity state, DataKind kind) {
+    public static void insertChild(EntityDelta state, DataKind kind) {
         // First try finding a valid primary
         EditType bestType = getBestValidType(state, kind, false);
         if (bestType == null) {
@@ -233,9 +233,9 @@
 
     /**
      * Insert a new child of kind {@link DataKind} into the given
-     * {@link AugmentedEntity}, marked with the given {@link EditType}.
+     * {@link EntityDelta}, marked with the given {@link EditType}.
      */
-    public static void insertChild(AugmentedEntity state, DataKind kind, EditType type) {
+    public static void insertChild(EntityDelta state, DataKind kind, EditType type) {
         final ContentValues after = new ContentValues();
 
         // Our parent CONTACT_ID is provided later
@@ -251,7 +251,7 @@
             after.put(kind.typeColumn, type.rawValue);
         }
 
-        state.addEntry(AugmentedValues.fromAfter(after));
+        state.addEntry(ValuesDelta.fromAfter(after));
     }
 
 }
diff --git a/src/com/android/contacts/ui/EditContactActivity.java b/src/com/android/contacts/ui/EditContactActivity.java
index 7555b20..94a67bf 100644
--- a/src/com/android/contacts/ui/EditContactActivity.java
+++ b/src/com/android/contacts/ui/EditContactActivity.java
@@ -17,7 +17,7 @@
 package com.android.contacts.ui;
 
 import com.android.contacts.R;
-import com.android.contacts.model.AugmentedEntity;
+import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.Sources;
 import com.android.contacts.ui.widget.ContactEditorView;
@@ -78,7 +78,7 @@
 //    private boolean mContactChanged = false;
 
     private Uri mUri;
-    private ArrayList<AugmentedEntity> mEntities = new ArrayList<AugmentedEntity>();
+    private ArrayList<EntityDelta> mEntities = new ArrayList<EntityDelta>();
 
     private ContentResolver mResolver;
     private ContactEditorView mEditor;
@@ -128,7 +128,7 @@
                         ContactsContract.RawContacts.CONTACT_ID + "=" + aggId, null, null);
                 while (iterator.hasNext()) {
                     final Entity before = iterator.next();
-                    final AugmentedEntity entity = AugmentedEntity.fromBefore(before);
+                    final EntityDelta entity = EntityDelta.fromBefore(before);
 
                     mEntities.add(entity);
 
@@ -555,7 +555,7 @@
 
         final ContentResolver resolver = this.getContentResolver();
 
-        for (AugmentedEntity entity : mEntities) {
+        for (EntityDelta entity : mEntities) {
 
             Log.d(TAG, "about to persist " + entity.toString());
 
diff --git a/src/com/android/contacts/ui/widget/ContactEditorView.java b/src/com/android/contacts/ui/widget/ContactEditorView.java
index 058c040..5e7785a 100644
--- a/src/com/android/contacts/ui/widget/ContactEditorView.java
+++ b/src/com/android/contacts/ui/widget/ContactEditorView.java
@@ -17,10 +17,10 @@
 package com.android.contacts.ui.widget;
 
 import com.android.contacts.R;
-import com.android.contacts.model.AugmentedEntity;
+import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityModifier;
 import com.android.contacts.model.ContactsSource;
-import com.android.contacts.model.AugmentedEntity.AugmentedValues;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.ContactsSource.DataKind;
 import com.android.contacts.model.ContactsSource.EditField;
 import com.android.contacts.model.ContactsSource.EditType;
@@ -50,11 +50,11 @@
 
 /**
  * Custom view that provides all the editor interaction for a specific
- * {@link Contacts} represented through an {@link AugmentedEntity}. Callers can
+ * {@link Contacts} represented through an {@link EntityDelta}. Callers can
  * reuse this view and quickly rebuild its contents through
- * {@link #setState(AugmentedEntity, ContactsSource)}.
+ * {@link #setState(EntityDelta, ContactsSource)}.
  * <p>
- * Internal updates are performed against {@link AugmentedValues} so that the
+ * Internal updates are performed against {@link ValuesDelta} so that the
  * source {@link Entity} can be swapped out. Any state-based changes, such as
  * adding {@link Data} rows or changing {@link EditType}, are performed through
  * {@link EntityModifier} to ensure that {@link ContactsSource} are enforced.
@@ -80,10 +80,10 @@
 
     /**
      * Set the internal state for this view, given a current
-     * {@link AugmentedEntity} state and the {@link ContactsSource} that
+     * {@link EntityDelta} state and the {@link ContactsSource} that
      * apply to that state.
      */
-    public void setState(AugmentedEntity state, ContactsSource source) {
+    public void setState(EntityDelta state, ContactsSource source) {
         // Remove any existing sections
         mGeneral.removeAllViews();
         mSecondary.removeAllViews();
@@ -96,11 +96,11 @@
             final String mimeType = kind.mimeType;
             if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 // Handle special case editor for structured name
-                final AugmentedValues primary = state.getPrimaryEntry(mimeType);
+                final ValuesDelta primary = state.getPrimaryEntry(mimeType);
                 mDisplayName.setValues(null, primary, state);
             } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 // Handle special case editor for photos
-                final AugmentedValues firstValue = state.getPrimaryEntry(mimeType);
+                final ValuesDelta firstValue = state.getPrimaryEntry(mimeType);
                 mPhoto.setValues(null, firstValue, state);
             } else {
                 // Otherwise use generic section-based editors
@@ -128,9 +128,9 @@
         private TextView mTitle;
 
         private DataKind mKind;
-        private AugmentedEntity mState;
+        private EntityDelta mState;
 
-        public KindSection(Context context, DataKind kind, AugmentedEntity state) {
+        public KindSection(Context context, DataKind kind, EntityDelta state) {
             super(context, RES_SECTION);
 
             mKind = kind;
@@ -163,7 +163,7 @@
 
             // Build individual editors for each entry
             if (!mState.hasMimeEntries(mKind.mimeType)) return;
-            for (AugmentedValues entry : mState.getMimeEntries(mKind.mimeType)) {
+            for (ValuesDelta entry : mState.getMimeEntries(mKind.mimeType)) {
                 // Skip entries that aren't visible
                 if (!entry.isVisible()) continue;
 
@@ -190,15 +190,15 @@
 
     /**
      * Generic definition of something that edits a {@link Data} row through an
-     * {@link AugmentedValues} object.
+     * {@link ValuesDelta} object.
      */
     protected interface Editor {
         /**
-         * Prepare this editor for the given {@link AugmentedValues}, which
+         * Prepare this editor for the given {@link ValuesDelta}, which
          * builds any needed views. Any changes performed by the user will be
          * written back to that same object.
          */
-        public void setValues(DataKind kind, AugmentedValues values, AugmentedEntity state);
+        public void setValues(DataKind kind, ValuesDelta values, EntityDelta state);
 
         /**
          * Add a specific {@link EditorListener} to this {@link Editor}.
@@ -218,7 +218,7 @@
 
     /**
      * Simple editor that handles labels and any {@link EditField} defined for
-     * the entry. Uses {@link AugmentedValues} to read any existing
+     * the entry. Uses {@link ValuesDelta} to read any existing
      * {@link Entity} values, and to correctly write any changes values.
      */
     protected static class GenericEditor extends ViewHolder implements Editor, OnClickListener {
@@ -231,8 +231,8 @@
         private View mDelete;
 
         private DataKind mKind;
-        private AugmentedValues mEntry;
-        private AugmentedEntity mState;
+        private ValuesDelta mEntry;
+        private EntityDelta mState;
 
         private EditType mType;
 
@@ -278,7 +278,7 @@
             mLabel.setText(mType.labelRes);
         }
 
-        public void setValues(DataKind kind, AugmentedValues entry, AugmentedEntity state) {
+        public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state) {
             mKind = kind;
             mEntry = entry;
             mState = state;
@@ -493,7 +493,7 @@
 //            setPhotoPresent(false);
 //        }
 
-        public void setValues(DataKind kind, AugmentedValues values, AugmentedEntity state) {
+        public void setValues(DataKind kind, ValuesDelta values, EntityDelta state) {
         }
 
         public void setEditorListener(EditorListener listener) {
@@ -510,7 +510,7 @@
             super(context, RES_DISPLAY_NAME);
         }
 
-        public void setValues(DataKind kind, AugmentedValues values, AugmentedEntity state) {
+        public void setValues(DataKind kind, ValuesDelta values, EntityDelta state) {
         }
 
         public void setEditorListener(EditorListener listener) {
diff --git a/tests/src/com/android/contacts/AugmentedEntityTests.java b/tests/src/com/android/contacts/EntityDeltaTests.java
similarity index 75%
rename from tests/src/com/android/contacts/AugmentedEntityTests.java
rename to tests/src/com/android/contacts/EntityDeltaTests.java
index aeab4f9..791f311 100644
--- a/tests/src/com/android/contacts/AugmentedEntityTests.java
+++ b/tests/src/com/android/contacts/EntityDeltaTests.java
@@ -16,8 +16,8 @@
 
 package com.android.contacts;
 
-import com.android.contacts.model.AugmentedEntity;
-import com.android.contacts.model.AugmentedEntity.AugmentedValues;
+import com.android.contacts.model.EntityDelta;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
 
 import static android.content.ContentProviderOperation.TYPE_INSERT;
 import static android.content.ContentProviderOperation.TYPE_UPDATE;
@@ -38,12 +38,12 @@
 import java.util.ArrayList;
 
 /**
- * Tests for {@link AugmentedEntity} and {@link AugmentedValues}. These tests
+ * Tests for {@link EntityDelta} and {@link ValuesDelta}. These tests
  * focus on passing changes across {@link Parcel}, and verifying that they
  * correctly build expected "diff" operations.
  */
 @LargeTest
-public class AugmentedEntityTests extends AndroidTestCase {
+public class EntityDeltaTests extends AndroidTestCase {
     public static final String TAG = "AugmentedEntityTests";
 
     private static final long TEST_CONTACT_ID = 12;
@@ -54,7 +54,7 @@
 
     private static final String TEST_ACCOUNT_NAME = "TEST";
 
-    public AugmentedEntityTests() {
+    public EntityDeltaTests() {
         super();
     }
 
@@ -81,91 +81,68 @@
     }
 
     /**
-     * Test that {@link AugmentedEntity#augmentTo(Parcel)} correctly passes any
+     * Test that {@link EntityDelta#augmentTo(Parcel)} correctly passes any
      * changes through the {@link Parcel} object. This enforces that
-     * {@link AugmentedEntity} should be identical when serialized against the
+     * {@link EntityDelta} should be identical when serialized against the
      * same "before" {@link Entity}.
      */
     public void testParcelChangesNone() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
+        final EntityDelta dest = EntityDelta.fromBefore(before);
 
-        // No changes, should be same
-        final Parcel parcel = Parcel.obtain();
-        source.augmentTo(parcel);
-
-        final AugmentedEntity dest = AugmentedEntity.fromBefore(before);
-        parcel.setDataPosition(0);
-        dest.augmentFrom(parcel);
-
-        // Assert that we have same data rows
-        assertEquals("Changed when passing through Parcel", source, dest);
-        parcel.recycle();
+        // Merge modified values and assert they match
+        dest.mergeAfter(source);
+        assertEquals("Unexpected change when merging", source, dest);
     }
 
     public void testParcelChangesInsert() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
+        final EntityDelta dest = EntityDelta.fromBefore(before);
 
         // Add a new row and pass across parcel, should be same
         final ContentValues phone = new ContentValues();
         phone.put(Data.MIMETYPE, Phone.MIMETYPE);
         phone.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
         phone.put(Phone.TYPE, Phone.TYPE_WORK);
-        source.addEntry(AugmentedValues.fromAfter(phone));
+        source.addEntry(ValuesDelta.fromAfter(phone));
 
-        final Parcel parcel = Parcel.obtain();
-        source.augmentTo(parcel);
-
-        final AugmentedEntity dest = AugmentedEntity.fromBefore(before);
-        parcel.setDataPosition(0);
-        dest.augmentFrom(parcel);
-
-        // Assert that we have same data rows
-        assertEquals("Changed when passing through Parcel", source, dest);
-        parcel.recycle();
+        // Merge modified values and assert they match
+        dest.mergeAfter(source);
+        assertEquals("Unexpected change when merging", source, dest);
     }
 
     public void testParcelChangesUpdate() {
         // Update existing row and pass across parcel, should be same
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
-        final AugmentedValues child = source.getEntry(TEST_PHONE_ID);
+        final EntityDelta source = EntityDelta.fromBefore(before);
+        final EntityDelta dest = EntityDelta.fromBefore(before);
+
+        final ValuesDelta child = source.getEntry(TEST_PHONE_ID);
         child.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
 
-        final Parcel parcel = Parcel.obtain();
-        source.augmentTo(parcel);
-
-        final AugmentedEntity dest = AugmentedEntity.fromBefore(before);
-        parcel.setDataPosition(0);
-        dest.augmentFrom(parcel);
-
-        // Assert that we have same data rows
-        assertEquals("Changed when passing through Parcel", source, dest);
-        parcel.recycle();
+        // Merge modified values and assert they match
+        dest.mergeAfter(source);
+        assertEquals("Unexpected change when merging", source, dest);
     }
 
     public void testParcelChangesDelete() {
         // Delete a row and pass across parcel, should be same
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
-        final AugmentedValues child = source.getEntry(TEST_PHONE_ID);
+        final EntityDelta source = EntityDelta.fromBefore(before);
+        final EntityDelta dest = EntityDelta.fromBefore(before);
+
+        final ValuesDelta child = source.getEntry(TEST_PHONE_ID);
         child.markDeleted();
 
-        final Parcel parcel = Parcel.obtain();
-        source.augmentTo(parcel);
-
-        final AugmentedEntity dest = AugmentedEntity.fromBefore(before);
-        parcel.setDataPosition(0);
-        dest.augmentFrom(parcel);
-
-        // Assert that we have same data rows
-        assertEquals("Changed when passing through Parcel", source, dest);
-        parcel.recycle();
+        // Merge modified values and assert they match
+        dest.mergeAfter(source);
+        assertEquals("Unexpected change when merging", source, dest);
     }
 
     /**
-     * Test that {@link AugmentedValues#buildDiff()} is correctly built for
+     * Test that {@link ValuesDelta#buildDiff()} is correctly built for
      * insert, update, and delete cases. Note this only tests behavior for
      * individual {@link Data} rows.
      */
@@ -174,7 +151,7 @@
         before.put(Data._ID, TEST_PHONE_ID);
         before.put(Phone.NUMBER, TEST_PHONE_NUMBER_1);
 
-        final AugmentedValues values = AugmentedValues.fromBefore(before);
+        final ValuesDelta values = ValuesDelta.fromBefore(before);
 
         // None action shouldn't produce a builder
         final Builder builder = values.buildDiff(Data.CONTENT_URI);
@@ -185,7 +162,7 @@
         final ContentValues after = new ContentValues();
         after.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
 
-        final AugmentedValues values = AugmentedValues.fromAfter(after);
+        final ValuesDelta values = ValuesDelta.fromAfter(after);
 
         // Should produce an insert action
         final Builder builder = values.buildDiff(Data.CONTENT_URI);
@@ -198,7 +175,7 @@
         before.put(Data._ID, TEST_PHONE_ID);
         before.put(Phone.NUMBER, TEST_PHONE_NUMBER_1);
 
-        final AugmentedValues values = AugmentedValues.fromBefore(before);
+        final ValuesDelta values = ValuesDelta.fromBefore(before);
         values.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
 
         // Should produce an update action
@@ -212,7 +189,7 @@
         before.put(Data._ID, TEST_PHONE_ID);
         before.put(Phone.NUMBER, TEST_PHONE_NUMBER_1);
 
-        final AugmentedValues values = AugmentedValues.fromBefore(before);
+        final ValuesDelta values = ValuesDelta.fromBefore(before);
         values.markDeleted();
 
         // Should produce a delete action
@@ -222,13 +199,13 @@
     }
 
     /**
-     * Test that {@link AugmentedEntity#buildDiff()} is correctly built for
+     * Test that {@link EntityDelta#buildDiff()} is correctly built for
      * insert, update, and delete cases. This only tests a subset of possible
      * {@link Data} row changes.
      */
     public void testEntityDiffNone() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
 
         // Assert that writing unchanged produces few operations
         final ArrayList<ContentProviderOperation> diff = source.buildDiff();
@@ -238,14 +215,14 @@
 
     public void testEntityDiffNoneInsert() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
 
         // Insert a new phone number
         final ContentValues phone = new ContentValues();
         phone.put(Data.MIMETYPE, Phone.MIMETYPE);
         phone.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
         phone.put(Phone.TYPE, Phone.TYPE_WORK);
-        source.addEntry(AugmentedValues.fromAfter(phone));
+        source.addEntry(ValuesDelta.fromAfter(phone));
 
         // Assert two operations: insert Data row and enforce version
         final ArrayList<ContentProviderOperation> diff = source.buildDiff();
@@ -263,7 +240,7 @@
 
     public void testEntityDiffUpdateInsert() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
 
         // Update parent contact values
         source.getValues().put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
@@ -273,7 +250,7 @@
         phone.put(Data.MIMETYPE, Phone.MIMETYPE);
         phone.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
         phone.put(Phone.TYPE, Phone.TYPE_WORK);
-        source.addEntry(AugmentedValues.fromAfter(phone));
+        source.addEntry(ValuesDelta.fromAfter(phone));
 
         // Assert three operations: update Contact, insert Data row, enforce version
         final ArrayList<ContentProviderOperation> diff = source.buildDiff();
@@ -296,10 +273,10 @@
 
     public void testEntityDiffNoneUpdate() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
 
         // Update existing phone number
-        final AugmentedValues child = source.getEntry(TEST_PHONE_ID);
+        final ValuesDelta child = source.getEntry(TEST_PHONE_ID);
         child.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
 
         // Assert two operations: update Data and enforce version
@@ -318,7 +295,7 @@
 
     public void testEntityDiffDelete() {
         final Entity before = getEntity(TEST_CONTACT_ID, TEST_PHONE_ID);
-        final AugmentedEntity source = AugmentedEntity.fromBefore(before);
+        final EntityDelta source = EntityDelta.fromBefore(before);
 
         // Delete entire entity
         source.getValues().markDeleted();
@@ -343,8 +320,8 @@
         after.put(RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME);
         after.put(RawContacts.SEND_TO_VOICEMAIL, 1);
 
-        final AugmentedValues values = AugmentedValues.fromAfter(after);
-        final AugmentedEntity source = new AugmentedEntity(values);
+        final ValuesDelta values = ValuesDelta.fromAfter(after);
+        final EntityDelta source = new EntityDelta(values);
 
         // Assert two operations: delete Contact and enforce version
         final ArrayList<ContentProviderOperation> diff = source.buildDiff();
@@ -362,15 +339,15 @@
         after.put(RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME);
         after.put(RawContacts.SEND_TO_VOICEMAIL, 1);
 
-        final AugmentedValues values = AugmentedValues.fromAfter(after);
-        final AugmentedEntity source = new AugmentedEntity(values);
+        final ValuesDelta values = ValuesDelta.fromAfter(after);
+        final EntityDelta source = new EntityDelta(values);
 
         // Insert a new phone number
         final ContentValues phone = new ContentValues();
         phone.put(Data.MIMETYPE, Phone.MIMETYPE);
         phone.put(Phone.NUMBER, TEST_PHONE_NUMBER_2);
         phone.put(Phone.TYPE, Phone.TYPE_WORK);
-        source.addEntry(AugmentedValues.fromAfter(phone));
+        source.addEntry(ValuesDelta.fromAfter(phone));
 
         // Assert two operations: delete Contact and enforce version
         final ArrayList<ContentProviderOperation> diff = source.buildDiff();
diff --git a/tests/src/com/android/contacts/EntityModifierTests.java b/tests/src/com/android/contacts/EntityModifierTests.java
index 4db9d0b..9d41f67 100644
--- a/tests/src/com/android/contacts/EntityModifierTests.java
+++ b/tests/src/com/android/contacts/EntityModifierTests.java
@@ -16,7 +16,7 @@
 
 package com.android.contacts;
 
-import com.android.contacts.model.AugmentedEntity;
+import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.EntityModifier;
 import com.android.contacts.model.ContactsSource.DataKind;
@@ -77,10 +77,10 @@
     /**
      * Build an {@link Entity} with the requested set of phone numbers.
      */
-    protected AugmentedEntity getEntity() {
+    protected EntityDelta getEntity() {
         final ContentValues contact = new ContentValues();
         final Entity before = new Entity(contact);
-        return AugmentedEntity.fromBefore(before);
+        return EntityDelta.fromBefore(before);
     }
 
     /**
@@ -99,7 +99,7 @@
 
     /**
      * Insert various rows to test
-     * {@link EntityModifier#getValidTypes(AugmentedEntity, DataKind, EditType)}
+     * {@link EntityModifier#getValidTypes(EntityDelta, DataKind, EditType)}
      */
     public void testValidTypes() {
         // Build a source and pull specific types
@@ -112,7 +112,7 @@
         List<EditType> validTypes;
 
         // Add first home, first work
-        final AugmentedEntity state = getEntity();
+        final EntityDelta state = getEntity();
         EntityModifier.insertChild(state, kindPhone, typeHome);
         EntityModifier.insertChild(state, kindPhone, typeWork);
 
@@ -143,7 +143,7 @@
     }
 
     /**
-     * Test {@link EntityModifier#canInsert(AugmentedEntity, DataKind)} by
+     * Test {@link EntityModifier#canInsert(EntityDelta, DataKind)} by
      * inserting various rows.
      */
     public void testCanInsert() {
@@ -155,7 +155,7 @@
         final EditType typeOther = EntityModifier.getType(kindPhone, Phone.TYPE_OTHER);
 
         // Add first home, first work
-        final AugmentedEntity state = getEntity();
+        final EntityDelta state = getEntity();
         EntityModifier.insertChild(state, kindPhone, typeHome);
         EntityModifier.insertChild(state, kindPhone, typeWork);
         assertTrue("Unable to insert", EntityModifier.canInsert(state, kindPhone));
@@ -171,7 +171,7 @@
     }
 
     /**
-     * Test {@link EntityModifier#getBestValidType(AugmentedEntity, DataKind)}
+     * Test {@link EntityModifier#getBestValidType(EntityDelta, DataKind)}
      * by asserting expected best options in various states.
      */
     public void testBestValidType() {
@@ -186,7 +186,7 @@
         EditType suggested;
 
         // Default suggestion should be home
-        final AugmentedEntity state = getEntity();
+        final EntityDelta state = getEntity();
         suggested = EntityModifier.getBestValidType(state, kindPhone, false);
         assertEquals("Unexpected suggestion", typeHome, suggested);
 
