diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index d8af3da..7deb988 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -54,6 +54,7 @@
 import android.os.RemoteException;
 import android.provider.BaseColumns;
 import android.provider.ContactsContract;
+import android.provider.Contacts.People;
 import android.provider.ContactsContract.AggregationExceptions;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.ContactsContract.Contacts;
@@ -455,6 +456,30 @@
         columns.put(RawContacts.DELETED,
                 OpenHelper.RawContactsColumns.CONCRETE_DELETED
                         + " AS " + RawContacts.DELETED);
+        columns.put(RawContacts.TIMES_CONTACTED,
+                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
+                        + " AS " + People.TIMES_CONTACTED);
+        columns.put(RawContacts.LAST_TIME_CONTACTED,
+                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
+                        + " AS " + People.LAST_TIME_CONTACTED);
+        columns.put(RawContacts.CUSTOM_RINGTONE,
+                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
+                        + " AS " + People.CUSTOM_RINGTONE);
+        columns.put(RawContacts.SEND_TO_VOICEMAIL,
+                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
+                        + " AS " + People.SEND_TO_VOICEMAIL);
+        columns.put(RawContacts.STARRED,
+                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
+                        + " AS " + People.STARRED);
+        columns.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE);
+        columns.put(RawContacts.SYNC1,
+                Tables.RAW_CONTACTS + "." + RawContacts.SYNC1 + " AS " + RawContacts.SYNC1);
+        columns.put(RawContacts.SYNC2,
+                Tables.RAW_CONTACTS + "." + RawContacts.SYNC2 + " AS " + RawContacts.SYNC2);
+        columns.put(RawContacts.SYNC3,
+                Tables.RAW_CONTACTS + "." + RawContacts.SYNC3 + " AS " + RawContacts.SYNC3);
+        columns.put(RawContacts.SYNC4,
+                Tables.RAW_CONTACTS + "." + RawContacts.SYNC4 + " AS " + RawContacts.SYNC4);
         sRawContactsProjectionMap = columns;
 
         columns = new HashMap<String, String>();
@@ -486,6 +511,10 @@
         columns.put(Data.DATA13, "data.data13 as data13");
         columns.put(Data.DATA14, "data.data14 as data14");
         columns.put(Data.DATA15, "data.data15 as data15");
+        columns.put(Data.SYNC1, Tables.DATA + "." + Data.SYNC1 + " AS " + Data.SYNC1);
+        columns.put(Data.SYNC2, Tables.DATA + "." + Data.SYNC2 + " AS " + Data.SYNC2);
+        columns.put(Data.SYNC3, Tables.DATA + "." + Data.SYNC3 + " AS " + Data.SYNC3);
+        columns.put(Data.SYNC4, Tables.DATA + "." + Data.SYNC4 + " AS " + Data.SYNC4);
         columns.put(GroupMembership.GROUP_SOURCE_ID, GroupsColumns.CONCRETE_SOURCE_ID + " AS "
                 + GroupMembership.GROUP_SOURCE_ID);
 
@@ -533,6 +562,12 @@
         columns.put(Groups.TITLE, Groups.TITLE);
         columns.put(Groups.TITLE_RES, Groups.TITLE_RES);
         columns.put(Groups.GROUP_VISIBLE, Groups.GROUP_VISIBLE);
+        columns.put(Groups.SYSTEM_ID, Groups.SYSTEM_ID);
+        columns.put(Groups.NOTES, Groups.NOTES);
+        columns.put(Groups.SYNC1, Tables.GROUPS + "." + Groups.SYNC1 + " AS " + Groups.SYNC1);
+        columns.put(Groups.SYNC2, Tables.GROUPS + "." + Groups.SYNC2 + " AS " + Groups.SYNC2);
+        columns.put(Groups.SYNC3, Tables.GROUPS + "." + Groups.SYNC3 + " AS " + Groups.SYNC3);
+        columns.put(Groups.SYNC4, Tables.GROUPS + "." + Groups.SYNC4 + " AS " + Groups.SYNC4);
         sGroupsProjectionMap = columns;
 
         // RawContacts and groups projection map
