diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index 75a6392..94dc408 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -16,11 +16,28 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.cts.provider">
+          package="com.android.cts.provider">
 
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+
     <application>
-        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="android.test.runner"/>
+
+        <service android:name="android.provider.cts.contacts.account.MockAccountService"
+                 process="com.android.cts.provider"
+                 android:exported="true">
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator"/>
+            </intent-filter>
+
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/contactprovider_authenticator"/>
+        </service>
+
     </application>
 
     <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
diff --git a/tests/tests/provider/res/drawable/ic_cts_minitab_selected.png b/tests/tests/provider/res/drawable/ic_cts_minitab_selected.png
new file mode 100644
index 0000000..c730050
--- /dev/null
+++ b/tests/tests/provider/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/provider/res/drawable/ic_cts_selected.png b/tests/tests/provider/res/drawable/ic_cts_selected.png
new file mode 100644
index 0000000..72a065c
--- /dev/null
+++ b/tests/tests/provider/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/provider/res/values/strings.xml b/tests/tests/provider/res/values/strings.xml
new file mode 100644
index 0000000..b599c31
--- /dev/null
+++ b/tests/tests/provider/res/values/strings.xml
@@ -0,0 +1,20 @@
+<!--
+  ~ Copyright (C) 2013 The Android Open Source Project
+  ~
+  ~ 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
+  -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for this package -->
+    <string name="label">Contacts provider</string>
+</resources>
diff --git a/tests/tests/provider/res/xml/contactprovider_authenticator.xml b/tests/tests/provider/res/xml/contactprovider_authenticator.xml
new file mode 100644
index 0000000..2a53438
--- /dev/null
+++ b/tests/tests/provider/res/xml/contactprovider_authenticator.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2013 The Android Open Source Project
+  ~
+  ~ 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
+  -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="com.android.cts.contactsprovider"
+    android:icon="@drawable/ic_cts_selected"
+    android:smallIcon="@drawable/ic_cts_minitab_selected"
+    android:label="@string/label"
+/>
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
index 271588f..006f4df 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
@@ -33,6 +33,7 @@
 import android.provider.cts.contacts.ContactUtil;
 import android.provider.cts.contacts.DatabaseAsserts;
 import android.provider.cts.contacts.RawContactUtil;
+import android.provider.cts.contacts.account.StaticAccountAuthenticator;
 import android.test.AndroidTestCase;
 
 import java.util.List;
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
index 51d62a3..7cfb183 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
@@ -215,9 +215,7 @@
 
     public void testDataUpdate_updatesContactLastUpdatedTimestamp() {
         DatabaseAsserts.ContactIdPair ids = DatabaseAsserts.assertAndCreateContact(mResolver);
-
         long dataId = createData(ids.mRawContactId);
-
         long baseTime = ContactUtil.queryContactLastUpdatedTimestamp(mResolver, ids.mContactId);
 
         SystemClock.sleep(1);
@@ -226,7 +224,8 @@
         DataUtil.update(mResolver, dataId, values);
 
         long newTime = ContactUtil.queryContactLastUpdatedTimestamp(mResolver, ids.mContactId);
-        assertTrue(newTime > baseTime);
+        assertTrue("Expected contact " + ids.mContactId + " last updated to be greater than " +
+                baseTime + ". But was " + newTime, newTime > baseTime);
 
         // Clean up
         RawContactUtil.delete(mResolver, ids.mRawContactId, true);
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataUsageTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataUsageTest.java
index a684e41..d585ec2 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataUsageTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataUsageTest.java
@@ -16,7 +16,6 @@
 
 package android.provider.cts;
 
-import static android.provider.ContactsContract.CommonDataKinds;
 import static android.provider.ContactsContract.DataUsageFeedback;
 
 import android.content.ContentResolver;
@@ -85,27 +84,10 @@
     private long[] setupRawContactDataItems(long rawContactId) {
         // Create 4 data items.
         long[] dataIds = new long[4];
-
-        ContentValues values = new ContentValues();
-        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
-        values.put(CommonDataKinds.Phone.NUMBER, "555-5555");
-        dataIds[0] = DataUtil.insertData(mResolver, rawContactId, values);
-
-        values.clear();
-        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
-        values.put(CommonDataKinds.Phone.NUMBER, "555-5554");
-        dataIds[1] = DataUtil.insertData(mResolver, rawContactId, values);
-
-        values.clear();
-        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE);
-        values.put(CommonDataKinds.Email.ADDRESS, "test@thisisfake.com");
-        dataIds[2] = DataUtil.insertData(mResolver, rawContactId, values);
-
-        values.clear();
-        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE);
-        values.put(CommonDataKinds.Phone.NUMBER, "555-5556");
-        dataIds[3] = DataUtil.insertData(mResolver, rawContactId, values);
-
+        dataIds[0] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5555");
+        dataIds[1] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5554");
+        dataIds[2] = DataUtil.insertEmail(mResolver, rawContactId, "test@thisisfake.com");
+        dataIds[3] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5556");
         return dataIds;
     }
 
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
index d9751f4..e1cea4a 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
@@ -30,6 +30,7 @@
 import android.provider.cts.contacts.ContactUtil;
 import android.provider.cts.contacts.DatabaseAsserts;
 import android.provider.cts.contacts.RawContactUtil;
