diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2da54e9..cacc2be 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -537,10 +537,5 @@
 
         <meta-data android:name="android.nfc.disable_beam_default" android:value="true" />
 
-        <receiver android:name="com.android.contacts.editor.AccountsChangedBroadcastReceiver">
-            <intent-filter>
-                <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED"/>
-            </intent-filter>
-        </receiver>
     </application>
 </manifest>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index ac46a55..d3c4966 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -63,9 +63,6 @@
     <!-- Contacts preferences key for contact editor default account -->
     <string name="contact_editor_default_account_key">ContactEditorUtils_default_account</string>
 
-    <!-- Contacts preferences key for contact editor anything saved -->
-    <string name="contact_editor_anything_saved_key">ContactEditorUtils_anything_saved</string>
-
     <!-- The type of VCard for export. If you want to let the app emit vCard which is
     specific to some vendor (like DoCoMo), specify this type (e.g. "docomo") -->
     <string name="config_export_vcard_type" translatable="false">default</string>
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index 1abbecf..096349c 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -344,15 +344,15 @@
     private void selectAccountAndCreateContact() {
         // If there is no default account or the accounts have changed such that we need to
         // prompt the user again, then launch the account prompt.
-        final ContactEditorUtils editorUtils = ContactEditorUtils.getInstance(this);
+        final ContactEditorUtils editorUtils = ContactEditorUtils.create(this);
         if (editorUtils.shouldShowAccountChangedNotification()) {
             Intent intent = new Intent(this, ContactEditorAccountsChangedActivity.class);
             startActivityForResult(intent, REQUEST_PICK_DEFAULT_ACCOUNT_FOR_NEW_CONTACT);
         } else {
-            // Otherwise, there should be a default account. Then either create a local contact
+            // Otherwise, there should be a default account. Then either create a null contact
             // (if default account is null) or create a contact with the specified account.
-            AccountWithDataSet defaultAccount = editorUtils.getDefaultAccount();
-            createNewRawContact(defaultAccount);
+            final AccountWithDataSet targetAccount = editorUtils.getOnlyOrDefaultAccount();
+            createNewRawContact(targetAccount);
         }
     }
 
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index 9b211ab..c2ec4ac 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -79,7 +79,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mEditorUtils = ContactEditorUtils.getInstance(this);
+        mEditorUtils = ContactEditorUtils.create(this);
         final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this).
                 getAccounts(true);
         final int numAccounts = accounts.size();
@@ -106,7 +106,7 @@
                     AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
             accountListView.setAdapter(mAccountListAdapter);
             accountListView.setOnItemClickListener(mAccountListItemClickListener);