@@ -1896,7 +1931,7 @@
         long contactId = values.getAsInteger(AggregationExceptions.CONTACT_ID);
         long rawContactId = values.getAsInteger(AggregationExceptions.RAW_CONTACT_ID);
 
-        // First, we build a list of contactID-contactID pairs for the given contact and contact.
+        // First, we build a list of rawContactID-rawContactID pairs for the given contact.
         ArrayList<RawContactPair> pairs = new ArrayList<RawContactPair>();
         Cursor c = db.query(ContactsQuery.TABLE, ContactsQuery.PROJECTION, RawContacts.CONTACT_ID
                 + "=" + contactId, null, null, null, null);
diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java
index 01c41d4..0352b8b 100644
--- a/src/com/android/providers/contacts/OpenHelper.java
+++ b/src/com/android/providers/contacts/OpenHelper.java
@@ -58,7 +58,7 @@
 /* package */ class OpenHelper extends SQLiteOpenHelper {
     private static final String TAG = "OpenHelper";
 
-    private static final int DATABASE_VERSION = 58;
+    private static final int DATABASE_VERSION = 59;
     private static final String DATABASE_NAME = "contacts2.db";
     private static final String DATABASE_PRESENCE = "presence_db";
 
@@ -541,7 +541,11 @@
                 RawContacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," +
                 RawContacts.LAST_TIME_CONTACTED + " INTEGER," +
                 RawContacts.STARRED + " INTEGER NOT NULL DEFAULT 0," +
-                RawContactsColumns.DISPLAY_NAME + " TEXT" +
+                RawContactsColumns.DISPLAY_NAME + " TEXT," +
+                RawContacts.SYNC1 + " TEXT, " +
+                RawContacts.SYNC2 + " TEXT, " +
+                RawContacts.SYNC3 + " TEXT, " +
+                RawContacts.SYNC4 + " TEXT " +
         ");");
 
         // Package name mapping table
@@ -579,7 +583,11 @@
                 Data.DATA12 + " TEXT," +
                 Data.DATA13 + " TEXT," +
                 Data.DATA14 + " TEXT," +
