diff --git a/tests/src/com/android/contacts/activities/SimImportActivityTest.java b/tests/src/com/android/contacts/activities/SimImportActivityTest.java
index 64b86e2..46b5f40 100644
--- a/tests/src/com/android/contacts/activities/SimImportActivityTest.java
+++ b/tests/src/com/android/contacts/activities/SimImportActivityTest.java
@@ -68,6 +68,7 @@
 import com.google.common.util.concurrent.SettableFuture;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -120,6 +121,12 @@
         }
     }
 
+    @AfterClass
+    public static void tearDownClass() {
+        AccountsTestHelper.removeAccountsWithPrefix(
+                InstrumentationRegistry.getTargetContext(), "SimImportActivity");
+    }
+
     @Test
     public void shouldDisplaySimContacts() {
         mDao.addSim(someSimCard(),
@@ -214,7 +221,7 @@
         AccountTypeManager.setInstanceForTest(null);
 
         final AccountWithDataSet targetAccount = mAccountHelper.addTestAccount(
-                mAccountHelper.generateAccountName("SimImportActivity_target_"));
+                mAccountHelper.generateAccountName("SimImportActivity0_targetAccount_"));
 
         final MockContentProvider iccProvider = new MockContentProvider();
         iccProvider.expect(MockContentProvider.Query.forAnyUri())
@@ -252,7 +259,7 @@
         assertTrue(mDevice.wait(Until.hasObject(By.desc("Show more")), TIMEOUT));
 
         mDevice.findObject(By.desc("Show more")).clickAndWait(Until.newWindow(), TIMEOUT);
-        mDevice.findObject(By.textStartsWith("SimImportActivity_target_")).click();
+        mDevice.findObject(By.textContains("_targetAccount_")).click();
 
         assertTrue(mDevice.wait(Until.hasObject(By.text("Skip Two")), TIMEOUT));
 
diff --git a/tests/src/com/android/contacts/tests/AccountsTestHelper.java b/tests/src/com/android/contacts/tests/AccountsTestHelper.java
index be0a985..2b2c16e 100644
--- a/tests/src/com/android/contacts/tests/AccountsTestHelper.java
+++ b/tests/src/com/android/contacts/tests/AccountsTestHelper.java
@@ -45,7 +45,6 @@
     private final ContentResolver mResolver;
 
     private List<Account> mAddedAccounts;
-    private Account mTestAccount;
 
     public AccountsTestHelper() {
         // Use context instead of target context because the test package has the permissions needed
@@ -61,9 +60,9 @@
     }
 
     public void addTestAccount(AccountWithDataSet account) {
-        mTestAccount = new Account(account.name, TEST_ACCOUNT_TYPE);
-        assertTrue(mAccountManager.addAccountExplicitly(mTestAccount, null, null));
-        mAddedAccounts.add(mTestAccount);
+        Account newAccount = new Account(account.name, account.type);
+        assertTrue(mAccountManager.addAccountExplicitly(newAccount, null, null));
+        mAddedAccounts.add(newAccount);
     }
 
     public AccountWithDataSet addTestAccount() {
@@ -104,11 +103,6 @@
         return accounts.contains(new Account(name, TEST_ACCOUNT_TYPE));
     }
 
-    public void removeContactsForAccount() {
-        removeContactsForAccount(
-                new AccountWithDataSet(mTestAccount.name, mTestAccount.type, null));
-    }
-
     public void removeContactsForAccount(AccountWithDataSet account) {
         mResolver.delete(RawContacts.CONTENT_URI,
                 RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?",
@@ -117,8 +111,6 @@
 
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
     public void cleanup() {
-        assertNotNull(mTestAccount);
-
         // Note that we don't need to cleanup up the contact data associated with the account.
         // CP2 will eventually do that automatically so as long as we're using unique account
         // names we should be safe. Note that cleanup is not done synchronously when the account
@@ -129,11 +121,19 @@
             mAccountManager.removeAccountExplicitly(account);
         }
         mAddedAccounts.clear();
-
-        mTestAccount = null;
     }
 
-    private AccountWithDataSet convertTestAccount() {
-        return new AccountWithDataSet(mTestAccount.name, mTestAccount.type, null);
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
+    public static void removeAccountsWithPrefix(Context context, String prefix) {
+        final AccountManager accountManager =
+                (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
+        final Account[] accounts = accountManager.getAccountsByType(TEST_ACCOUNT_TYPE);
+        for (Account account : accounts) {
+            if (account.name.startsWith(prefix)) {
+                accountManager.removeAccountExplicitly(account);
+            }
+        }
+
+
     }
 }