-        } else if (numAccounts == 1 && !accounts.get(0).isLocalAccount()) {
+        } else if (numAccounts == 1 && !accounts.get(0).isNullAccount()) {
             // If the user has 1 writable account we will just show the user a message with 2
             // possible action buttons.
             view = View.inflate(this,
@@ -154,7 +154,7 @@
                 public void onClick(View v) {
                     // Remember that the user wants to create local contacts, so the user is not
                     // prompted again with this activity.
-                    mEditorUtils.saveDefaultAndAllAccounts(null);
+                    mEditorUtils.saveDefaultAccount(AccountWithDataSet.getNullAccount());
                     setResult(RESULT_OK);
                     finish();
                 }
@@ -199,7 +199,7 @@
 
     private void saveAccountAndReturnResult(AccountWithDataSet account) {
         // Save this as the default account
-        mEditorUtils.saveDefaultAndAllAccounts(account);
+        mEditorUtils.saveDefaultAccount(account);
 
         // Pass account info in activity result intent
         Intent intent = new Intent();
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 166222f..5b14966 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -551,7 +551,7 @@
         final ContactListFilter currentFilter = mContactListFilterController.getFilter();
         final AccountWithDataSet accountOfCurrentFilter = new AccountWithDataSet(
                 currentFilter.accountName, currentFilter.accountType, currentFilter.dataSet);
-        return accountOfCurrentFilter.isLocalAccount()
+        return accountOfCurrentFilter.isNullAccount()
                 || (mWritableAccounts != null
                 && mWritableAccounts.contains(accountOfCurrentFilter));
     }
@@ -1007,7 +1007,7 @@
         if (allAccounts.size() > 1) {
             return true;
         }
-        return !allAccounts.get(0).isLocalAccount();
+        return !allAccounts.get(0).isNullAccount();
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
diff --git a/src/com/android/contacts/common/model/account/AccountWithDataSet.java b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
index ecd8f27..187f71c 100644
--- a/src/com/android/contacts/common/model/account/AccountWithDataSet.java
+++ b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
@@ -77,13 +77,11 @@
         mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
     }
 
-    // TODO: consider modifying or deleting this method. "local" accounts on some non-nexus devices
-    // have non-null values for name, type, and dataset
-    public boolean isLocalAccount() {
+    public boolean isNullAccount() {
         return name == null && type == null && dataSet == null;
     }
 
-    public static AccountWithDataSet getLocalAccount() {
+    public static AccountWithDataSet getNullAccount() {
         return new AccountWithDataSet(null, null, null);
     }
 
@@ -126,7 +124,7 @@
     public boolean hasData(Context context) {
         String selection;
         String[] args = null;
-        if (isLocalAccount()) {
+        if (isNullAccount()) {
             selection = LOCAL_ACCOUNT_SELECTION;
         } else {
             final String BASE_SELECTION =
diff --git a/src/com/android/contacts/common/preference/ContactsPreferences.java b/src/com/android/contacts/common/preference/ContactsPreferences.java
index f994d28..f4187eb 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferences.java
@@ -25,10 +25,13 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
+import android.support.annotation.NonNull;
+import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 
 import com.android.contacts.common.R;
@@ -92,18 +95,24 @@
     private ChangeListener mListener = null;
     private Handler mHandler;
     private final SharedPreferences mPreferences;
+    private final boolean mIsDefaultAccountUserChangeable;
     private String mDefaultAccountKey;
-    private String mDefaultAccountSavedKey;
 
     public ContactsPreferences(Context context) {
+        this(context,
+                context.getResources().getBoolean(R.bool.config_default_account_user_changeable));
+    }
+
+    @VisibleForTesting
+    ContactsPreferences(Context context, boolean isDefaultAccountUserChangeable) {
         mContext = context;
-        mHandler = new Handler();
+        mIsDefaultAccountUserChangeable = isDefaultAccountUserChangeable;
+
+        mHandler = new Handler(Looper.getMainLooper());
         mPreferences = mContext.getSharedPreferences(context.getPackageName(),
                 Context.MODE_PRIVATE);
         mDefaultAccountKey = mContext.getResources().getString(
                 R.string.contact_editor_default_account_key);
-        mDefaultAccountSavedKey = mContext.getResources().getString(
-                R.string.contact_editor_anything_saved_key);
         maybeMigrateSystemSettings();
     }
 
@@ -166,7 +175,7 @@
     }
 
     public boolean isDefaultAccountUserChangeable() {
-        return mContext.getResources().getBoolean(R.bool.config_default_account_user_changeable);
+        return mIsDefaultAccountUserChangeable;
     }
 
     public AccountWithDataSet getDefaultAccount() {
@@ -183,16 +192,56 @@
         return mDefaultAccount;
     }
 
-    public void setDefaultAccount(AccountWithDataSet accountWithDataSet) {
-        mDefaultAccount = accountWithDataSet;
-        final Editor editor = mPreferences.edit();
-        if (mDefaultAccount == null) {
-            editor.remove(mDefaultAccountKey);
-        } else {
-            editor.putString(mDefaultAccountKey, accountWithDataSet.stringify());
+    public void clearDefaultAccount() {
+        mDefaultAccount = null;
+        mPreferences.edit().remove(mDefaultAccountKey).commit();
+    }
+
+    public void setDefaultAccount(@NonNull AccountWithDataSet accountWithDataSet) {
+        if (accountWithDataSet == null) {
+            throw new IllegalArgumentException(
+                    "argument should not be null");
         }
-        editor.putBoolean(mDefaultAccountSavedKey, true);
-        editor.commit();
+        mDefaultAccount = accountWithDataSet;
+        mPreferences.edit().putString(mDefaultAccountKey, accountWithDataSet.stringify()).commit();
+    }
+
+    /**
+     * @return false if there is only one writable account or no requirement to return true is met.
+     *         true if the contact editor should show the "accounts changed" notification, that is:
+     *              - If it's the first launch.
+     *              - Or, if the default account has been removed.
+     *              (And some extra sanity check)
+     *
+     * Note if this method returns {@code false}, the caller can safely assume that
+     * {@link #getDefaultAccount} will return a valid account.  (Either an account which still
+     * exists, or {@code null} which should be interpreted as "local only".)
+     */
+    public boolean shouldShowAccountChangedNotification(List<AccountWithDataSet>
+            currentWritableAccounts) {
+        final AccountWithDataSet defaultAccount = getDefaultAccount();
+
+        // This shouldn't occur anymore because a "device" account is added in the case that there
+        // are no other accounts but if there are no writable accounts then the default has been
+        // initialized if it is "device"
+        if (currentWritableAccounts.isEmpty()) {
+            return defaultAccount == null || !defaultAccount.isNullAccount();
+        }
+
+        if (currentWritableAccounts.size() == 1) {
+            return false;
+        }
+
+        if (defaultAccount == null) {
+            return true;
+        }
+
+        if (!currentWritableAccounts.contains(defaultAccount)) {
+            return true;
+        }
+
+        // All good.
+        return false;
     }
 
     public String getContactMetadataSyncAccountName() {
diff --git a/src/com/android/contacts/common/preference/DefaultAccountPreference.java b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
index 3960e62..0fcc8cb 100644
--- a/src/com/android/contacts/common/preference/DefaultAccountPreference.java
+++ b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
@@ -23,6 +23,7 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.AccountsListAdapter;
@@ -31,6 +32,7 @@
     private ContactsPreferences mPreferences;
     private AccountsListAdapter mListAdapter;
     private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
+    private AccountTypeManager mAccountTypeManager;
     private int mChosenIndex = -1;
 
     public DefaultAccountPreference(Context context) {
@@ -53,6 +55,7 @@
         mPreferences = new ContactsPreferences(getContext());
         mListAdapter = new AccountsListAdapter(getContext(),
                 AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
+        mAccountTypeManager = AccountTypeManager.getInstance(getContext());
         mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
     }
 
@@ -64,8 +67,12 @@
     @Override
     public CharSequence getSummary() {
         final AccountWithDataSet defaultAccount = mPreferences.getDefaultAccount();
-        return defaultAccount == null ? null : mAccountDisplayInfoFactory
-                .getAccountDisplayInfo(defaultAccount).getNameLabel();
+        if (defaultAccount == null ||
+                !mAccountTypeManager.getAccounts(/* writable */ true).contains(defaultAccount)) {
+            return null;
+        } else {
+            return mAccountDisplayInfoFactory.getAccountDisplayInfo(defaultAccount).getNameLabel();
+        }
     }
 
     @Override
@@ -86,17 +93,12 @@
     protected void onDialogClosed(boolean positiveResult) {
         final AccountWithDataSet currentDefault = mPreferences.getDefaultAccount();
 
-        if (mChosenIndex == -1) {
-            if (currentDefault != null) {
-                mPreferences.setDefaultAccount(null);
-                notifyChanged();
-            }
-        } else {
+        if (mChosenIndex != -1) {
             final AccountWithDataSet chosenAccount = mListAdapter.getItem(mChosenIndex);
             if (!chosenAccount.equals(currentDefault)) {
                 mPreferences.setDefaultAccount(chosenAccount);
                 notifyChanged();
             }
-        }
+        } // else the user dismissed this dialog so leave the preference unchanged.
     }
 }
diff --git a/src/com/android/contacts/common/util/AccountFilterUtil.java b/src/com/android/contacts/common/util/AccountFilterUtil.java
index b4db48d..88c6bed 100644
--- a/src/com/android/contacts/common/util/AccountFilterUtil.java
+++ b/src/com/android/contacts/common/util/AccountFilterUtil.java
@@ -36,6 +36,7 @@
 import com.android.contacts.common.model.RawContact;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contactsbind.ObjectFactory;
 import com.google.common.collect.Lists;
 
@@ -155,19 +156,6 @@
     }
 
     private static AccountWithDataSet getDefaultAccount(Context context) {
-        final SharedPreferences prefs =
-                context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
-        final String defaultAccountKey =
-                context.getResources().getString(R.string.contact_editor_default_account_key);
-        final String defaultAccountString = prefs.getString(defaultAccountKey, null);
-        if (TextUtils.isEmpty(defaultAccountString)) {
-            return null;
-        }
-        try {
-            return AccountWithDataSet.unstringify(defaultAccountString);
-        } catch (IllegalArgumentException exception) {
-            Log.e(TAG, "Error with retrieving default account " + exception.toString(), exception);
-            return null;
-        }
+        return new ContactsPreferences(context).getDefaultAccount();
     }
 }
diff --git a/src/com/android/contacts/editor/AccountsChangedBroadcastReceiver.java b/src/com/android/contacts/editor/AccountsChangedBroadcastReceiver.java
deleted file mode 100644
index 55300d5..0000000
--- a/src/com/android/contacts/editor/AccountsChangedBroadcastReceiver.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2016 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 com.android.contacts.editor;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-
-import java.util.List;
-
-/**
- * This class is to fix the bug that no prompt is seen for multiple accounts while creating new
- * contacts. By registering a BroadcastReceiver statically, we detect the changes of accounts by
- * receiving the message "android.accounts.LOGIN_ACCOUNTS_CHANGED". If the BroadcastReceiver gets
- * this message, it will get the default account from the SharedPreference and compare current
- * accounts with the default account. At last, it will renew the default account in the
- * SharedPreference if necessary.
- */
-public class AccountsChangedBroadcastReceiver extends BroadcastReceiver {
-    final String TAG = "AccountsChanged";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Context appContext = context.getApplicationContext();
-        final ContactEditorUtils contactEditorUtils = ContactEditorUtils.getInstance(appContext);
-        final String defaultAccountKey = appContext.getResources().getString(
-                R.string.contact_editor_default_account_key);
-        final SharedPreferences pref = appContext.getSharedPreferences(
-                appContext.getPackageName(), Context.MODE_PRIVATE);
-        final String defaultAccountString = pref.getString(defaultAccountKey, null);
-
-        if (!TextUtils.isEmpty(defaultAccountString)) {
-            AccountWithDataSet defaultAccount;
-            try {
-                defaultAccount = AccountWithDataSet.unstringify(defaultAccountString);
-            } catch (IllegalArgumentException e) {
-                Log.e(TAG, "Invalid string in SharedPreference", e);
-                contactEditorUtils.saveDefaultAndAllAccounts(null);
-                return;
-            }
-
-            final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(
-                    appContext);
-            final List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(true);
-            // Delete default account pref if it has been deleted.
-            if (accounts == null || accounts.size() < 1 || !accounts.contains(defaultAccount)) {
-                contactEditorUtils.saveDefaultAndAllAccounts(null);
-            }
-        }
-    }
-}
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index f43d974..40f670a 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -632,7 +632,7 @@
         mIsUserProfile = isUserProfile;
         mPrimaryAccount = primaryAccount;
         if (mPrimaryAccount == null) {
-            mPrimaryAccount = ContactEditorUtils.getInstance(getContext()).getDefaultAccount();
+            mPrimaryAccount = ContactEditorUtils.create(getContext()).getOnlyOrDefaultAccount();
         }
         vlog("state: primary " + mPrimaryAccount);
 
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 05f6c47..46e6a84 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -58,7 +58,6 @@
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
-import com.android.contacts.activities.CompactContactEditorActivity;
 import com.android.contacts.activities.ContactEditorAccountsChangedActivity;
 import com.android.contacts.activities.ContactEditorBaseActivity;
 import com.android.contacts.activities.ContactEditorBaseActivity.ContactEditor;
@@ -472,7 +471,7 @@
     public void onAttach(Activity activity) {
         super.onAttach(activity);
         mContext = activity;
-        mEditorUtils = ContactEditorUtils.getInstance(mContext);
+        mEditorUtils = ContactEditorUtils.create(mContext);
         mComparator = new RawContactDeltaComparator(mContext);
     }
 
@@ -1117,7 +1116,7 @@
         } else {
             // Otherwise, there should be a default account. Then either create a local contact
             // (if default account is null) or create a contact with the specified account.
-            AccountWithDataSet defaultAccount = mEditorUtils.getDefaultAccount();
+            final AccountWithDataSet defaultAccount = mEditorUtils.getOnlyOrDefaultAccount();
             createContact(defaultAccount);
         }
     }
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index b976456..3f1a8cb 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -21,16 +21,13 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.text.TextUtils;
-import android.util.Log;
 
-import com.android.contacts.common.R;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 
 import java.util.ArrayList;
@@ -43,18 +40,8 @@
 public class ContactEditorUtils {
     private static final String TAG = "ContactEditorUtils";
 
-    private static final String KEY_KNOWN_ACCOUNTS = "ContactEditorUtils_known_accounts";
-
-    private static final List<AccountWithDataSet> EMPTY_ACCOUNTS = ImmutableList.of();
-
-    private static ContactEditorUtils sInstance;
-
-    private final Context mContext;
-    private final SharedPreferences mPrefs;
+    private final ContactsPreferences mContactsPrefs;
     private final AccountTypeManager mAccountTypes;
-    private final String mDefaultAccountKey;
-    // Key to tell the first time launch.
-    private final String mAnythingSavedKey;
 
     private ContactEditorUtils(Context context) {
         this(context, AccountTypeManager.getInstance(context));
@@ -62,37 +49,20 @@
 
     @VisibleForTesting
     ContactEditorUtils(Context context, AccountTypeManager accountTypes) {
-        mContext = context.getApplicationContext();
-        mPrefs = mContext.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
+        mContactsPrefs = new ContactsPreferences(context);
         mAccountTypes = accountTypes;
-        mDefaultAccountKey = mContext.getResources().getString(
-                R.string.contact_editor_default_account_key);
-        mAnythingSavedKey = mContext.getResources().getString(
-                R.string.contact_editor_anything_saved_key);
     }
 
-    public static synchronized ContactEditorUtils getInstance(Context context) {
-        if (sInstance == null) {
-            sInstance = new ContactEditorUtils(context.getApplicationContext());
-        }
-        return sInstance;
+    public static ContactEditorUtils create(Context context) {
+        return new ContactEditorUtils(context.getApplicationContext());
     }
 
     void cleanupForTest() {
-        mPrefs.edit().remove(mDefaultAccountKey).remove(KEY_KNOWN_ACCOUNTS)
-                .remove(mAnythingSavedKey).apply();
+        mContactsPrefs.clearDefaultAccount();
     }
 
     void removeDefaultAccountForTest() {
-        mPrefs.edit().remove(mDefaultAccountKey).apply();
-    }
-
-    /**
-     * Sets the {@link #KEY_KNOWN_ACCOUNTS} and {@link #mDefaultAccountKey} preference values to
-     * empty strings to reset the state of the preferences file.
-     */
-    private void resetPreferenceValues() {
-        mPrefs.edit().putString(KEY_KNOWN_ACCOUNTS, "").putString(mDefaultAccountKey, "").apply();
+        mContactsPrefs.clearDefaultAccount();
     }
 
     private List<AccountWithDataSet> getWritableAccounts() {
@@ -100,140 +70,39 @@
     }
 
     /**
-     * @return true if it's the first launch and {@link #saveDefaultAndAllAccounts} has never
-     *     been called.
-     */
-    private boolean isFirstLaunch() {
-        return !mPrefs.getBoolean(mAnythingSavedKey, false);
-    }
-
-    /**
-     * Saves all writable accounts and the default account, which can later be obtained
-     * with {@link #getDefaultAccount}.
+     * Saves the default account, which can later be obtained with {@link #getOnlyOrDefaultAccount}.
      *
      * This should be called when saving a newly created contact.
      *
      * @param defaultAccount the account used to save a newly created contact.
      */
-    public void saveDefaultAndAllAccounts(AccountWithDataSet defaultAccount) {
-        final SharedPreferences.Editor editor = mPrefs.edit()
-                .putBoolean(mAnythingSavedKey, true);
-
+    public void saveDefaultAccount(AccountWithDataSet defaultAccount) {
         if (defaultAccount == null) {
-            editor.remove(KEY_KNOWN_ACCOUNTS);
-            editor.remove(mDefaultAccountKey);
+            mContactsPrefs.clearDefaultAccount();
         } else {
-            editor.putString(KEY_KNOWN_ACCOUNTS,
-                    AccountWithDataSet.stringifyList(getWritableAccounts()));
-            editor.putString(mDefaultAccountKey, defaultAccount.stringify());
+            mContactsPrefs.setDefaultAccount(defaultAccount);
         }
-        editor.apply();
     }
 
     /**
-     * @return the default account saved with {@link #saveDefaultAndAllAccounts}.
+     * @return the first account if there is only a single account or the default account saved
+     * with {@link #saveDefaultAccount}.
      *
-     * Note the {@code null} return value can mean either {@link #saveDefaultAndAllAccounts} has
-     * never been called, or {@code null} was passed to {@link #saveDefaultAndAllAccounts} --
-     * i.e. the user selected "local only".
+     * A null return value indicates that there is multiple accounts and a default hasn't been set
      *
      * Also note that the returned account may have been removed already.
      */
-    public AccountWithDataSet getDefaultAccount() {
+    public AccountWithDataSet getOnlyOrDefaultAccount() {
         final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
         if (currentWritableAccounts.size() == 1) {
             return currentWritableAccounts.get(0);
         }
 
-        final String saved = mPrefs.getString(mDefaultAccountKey, null);
-        if (TextUtils.isEmpty(saved)) {
-            return null;
-        }
-        try {
-            return AccountWithDataSet.unstringify(saved);
-        } catch (IllegalArgumentException exception) {
-            Log.e(TAG, "Error with retrieving default account " + exception.toString());
-            // unstringify()can throw an exception if the string is not in an expected format.
-            // Hence, if the preferences file is corrupt, just reset the preference values
-            resetPreferenceValues();
-            return null;
-        }
+        return mContactsPrefs.getDefaultAccount();
     }
 
-    /**
-     * @return true if an account still exists.  {@code null} is considered "local only" here,
-     *    so it's valid too.
-     */
-    @VisibleForTesting
-    boolean isValidAccount(AccountWithDataSet account) {
-        if (account == null || account.isLocalAccount()) {
-            return true; // It's "local only" account, which is valid.
-        }
-        return getWritableAccounts().contains(account);
-    }
-
-    /**
-     * @return saved known accounts, or an empty list if none has been saved yet.
-     */
-    @VisibleForTesting
-    List<AccountWithDataSet> getSavedAccounts() {
-        final String saved = mPrefs.getString(KEY_KNOWN_ACCOUNTS, null);
-        if (TextUtils.isEmpty(saved)) {
-            return EMPTY_ACCOUNTS;
-        }
-        try {
-            return AccountWithDataSet.unstringifyList(saved);
-        } catch (IllegalArgumentException exception) {
-            Log.e(TAG, "Error with retrieving saved accounts " + exception.toString());
-            // unstringifyList()can throw an exception if the string is not in an expected format.
-            // Hence, if the preferences file is corrupt, just reset the preference values
-            resetPreferenceValues();
-            return EMPTY_ACCOUNTS;
-        }
-    }
-
-    /**
-     * @return false if there is only one writable account or no requirement to return true is met.
-     *         true if the contact editor should show the "accounts changed" notification, that is:
-     *              - If it's the first launch.
-     *              - Or, if the default account has been removed.
-     *              (And some extra sanity check)
-     *
-     * Note if this method returns {@code false}, the caller can safely assume that
-     * {@link #getDefaultAccount} will return a valid account.  (Either an account which still
-     * exists, or {@code null} which should be interpreted as "local only".)
-     */
     public boolean shouldShowAccountChangedNotification() {
-        final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
-
-        if (currentWritableAccounts.size() == 1) {
-            // TODO: This will only work for devices that use a null device account but it should
-            // probably should notify for other OEM device account types as well.
-            return isFirstLaunch() && currentWritableAccounts.get(0).isLocalAccount();
-        }
-
-        if (isFirstLaunch()) {
-            return true;
-        }
-
-        final AccountWithDataSet defaultAccount = getDefaultAccount();
-
-        // Does default account still exist?
-        if (!isValidAccount(defaultAccount)) {
-            return true;
-        }
-
-        // If there is an inconsistent state in the preferences file then show the notification
-        // dialog. This shouldn't ever happen, but this should allow the user can get back into a
-        // normal state after they respond to the notification.
-        if (defaultAccount == null) {
-            Log.e(TAG, "Preferences file in an inconsistent state, request that the default account"
-                    + " and current writable accounts be saved again");
-            return true;
-        }
-
-        // All good.
-        return false;
+        return mContactsPrefs.shouldShowAccountChangedNotification(getWritableAccounts());
     }
 
     @VisibleForTesting
diff --git a/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java b/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
index 7bfb922..9339063 100644
--- a/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
+++ b/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
@@ -59,11 +59,11 @@
     }
 
     public void testStringifyAndUnstringifyLocalAccount() {
-        final String stringified = AccountWithDataSet.getLocalAccount().stringify();
+        final String stringified = AccountWithDataSet.getNullAccount().stringify();
 
         final AccountWithDataSet restored = AccountWithDataSet.unstringify(stringified);
 
-        assertEquals(AccountWithDataSet.getLocalAccount(), restored);
+        assertEquals(AccountWithDataSet.getNullAccount(), restored);
     }
 
     public void testStringifyListAndUnstringify() {
diff --git a/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java b/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
index 4b5c300..e73eb4c 100644
--- a/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
+++ b/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
@@ -30,6 +30,8 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
+import java.util.Arrays;
+
 @SmallTest
 public class ContactsPreferencesTest extends InstrumentationTestCase {
 
@@ -133,9 +135,8 @@
     }
 
     public void testRefreshDefaultAccount() throws InterruptedException {
-        Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
-                true // R.bool.config_default_account_user_changeable
-        );
+        mContactsPreferences = new ContactsPreferences(mContext,
+                /* isDefaultAccountUserChangeable */ true);
 
         Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
                 .thenReturn(new AccountWithDataSet("name1", "type1", "dataset1").stringify(),
@@ -148,4 +149,46 @@
         Assert.assertEquals(new AccountWithDataSet("name2", "type2", "dataset2"),
                 mContactsPreferences.getDefaultAccount());
     }
+
+    public void testShouldShowAccountChangedNotificationIfAccountNotSaved() {
+        mContactsPreferences = new ContactsPreferences(mContext,
+                /* isDefaultAccountUserChangeable */ true);
+        Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
+                .thenReturn(null);
+
+        assertTrue("Should prompt to change default if no default is saved",
+                mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
+                        new AccountWithDataSet("name1", "type1", "dataset1"),
+                        new AccountWithDataSet("name2", "type2", "dataset2"))));
+    }
+
+    public void testShouldShowAccountChangedNotification() {
+        mContactsPreferences = new ContactsPreferences(mContext,
+                /* isDefaultAccountUserChangeable */ true);
+        Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
+                .thenReturn(new AccountWithDataSet("name", "type", "dataset").stringify());
+
+        assertFalse("Should not prompt to change default if current default exists",
+                mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
+                        new AccountWithDataSet("name", "type", "dataset"),
+                        new AccountWithDataSet("name1", "type1", "dataset1"))));
+
+        assertTrue("Should prompt to change default if current default does not exist",
+                mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
+                        new AccountWithDataSet("name1", "type1", "dataset1"),
+                        new AccountWithDataSet("name2", "type2", "dataset2"))));
+    }
+
+    public void testShouldShowAccountChangedNotificationWhenThereIsOneAccount() {
+        mContactsPreferences = new ContactsPreferences(mContext,
+                /* isDefaultAccountUserChangeable */ true);
+        Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
+                .thenReturn(null);
+
+        // Normally we would prompt because there is no default set but if there is just one
+        // account we should just use it.
+        assertFalse("Should not prompt to change default if there is only one account available",
+                mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
+                        new AccountWithDataSet("name", "type", "dataset"))));
+    }
 }