+import android.provider.cts.contacts.account.StaticAccountAuthenticator;
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 
@@ -91,7 +92,8 @@
     }
 
     public void testRawContactDelete_setsDeleteFlag() {
-        long rawContactid = RawContactUtil.insertRawContact(mResolver);
+        long rawContactid = RawContactUtil.insertRawContact(mResolver,
+                StaticAccountAuthenticator.ACCOUNT_1);
 
         assertTrue(RawContactUtil.rawContactExistsById(mResolver, rawContactid));
 
@@ -111,7 +113,8 @@
     }
 
     public void testRawContactDelete_removesRecord() {
-        long rawContactid = RawContactUtil.insertRawContact(mResolver);
+        long rawContactid = RawContactUtil.insertRawContact(mResolver,
+                StaticAccountAuthenticator.ACCOUNT_1);
         assertTrue(RawContactUtil.rawContactExistsById(mResolver, rawContactid));
 
         RawContactUtil.delete(mResolver, rawContactid, true);
@@ -126,13 +129,14 @@
     public void testRawContactCreate_updatesContactUpdatedTimestamp() {
         long startTime = System.currentTimeMillis();
 
-        long rawContactId = RawContactUtil.createRawContactWithName(mResolver);
-        long lastUpdated = getContactLastUpdatedTimestampByRawContactId(mResolver, rawContactId);
+        DatabaseAsserts.ContactIdPair ids = DatabaseAsserts.assertAndCreateContact(mResolver);
+        long lastUpdated = getContactLastUpdatedTimestampByRawContactId(mResolver,
+                ids.mRawContactId);
 
         assertTrue(lastUpdated > startTime);
 
         // Clean up
-        RawContactUtil.delete(mResolver, rawContactId, true);
+        RawContactUtil.delete(mResolver, ids.mRawContactId, true);
     }
 
     public void testRawContactUpdate_updatesContactUpdatedTimestamp() {
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsProvider2_AccountRemovalTest.java b/tests/tests/provider/src/android/provider/cts/ContactsProvider2_AccountRemovalTest.java
new file mode 100644
index 0000000..f700220
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsProvider2_AccountRemovalTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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 android.provider.cts;
+
+import static android.provider.cts.contacts.DatabaseAsserts.ContactIdPair;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.ContentResolver;
+import android.os.SystemClock;
+import android.provider.cts.contacts.CommonDatabaseUtils;
+import android.provider.cts.contacts.ContactUtil;
+import android.provider.cts.contacts.DataUtil;
+import android.provider.cts.contacts.DatabaseAsserts;
+import android.provider.cts.contacts.DeletedContactUtil;
+import android.provider.cts.contacts.RawContactUtil;
+import android.provider.cts.contacts.account.StaticAccountAuthenticator;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.google.android.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+@MediumTest
+public class ContactsProvider2_AccountRemovalTest extends AndroidTestCase {
+
+    private static long ASYNC_TIMEOUT_LIMIT_MS = 1000 * 60 * 1; // 3 minutes
+    private static long SLEEP_BETWEEN_POLL_MS = 1000 * 10; // 10 seconds
+
+    private static int NOT_MERGED = -1;
+
+    // Not re-using StaticAcountAuthenticator.ACCOUNT_1 because this test may break
+    // other tests running when the account is removed.  No other tests should use the following
+    // accounts.
+    private static final Account ACCT_1 = new Account("cp removal acct 1",
+            StaticAccountAuthenticator.TYPE);
+    private static final Account ACCT_2 = new Account("cp removal acct 2",
+            StaticAccountAuthenticator.TYPE);
+
+    private ContentResolver mResolver;
+    private AccountManager mAccountManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        mAccountManager = AccountManager.get(getContext());
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testAccountRemoval_deletesContacts() {
+        mAccountManager.addAccountExplicitly(ACCT_1, null, null);
+        mAccountManager.addAccountExplicitly(ACCT_2, null, null);
+        ArrayList<ContactIdPair> acc1Ids = createContacts(ACCT_1, 5);
+        ArrayList<ContactIdPair> acc2Ids = createContacts(ACCT_2, 15);
+
+        mAccountManager.removeAccount(ACCT_2, null, null);
+        assertContactsDeletedEventually(System.currentTimeMillis(), acc2Ids);
+
+        mAccountManager.removeAccount(ACCT_1, null, null);
+        assertContactsDeletedEventually(System.currentTimeMillis(), acc1Ids);
+    }
+
+    public void testAccountRemoval_hasDeleteLogsForContacts() {
+        mAccountManager.addAccountExplicitly(ACCT_1, null, null);
+        mAccountManager.addAccountExplicitly(ACCT_2, null, null);
+        ArrayList<ContactIdPair> acc1Ids = createContacts(ACCT_1, 5);
+        ArrayList<ContactIdPair> acc2Ids = createContacts(ACCT_2, 15);
+
+        long start = System.currentTimeMillis();
+        mAccountManager.removeAccount(ACCT_2, null, null);
+        assertContactsInDeleteLogEventually(start, acc2Ids);
+
+        start = System.currentTimeMillis();
+        mAccountManager.removeAccount(ACCT_1, null, null);
+        assertContactsInDeleteLogEventually(start, acc1Ids);
+    }
+
+    /**
+     * Contact has merged raw contacts from a single account.  Contact should be deleted upon
+     * account removal.
+     */
+    public void testAccountRemovalWithMergedContact_deletesContacts() {
+        mAccountManager.addAccountExplicitly(ACCT_1, null, null);
+        ArrayList<ContactIdPair> idList = createAndAssertMergedContact(ACCT_1, ACCT_1);
+        mAccountManager.removeAccount(ACCT_1, null, null);
+        assertContactsDeletedEventually(System.currentTimeMillis(), idList);
+    }
+
+    /**
+     * Contact has merged raw contacts from different accounts. Contact should not be deleted when
+     * one account is removed.  But contact should have last updated timestamp updated.
+     */
+    public void testAccountRemovalWithMergedContact_doesNotDeleteContactAndTimestampUpdated() {
+        mAccountManager.addAccountExplicitly(ACCT_1, null, null);
+        ArrayList<ContactIdPair> idList = createAndAssertMergedContact(ACCT_1, ACCT_2);
+        long contactId = idList.get(0).mContactId;
+
+        long baseTime = ContactUtil.queryContactLastUpdatedTimestamp(mResolver, contactId);
+        long start = System.currentTimeMillis();
+        mAccountManager.removeAccount(ACCT_1, null, null);
+
+        while (ContactUtil.queryContactLastUpdatedTimestamp(mResolver, contactId) == baseTime) {
+            assertWithinTimeoutLimit(start,
+                    "Contact " + contactId + " last updated timestamp has not been updated.");
+            SystemClock.sleep(SLEEP_BETWEEN_POLL_MS);
+        }
+    }
+
+    public void testAccountRemovalWithMergedContact_hasDeleteLogsForContacts() {
+        mAccountManager.addAccountExplicitly(ACCT_1, null, null);
+        ArrayList<ContactIdPair> idList = createAndAssertMergedContact(ACCT_1, ACCT_1);
+        long start = System.currentTimeMillis();
+        mAccountManager.removeAccount(ACCT_1, null, null);
+        assertContactsInDeleteLogEventually(start, idList);
+    }
+
+    private ArrayList<ContactIdPair> createAndAssertMergedContact(Account acct, Account acct2) {
+        ContactIdPair ids1 = DatabaseAsserts.assertAndCreateContactWithName(mResolver, acct,
+                "merge me");
+        DataUtil.insertPhoneNumber(mResolver, ids1.mRawContactId, "555-5555");
+
+        ContactIdPair ids2 = DatabaseAsserts.assertAndCreateContactWithName(mResolver, acct2,
+                "merge me");
+        DataUtil.insertPhoneNumber(mResolver, ids2.mRawContactId, "555-5555");
+
+        // Check merge before continuing. Merge process is async.
+        long mergedContactId = assertMerged(System.currentTimeMillis(), ids1.mRawContactId,
+                ids2.mRawContactId);
+
+        // Update the contact id to the newly merged contact id.
+        ids1.mContactId = mergedContactId;
+        ids2.mContactId = mergedContactId;
+
+        return Lists.newArrayList(ids1, ids2);
+    }
+
+    private long assertMerged(long start, long rawContactId, long rawContactId2) {
+        long contactId = NOT_MERGED;
+        while (contactId == NOT_MERGED) {
+            assertWithinTimeoutLimit(start,
+                    "Raw contact " + rawContactId + " and " + rawContactId2 + " are not merged.");
+
+            SystemClock.sleep(SLEEP_BETWEEN_POLL_MS);
+            contactId = checkMerged(rawContactId, rawContactId2);
+        }
+        return contactId;
+    }
+
+    private long checkMerged(long rawContactId, long rawContactId2) {
+        long contactId = RawContactUtil.queryContactIdByRawContactId(mResolver, rawContactId);
+        long contactId2 = RawContactUtil.queryContactIdByRawContactId(mResolver, rawContactId2);
+        if (contactId == contactId2) {
+            return contactId;
+        }
+        return NOT_MERGED;
+    }
+
+    private void assertContactsInDeleteLogEventually(long start, ArrayList<ContactIdPair> idList) {
+        // Can not use newArrayList() because the version that accepts size is missing.
+        ArrayList<ContactIdPair> remaining = new ArrayList<ContactIdPair>(idList.size());
+        remaining.addAll(idList);
+        while (!remaining.isEmpty()) {
+            // Account cleanup is asynchronous, wait a bit before checking.
+            SystemClock.sleep(SLEEP_BETWEEN_POLL_MS);
+            assertWithinTimeoutLimit(start, "Contacts " + Arrays.toString(remaining.toArray()) +
+                    " are not in delete log after account removal.");
+
+            // Need a second list to remove since we can't remove from the list while iterating.
+            ArrayList<ContactIdPair> toBeRemoved = Lists.newArrayList();
+            for (ContactIdPair ids : remaining) {
+                long deletedTime = DeletedContactUtil.queryDeletedTimestampForContactId(mResolver,
+                        ids.mContactId);
+                if (deletedTime != CommonDatabaseUtils.NOT_FOUND) {
+                    toBeRemoved.add(ids);
+                    assertTrue("Deleted contact was found in delete log but insert time is before"
+                            + " start time", deletedTime > start);
+                }
+            }
+            remaining.removeAll(toBeRemoved);
+        }
+
+        // All contacts in delete log.  Pass.
+    }
+
+    /**
+     * Polls every so often to see if all contacts have been deleted.  If not deleted in the
+     * pre-defined threshold, fails.
+     */
+    private void assertContactsDeletedEventually(long start, ArrayList<ContactIdPair> idList) {
+        // Can not use newArrayList() because the version that accepts size is missing.
+        ArrayList<ContactIdPair> remaining = new ArrayList<ContactIdPair>(idList.size());
+        remaining.addAll(idList);
+        while (!remaining.isEmpty()) {
+            // Account cleanup is asynchronous, wait a bit before checking.
+            SystemClock.sleep(SLEEP_BETWEEN_POLL_MS);
+            assertWithinTimeoutLimit(start, "Contacts have not been deleted after account"
+                    + " removal.");
+
+            ArrayList<ContactIdPair> toBeRemoved = Lists.newArrayList();
+            for (ContactIdPair ids : remaining) {
+                if (!RawContactUtil.rawContactExistsById(mResolver, ids.mRawContactId)) {
+                    toBeRemoved.add(ids);
+                }
+            }
+            remaining.removeAll(toBeRemoved);
+        }
+
+        // All contacts deleted.  Pass.
+    }
+
+    private void assertWithinTimeoutLimit(long start, String message) {
+        long now = System.currentTimeMillis();
+        long elapsed = now - start;
+        if (elapsed > ASYNC_TIMEOUT_LIMIT_MS) {
+            fail(elapsed + "ms has elapsed. The limit is " + ASYNC_TIMEOUT_LIMIT_MS + "ms. " +
+                    message);
+        }
+    }
+
+    /**
+     * Creates a given number of contacts for an account.
+     */
+    private ArrayList<ContactIdPair> createContacts(Account account, int numContacts) {
+        ArrayList<ContactIdPair> accountIds = Lists.newArrayList();
+        for (int i = 0; i < numContacts; i++) {
+            accountIds.add(DatabaseAsserts.assertAndCreateContact(mResolver, account));
+        }
+        return accountIds;
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/contacts/DataUtil.java b/tests/tests/provider/src/android/provider/cts/contacts/DataUtil.java
index ae2812e..1e07450 100644
--- a/tests/tests/provider/src/android/provider/cts/contacts/DataUtil.java
+++ b/tests/tests/provider/src/android/provider/cts/contacts/DataUtil.java
@@ -16,6 +16,8 @@
 
 package android.provider.cts.contacts;
 
+import static android.provider.ContactsContract.CommonDataKinds;
+
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
@@ -36,15 +38,33 @@
         return CommonDatabaseUtils.singleRecordToArray(cursor);
     }
 
-    public static void insertName(ContentResolver resolver, long rawContactId) {
+    public static void insertName(ContentResolver resolver, long rawContactId, String name) {
         ContentValues values = new ContentValues();
         values.put(ContactsContract.Data.MIMETYPE,
-                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
-        values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
-                "test raw contact " + rawContactId);
+                CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
+        values.put(CommonDataKinds.StructuredName.DISPLAY_NAME, name);
         insertData(resolver, rawContactId, values);
     }
 
+    public static long insertPhoneNumber(ContentResolver resolver, long rawContactId,
+            String number) {
+        ContentValues values = new ContentValues();
+        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
+        values.put(CommonDataKinds.Phone.NUMBER, number);
+        return DataUtil.insertData(resolver, rawContactId, values);
+    }
+
+    public static long insertEmail(ContentResolver resolver, long rawContactId, String email) {
+        ContentValues values = new ContentValues();
+        values.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE);
+        values.put(CommonDataKinds.Email.ADDRESS, email);
+        return DataUtil.insertData(resolver, rawContactId, values);
+    }
+
+    public static void insertAutoGeneratedName(ContentResolver resolver, long rawContactId) {
+        insertName(resolver, rawContactId, "test raw contact " + rawContactId);
+    }
+
     public static long insertData(ContentResolver resolver, long rawContactId,
             ContentValues values) {
         // copy
diff --git a/tests/tests/provider/src/android/provider/cts/contacts/DatabaseAsserts.java b/tests/tests/provider/src/android/provider/cts/contacts/DatabaseAsserts.java
index 80a0a65..19b5b13 100644
--- a/tests/tests/provider/src/android/provider/cts/contacts/DatabaseAsserts.java
+++ b/tests/tests/provider/src/android/provider/cts/contacts/DatabaseAsserts.java
@@ -16,10 +16,12 @@
 
 package android.provider.cts.contacts;
 
+import android.accounts.Account;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
+import android.provider.cts.contacts.account.StaticAccountAuthenticator;
 import android.test.MoreAsserts;
 
 import junit.framework.Assert;
@@ -53,12 +55,36 @@
     }
 
     /**
-     * Create a contact and assert that the record exists.
+     * Create a contact in account 1 and assert that the record exists.
      *
      * @return The created contact id pair.
      */
     public static ContactIdPair assertAndCreateContact(ContentResolver resolver) {
-        long rawContactId = RawContactUtil.createRawContactWithName(resolver);
+        return assertAndCreateContact(resolver, StaticAccountAuthenticator.ACCOUNT_1);
+    }
+
+    /**
+     * Create a contact in a specified account and assert that the record exists.
+     *
+     * @return The created contact id pair.
+     */
+    public static ContactIdPair assertAndCreateContactWithName(ContentResolver resolver,
+            Account account, String name) {
+        long rawContactId = RawContactUtil.createRawContactWithName(resolver, account, name);
+
+        long contactId = RawContactUtil.queryContactIdByRawContactId(resolver, rawContactId);
+        MoreAsserts.assertNotEqual(CommonDatabaseUtils.NOT_FOUND, contactId);
+
+        return new ContactIdPair(contactId, rawContactId);
+    }
+
+    /**
+     * Create a contact in a specified account and assert that the record exists.
+     *
+     * @return The created contact id pair.
+     */
+    public static ContactIdPair assertAndCreateContact(ContentResolver resolver, Account account) {
+        long rawContactId = RawContactUtil.createRawContactWithAutoGeneratedName(resolver, account);
 
         long contactId = RawContactUtil.queryContactIdByRawContactId(resolver, rawContactId);
         MoreAsserts.assertNotEqual(CommonDatabaseUtils.NOT_FOUND, contactId);
@@ -94,6 +120,14 @@
             this.mContactId = contactId;
             this.mRawContactId = rawContactId;
         }
+
+        @Override
+        public String toString() {
+            return "ContactIdPair{" +
+                    "mContactId=" + mContactId +
+                    ", mRawContactId=" + mRawContactId +
+                    '}';
+        }
     }
 
     /**
diff --git a/tests/tests/provider/src/android/provider/cts/contacts/RawContactUtil.java b/tests/tests/provider/src/android/provider/cts/contacts/RawContactUtil.java
index c87dc01..38ff33d 100644
--- a/tests/tests/provider/src/android/provider/cts/contacts/RawContactUtil.java
+++ b/tests/tests/provider/src/android/provider/cts/contacts/RawContactUtil.java
@@ -16,13 +16,13 @@
 
 package android.provider.cts.contacts;
 
+import android.accounts.Account;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
 import android.provider.ContactsContract;
-import android.provider.cts.StaticAccountAuthenticator;
 
 import java.util.List;
 
@@ -39,16 +39,24 @@
         resolver.update(uri, values, null, null);
     }
 
-    public static long createRawContactWithName(ContentResolver resolver) {
-        Long rawContactId = insertRawContact(resolver);
-        DataUtil.insertName(resolver, rawContactId);
+    public static long createRawContactWithName(ContentResolver resolver, Account account,
+            String name) {
+        Long rawContactId = insertRawContact(resolver, account);
+        DataUtil.insertName(resolver, rawContactId, name);
         return rawContactId;
     }
 
-    public static long insertRawContact(ContentResolver resolver) {
+    public static long createRawContactWithAutoGeneratedName(ContentResolver resolver,
+            Account account) {
+        Long rawContactId = insertRawContact(resolver, account);
+        DataUtil.insertAutoGeneratedName(resolver, rawContactId);
+        return rawContactId;
+    }
+
+    public static long insertRawContact(ContentResolver resolver, Account account) {
         ContentValues values = new ContentValues();
-        values.put(ContactsContract.RawContacts.ACCOUNT_NAME, StaticAccountAuthenticator.NAME);
-        values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, StaticAccountAuthenticator.TYPE);
+        values.put(ContactsContract.RawContacts.ACCOUNT_NAME, account.name);
+        values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type);
         Uri uri = resolver.insert(URI, values);
         return ContentUris.parseId(uri);
     }
diff --git a/tests/tests/provider/src/android/provider/cts/contacts/account/MockAccountService.java b/tests/tests/provider/src/android/provider/cts/contacts/account/MockAccountService.java
new file mode 100644
index 0000000..33a34b3
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/contacts/account/MockAccountService.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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 android.provider.cts.contacts.account;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * Account service for the authenticator
+ */
+public class MockAccountService extends Service {
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return (new StaticAccountAuthenticator(this)).getIBinder();
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/StaticAccountAuthenticator.java b/tests/tests/provider/src/android/provider/cts/contacts/account/StaticAccountAuthenticator.java
similarity index 91%
rename from tests/tests/provider/src/android/provider/cts/StaticAccountAuthenticator.java
rename to tests/tests/provider/src/android/provider/cts/contacts/account/StaticAccountAuthenticator.java
index d3c9e1d..01db2a1 100644
--- a/tests/tests/provider/src/android/provider/cts/StaticAccountAuthenticator.java
+++ b/tests/tests/provider/src/android/provider/cts/contacts/account/StaticAccountAuthenticator.java
@@ -14,7 +14,7 @@
  * limitations under the License
  */
 
-package android.provider.cts;
+package android.provider.cts.contacts.account;
 
 import android.accounts.AbstractAccountAuthenticator;
 import android.accounts.Account;
@@ -32,7 +32,9 @@
 public class StaticAccountAuthenticator extends AbstractAccountAuthenticator {
 
     public static final String NAME = "test_account_name";
-    public static final String TYPE = "test_account_type";
+    public static final String TYPE = "com.android.cts.contactsprovider";
+    public static final Account ACCOUNT_1 = new Account("cp account 1", TYPE);
+
     private static final String LABEL = "test_auth_token_label";
     private static final String TOKEN = "asdlkjfslkjfdklj";
 
@@ -44,20 +46,12 @@
         sAccountBundle.putString(AccountManager.KEY_AUTHTOKEN, TOKEN);
     }
 
-    private Context mContext;
-
     private static Bundle createResultBundle() {
         return sAccountBundle;
     }
 
-    public void addAccount() {
-        AccountManager.get(mContext).addAccount(TYPE, null, null, null, null, null, null);
-    }
-
     public StaticAccountAuthenticator(Context context) {
         super(context);
-        this.mContext = context;
-        addAccount();
     }
 
     @Override