-                Data.DATA15 + " TEXT" +
+                Data.DATA15 + " TEXT," +
+                Data.SYNC1 + " TEXT, " +
+                Data.SYNC2 + " TEXT, " +
+                Data.SYNC3 + " TEXT, " +
+                Data.SYNC4 + " TEXT " +
         ");");
 
         /**
@@ -692,7 +700,11 @@
                 Groups.TITLE_RES + " INTEGER," +
                 Groups.NOTES + " TEXT," +
                 Groups.SYSTEM_ID + " TEXT," +
-                Groups.GROUP_VISIBLE + " INTEGER" +
+                Groups.GROUP_VISIBLE + " INTEGER," +
+                Groups.SYNC1 + " TEXT, " +
+                Groups.SYNC2 + " TEXT, " +
+                Groups.SYNC3 + " TEXT, " +
+                Groups.SYNC4 + " TEXT " +
         ");");
 
         db.execSQL("CREATE TRIGGER " + Tables.GROUPS + "_updated1 "
diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
index cc27428..2c85675 100644
--- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
@@ -117,8 +117,12 @@
     }
 
     protected long createRawContactWithName() {
+        return createRawContactWithName("John", "Doe");
+    }
+
+    protected long createRawContactWithName(String firstName, String lastName) {
         long rawContactId = createRawContact(null);
-        insertStructuredName(rawContactId, "John", "Doe");
+        insertStructuredName(rawContactId, firstName, lastName);
         return rawContactId;
     }
 
@@ -475,6 +479,7 @@
         assertTrue(c.moveToNext());
         assertEquals(state, c.getLong(0) != 0);
         assertFalse(c.moveToNext());
+        c.close();
     }
 
     protected long getVersion(Uri uri) {
@@ -482,6 +487,7 @@
         assertTrue(c.moveToNext());
         long version = c.getLong(0);
         assertFalse(c.moveToNext());
+        c.close();
         return version;
     }
 
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index f6d5bd7..ee1a981 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -28,6 +28,7 @@
 import android.provider.ContactsContract.AggregationExceptions;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.Presence;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -49,6 +50,86 @@
 @LargeTest
 public class ContactsProvider2Test extends BaseContactsProvider2Test {
 
+    public void testRawContactsInsert() {
+        ContentValues values = new ContentValues();
+
+        values.put(RawContacts.ACCOUNT_NAME, "a");
+        values.put(RawContacts.ACCOUNT_TYPE, "b");
+        values.put(RawContacts.SOURCE_ID, "c");
+        values.put(RawContacts.VERSION, 42);
+        values.put(RawContacts.DIRTY, 1);
+        values.put(RawContacts.DELETED, 1);
+        values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
+        values.put(RawContacts.CUSTOM_RINGTONE, "d");
+        values.put(RawContacts.SEND_TO_VOICEMAIL, 1);
+        values.put(RawContacts.LAST_TIME_CONTACTED, 12345);
+        values.put(RawContacts.STARRED, 1);
+        values.put(RawContacts.SYNC1, "e");
+        values.put(RawContacts.SYNC2, "f");
+        values.put(RawContacts.SYNC3, "g");
+        values.put(RawContacts.SYNC4, "h");
+
+        Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+
+        assertStoredValues(rowUri, values);
+    }
+
+    public void testDataInsert() {
+        long rawContactId = createRawContact();
+
+        ContentValues values = new ContentValues();
+        values.put(Data.RAW_CONTACT_ID, rawContactId);
+        values.put(Data.MIMETYPE, "testmimetype");
+        values.put(Data.RES_PACKAGE, "oldpackage");
+        values.put(Data.IS_PRIMARY, 1);
+        values.put(Data.IS_SUPER_PRIMARY, 1);
+        values.put(Data.DATA1, "one");
+        values.put(Data.DATA2, "two");
+        values.put(Data.DATA3, "three");
+        values.put(Data.DATA4, "four");
+        values.put(Data.DATA5, "five");
+        values.put(Data.DATA6, "six");
+        values.put(Data.DATA7, "seven");
+        values.put(Data.DATA8, "eight");
+        values.put(Data.DATA9, "nine");
+        values.put(Data.DATA10, "ten");
+        values.put(Data.DATA11, "eleven");
+        values.put(Data.DATA12, "twelve");
+        values.put(Data.DATA13, "thirteen");
+        values.put(Data.DATA14, "fourteen");
+        values.put(Data.DATA15, "fifteen");
+        values.put(Data.SYNC1, "sync1");
+        values.put(Data.SYNC2, "sync2");
+        values.put(Data.SYNC3, "sync3");
+        values.put(Data.SYNC4, "sync4");
+        Uri uri = mResolver.insert(Data.CONTENT_URI, values);
+        assertStoredValues(uri, values);
+    }
+
+    public void testGroupInsert() {
+        ContentValues values = new ContentValues();
+
+        values.put(Groups.ACCOUNT_NAME, "a");
+        values.put(Groups.ACCOUNT_TYPE, "b");
+        values.put(Groups.SOURCE_ID, "c");
+        values.put(Groups.VERSION, 42);
+        values.put(Groups.DIRTY, 1);
+        values.put(Groups.GROUP_VISIBLE, 1);
+        values.put(Groups.TITLE, "d");
+        values.put(Groups.TITLE_RES, 1234);
+        values.put(Groups.NOTES, "e");
+        values.put(Groups.RES_PACKAGE, "f");
+        values.put(Groups.SYSTEM_ID, "g");
+        values.put(Groups.SYNC1, "h");
+        values.put(Groups.SYNC2, "i");
+        values.put(Groups.SYNC3, "j");
+        values.put(Groups.SYNC4, "k");
+
+        Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values);
+
+        assertStoredValues(rowUri, values);
+    }
+
     public void testDisplayNameParsingWhenPartsUnspecified() {
         long rawContactId = createRawContact();
         ContentValues values = new ContentValues();
@@ -88,11 +169,11 @@
     }
 
     public void testSendToVoicemailAndRingtoneAfterAggregation() {
-        long rawContactId1 = createRawContactWithName();
+        long rawContactId1 = createRawContactWithName("a", "b");
         long contactId1 = queryContactId(rawContactId1);
         updateSendToVoicemailAndRingtone(contactId1, true, "foo");
 
-        long rawContactId2 = createRawContactWithName();
+        long rawContactId2 = createRawContactWithName("c", "d");
         long contactId2 = queryContactId(rawContactId2);
         updateSendToVoicemailAndRingtone(contactId2, true, "bar");
 
@@ -104,11 +185,11 @@
     }
 
     public void testDoNotSendToVoicemailAfterAggregation() {
-        long rawContactId1 = createRawContactWithName();
+        long rawContactId1 = createRawContactWithName("e", "f");
         long contactId1 = queryContactId(rawContactId1);
         updateSendToVoicemailAndRingtone(contactId1, true, null);
 
-        long rawContactId2 = createRawContactWithName();
+        long rawContactId2 = createRawContactWithName("g", "h");
         long contactId2 = queryContactId(rawContactId2);
         updateSendToVoicemailAndRingtone(contactId2, false, null);
 
@@ -120,11 +201,11 @@
     }
 
     public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() {
-        long rawContactId1 = createRawContactWithName();
+        long rawContactId1 = createRawContactWithName("i", "j");
         long contactId1 = queryContactId(rawContactId1);
         updateSendToVoicemailAndRingtone(contactId1, true, "foo");
 
-        long rawContactId2 = createRawContactWithName();
+        long rawContactId2 = createRawContactWithName("k", "l");
         long contactId2 = queryContactId(rawContactId2);
         updateSendToVoicemailAndRingtone(contactId2, false, "bar");
 
@@ -134,7 +215,7 @@
         // Split them
         setAggregationException(AggregationExceptions.TYPE_KEEP_OUT, contactId1, rawContactId2);
 
-        assertSendToVoicemailAndRingtone(contactId1, true, "foo");
+        assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo");
         assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar");
     }
 
@@ -229,10 +310,10 @@
         long groupId1 = createGroup(mAccount, "gsid1", "title1");
         long groupId2 = createGroup(mAccount, "gsid2", "title2");
 
-        long c0 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0");
-        Uri id_0_0 = insertGroupMembership(id, "gsid1");
-        Uri id_0_1 = insertEmail(id, "c0@email.com");
-        Uri id_0_2 = insertPhoneNumber(id, "5551212c0");
+        id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0");
+        insertGroupMembership(id, "gsid1");
+        insertEmail(id, "c0@email.com");
+        insertPhoneNumber(id, "5551212c0");
 
         long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1");
         Uri id_1_0 = insertGroupMembership(id, "gsid1");
@@ -245,7 +326,7 @@
         Uri id_2_1 = insertEmail(id, "c2@email.com");
         Uri id_2_2 = insertPhoneNumber(id, "5551212c2");
 
-        long c3 = id = createRawContact(mAccount);
+        long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3");
         Uri id_3_0 = insertGroupMembership(id, groupId2);
         Uri id_3_1 = insertEmail(id, "c3@email.com");
         Uri id_3_2 = insertPhoneNumber(id, "5551212c3");
@@ -305,6 +386,7 @@
                 Email.DATA, "5551212c3");
 
         assertFalse(iterator.hasNext());
+        iterator.close();
     }
 
     public void testDataCreateUpdateDeleteByMimeType() throws Exception {