diff --git a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
index b5df8c9..525a85c 100644
--- a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
@@ -111,63 +111,18 @@
 
     /**
      * Test for
-     * - {@link ContactEditorUtils#saveDefaultAndAllAccounts}
-     * - {@link ContactEditorUtils#getDefaultAccount}
-     * - {@link ContactEditorUtils#getSavedAccounts()}
+     * - {@link ContactEditorUtils#saveDefaultAccount}
+     * - {@link ContactEditorUtils#getOnlyOrDefaultAccount}
      */
-    public void testSaveDefaultAndAllAccounts() {
+    public void testSaveDefaultAccount() {
         // Use these account types here.
         setAccountTypes(TYPE1, TYPE2);
 
-        // If none has been saved, it should return an empty list.
-        assertEquals(0, mTarget.getSavedAccounts().size());
+        mTarget.saveDefaultAccount(null);
+        assertNull(mTarget.getOnlyOrDefaultAccount());
 
-        // Save 0 accounts.
-        mAccountTypes.mAccounts = new AccountWithDataSet[]{};
-        mTarget.saveDefaultAndAllAccounts(null);
-        assertNull(mTarget.getDefaultAccount());
-        MoreAsserts.assertEquals(
-                Sets.newHashSet(mAccountTypes.mAccounts),
-                toSet(mTarget.getSavedAccounts()));
-
-        // 1 account
-        mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A};
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A);
-        assertEquals(ACCOUNT_1_A, mTarget.getDefaultAccount());
-        MoreAsserts.assertEquals(
-                Sets.newHashSet(mAccountTypes.mAccounts),
-                toSet(mTarget.getSavedAccounts()));
-
-        // 2 accounts
-        mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A, ACCOUNT_1_B};
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_B);
-        assertEquals(ACCOUNT_1_B, mTarget.getDefaultAccount());
-        MoreAsserts.assertEquals(
-                Sets.newHashSet(mAccountTypes.mAccounts),
-                toSet(mTarget.getSavedAccounts()));
-
-        // 2 accounts, and save null as the default.  Even though there are accounts, the saved
-        // account list should be empty in this case.
-        mTarget.saveDefaultAndAllAccounts(null);
-        assertNull(mTarget.getDefaultAccount());
-        assertEquals(0, mTarget.getSavedAccounts().size());
-    }
-
-    public void testIsAccountValid() {
-        // Use these account types here.
-        setAccountTypes(TYPE1, TYPE2);
-
-        // 0 accounts
-        mAccountTypes.mAccounts = new AccountWithDataSet[]{};
-        assertFalse(mTarget.isValidAccount(ACCOUNT_1_A));
-        assertTrue(mTarget.isValidAccount(null)); // null is always valid
-
-        // 2 accounts
-        mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A, ACCOUNT_2_A};
-        assertTrue(mTarget.isValidAccount(ACCOUNT_1_A));
-        assertTrue(mTarget.isValidAccount(ACCOUNT_2_A));
-        assertFalse(mTarget.isValidAccount(ACCOUNT_2EX_A));
-        assertTrue(mTarget.isValidAccount(null)); // null is always valid
+        mTarget.saveDefaultAccount(ACCOUNT_1_A);
+        assertEquals(ACCOUNT_1_A, mTarget.getOnlyOrDefaultAccount());
     }
 
     /**
@@ -186,7 +141,7 @@
         // Now we open the contact editor with the new account.
 
         // When closing the editor, we save the default account.
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A);
+        mTarget.saveDefaultAccount(ACCOUNT_1_A);
 
         // Next time the user creates a contact, we don't show the notification.
         assertFalse(mTarget.shouldShowAccountChangedNotification());
@@ -198,7 +153,7 @@
         assertFalse(mTarget.shouldShowAccountChangedNotification());
 
         // User saved a new contact.  We update the account list and the default account.
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_B);
+        mTarget.saveDefaultAccount(ACCOUNT_1_B);
 
         // User created another contact.  Now we don't show the notification.
         assertFalse(mTarget.shouldShowAccountChangedNotification());
@@ -214,7 +169,7 @@
         assertFalse(mTarget.shouldShowAccountChangedNotification());
 
         // User saves a new contact, with a different default account.
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_2_A);
+        mTarget.saveDefaultAccount(ACCOUNT_2_A);
 
         // Next time user creates a contact, no notification.
         assertFalse(mTarget.shouldShowAccountChangedNotification());
@@ -253,7 +208,7 @@
         assertFalse(mTarget.shouldShowAccountChangedNotification());
 
         // User saves a new contact.
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A);
+        mTarget.saveDefaultAccount(ACCOUNT_1_A);
 
         // Next time, no notification.
         assertFalse(mTarget.shouldShowAccountChangedNotification());
@@ -272,7 +227,7 @@
         assertTrue(mTarget.shouldShowAccountChangedNotification());
 
         // We show the notification here, and user clicked "keep local" and saved an contact.
-        mTarget.saveDefaultAndAllAccounts(AccountWithDataSet.getLocalAccount());
+        mTarget.saveDefaultAccount(AccountWithDataSet.getNullAccount());
 
         // Now there are no accounts, and default account is null.
 
@@ -285,7 +240,7 @@
         setAccountTypes(TYPE1);
         setAccounts(ACCOUNT_1_A);
 
-        mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A);
+        mTarget.saveDefaultAccount(ACCOUNT_1_A);
 
         // Right after a save, the dialog shouldn't show up.
         assertFalse(mTarget.shouldShowAccountChangedNotification());
diff --git a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
index e68511f..aa3f725 100644
--- a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
@@ -122,7 +122,7 @@
     }
 
   public void testGetAccountInfo_AccountType_DeviceAccount() {
-      final AccountWithDataSet deviceAccount = AccountWithDataSet.getLocalAccount();
+      final AccountWithDataSet deviceAccount = AccountWithDataSet.getNullAccount();
       final AccountDisplayInfo account = new AccountDisplayInfo(deviceAccount, "Device",
               "Device", /*icon*/ null, /*isDeviceAccount*/ true);
 
