diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index be583b0..c9153e1 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -76,8 +76,10 @@
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.model.ValuesDelta;
+import com.android.contacts.model.account.AccountInfo;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.model.account.AccountsLoader;
 import com.android.contacts.preference.ContactsPreferences;
 import com.android.contacts.quickcontact.InvisibleContactUtil;
 import com.android.contacts.quickcontact.QuickContactActivity;
@@ -95,6 +97,7 @@
 
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -114,6 +117,7 @@
 
     private static final int LOADER_CONTACT = 1;
     private static final int LOADER_GROUPS = 2;
+    private static final int LOADER_ACCOUNTS = 3;
 
     private static final String KEY_PHOTO_RAW_CONTACT_ID = "photo_raw_contact_id";
     private static final String KEY_UPDATED_PHOTOS = "updated_photos";
@@ -342,6 +346,7 @@
     // Whether to show the new contact blank form and if it's corresponding delta is ready.
     protected boolean mHasNewContact;
     protected AccountWithDataSet mAccountWithDataSet;
+    protected List<AccountInfo> mWritableAccounts = Collections.emptyList();
     protected boolean mNewContactDataReady;
     protected boolean mNewContactAccountChanged;
 
@@ -430,6 +435,48 @@
                 }
             };
 
+    protected LoaderManager.LoaderCallbacks<List<AccountInfo>> mAccountsLoaderListener =
+            new LoaderManager.LoaderCallbacks<List<AccountInfo>>() {
+                @Override
+                public Loader<List<AccountInfo>> onCreateLoader(int id, Bundle args) {
+                    return new AccountsLoader(getActivity(), AccountTypeManager.writableFilter());
+                }
+
+                @Override
+                public void onLoadFinished(
+                        Loader<List<AccountInfo>> loader, List<AccountInfo> data) {
+                    mWritableAccounts = data;
+
+                    final RawContactEditorView view = getContent();
+                    if (view == null) {
+                        return;
+                    }
+                    view.setAccounts(data);
+                    if (mAccountWithDataSet == null && view.getCurrentRawContactDelta() == null) {
+                        return;
+                    }
+
+                    final AccountWithDataSet account = mAccountWithDataSet != null
+                            ? mAccountWithDataSet
+                            : view.getCurrentRawContactDelta().getAccountWithDataSet();
+
+                    // The current account was removed
+                    if (!AccountInfo.contains(data, account) && !data.isEmpty()) {
+                        if (isReadyToBindEditors()) {
+                            onRebindEditorsForNewContact(getContent().getCurrentRawContactDelta(),
+                                    account, data.get(0).getAccount());
+                        } else {
+                            mAccountWithDataSet = data.get(0).getAccount();
+                        }
+                    }
+                }
+
+                @Override
+                public void onLoaderReset(Loader<List<AccountInfo>> loader) {
+                }
+            };
+
+
     private long mPhotoRawContactId;
     private Bundle mUpdatedPhotos = new Bundle();
 
@@ -520,6 +567,10 @@
 
         validateAction(mAction);
 
+        if (!Intent.ACTION_EDIT.equals(mAction)) {
+            getLoaderManager().initLoader(LOADER_ACCOUNTS, null, mAccountsLoaderListener);
+        }
+
         if (mState.isEmpty()) {
             // The delta list may not have finished loading before orientation change happens.
             // In this case, there will be a saved state but deltas will be missing.  Reload from
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 0810ab8..23c7fa0 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -50,6 +50,7 @@
 import com.android.contacts.R;
 import com.android.contacts.model.ValuesDelta;
 import com.android.contacts.model.account.AccountDisplayInfo;
+import com.android.contacts.model.account.AccountInfo;
 import com.android.contacts.model.dataitem.DataKind;
 import com.android.contacts.util.ContactPhotoUtils;
 import com.android.contacts.util.MaterialColorMapUtils.MaterialPalette;
@@ -112,12 +113,12 @@
 
 
     public static String getAccountHeaderLabelForMyProfile(Context context,
-            AccountDisplayInfo displayableAccount) {
-        if (displayableAccount.isDeviceAccount()) {
+            AccountInfo accountInfo) {
+        if (accountInfo.isDeviceAccount()) {
             return context.getString(R.string.local_profile_title);
         } else {
             return context.getString(R.string.external_profile_title,
-                    displayableAccount.getTypeLabel());
+                    accountInfo.getTypeLabel());
         }
     }
 
diff --git a/src/com/android/contacts/editor/PickRawContactDialogFragment.java b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
index 93b9932..d894371 100644
--- a/src/com/android/contacts/editor/PickRawContactDialogFragment.java
+++ b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
@@ -27,6 +27,7 @@
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.account.AccountDisplayInfo;
 import com.android.contacts.model.account.AccountDisplayInfoFactory;
+import com.android.contacts.model.account.AccountInfo;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountWithDataSet;
 import com.android.contacts.model.account.GoogleAccountType;
@@ -114,12 +115,12 @@
 
             // Use the same string as editor if it's an editable user profile raw contact.
             if (mRawContactsMetadata.isUserProfile && account.areContactsWritable()) {
-                final AccountDisplayInfo displayInfo =
-                        mAccountDisplayInfoFactory.getAccountDisplayInfo(
+                final AccountInfo accountInfo =
+                        AccountTypeManager.getInstance(getContext()).getAccountInfoForAccount(
                                 new AccountWithDataSet(rawContact.accountName,
                                         rawContact.accountType, rawContact.accountDataSet));
                 accountDisplayLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(mContext,
-                        displayInfo);
+                        accountInfo);
             } else if (GoogleAccountType.ACCOUNT_TYPE.equals(rawContact.accountType)
                     && account.dataSet == null) {
                 // Focus Google accounts have the account name shown
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 4711bcb..450d8c0 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -60,6 +60,7 @@
 import com.android.contacts.model.ValuesDelta;
 import com.android.contacts.model.account.AccountDisplayInfo;
 import com.android.contacts.model.account.AccountDisplayInfoFactory;
+import com.android.contacts.model.account.AccountInfo;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountWithDataSet;
 import com.android.contacts.model.dataitem.CustomDataItem;
@@ -71,6 +72,7 @@
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -196,7 +198,6 @@
     private RawContactEditorView.Listener mListener;
 
     private AccountTypeManager mAccountTypeManager;
-    private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
     private LayoutInflater mLayoutInflater;
 
     private ViewIdGenerator mViewIdGenerator;
@@ -204,6 +205,7 @@
     private boolean mHasNewContact;
     private boolean mIsUserProfile;
     private AccountWithDataSet mPrimaryAccount;
+    private List<AccountInfo> mAccounts = new ArrayList<>();
     private RawContactDeltaList mRawContactDeltas;
     private RawContactDelta mCurrentRawContactDelta;
     private long mRawContactIdToDisplayAlone = -1;
@@ -248,7 +250,6 @@
         super.onFinishInflate();
 
         mAccountTypeManager = AccountTypeManager.getInstance(getContext());
-        mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
         mLayoutInflater = (LayoutInflater)
                 getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
@@ -499,6 +500,13 @@
         if (mListener != null) mListener.onEditorsBound();
     }
 
+    public void setAccounts(List<AccountInfo> accounts) {
+        mAccounts.clear();
+        mAccounts.addAll(accounts);
+        // Update the account header
+        setAccountInfo();
+    }
+
     private void setupEditorNormally() {
         addKindSectionViews();
 
@@ -711,8 +719,19 @@
     }
 
     private void setAccountInfo() {
-        final AccountDisplayInfo account =
-                mAccountDisplayInfoFactory.getAccountDisplayInfoFor(mCurrentRawContactDelta);
+        if (mCurrentRawContactDelta == null && mPrimaryAccount == null) {
+            return;
+        }
+        final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(getContext());
+        final AccountInfo account = mCurrentRawContactDelta != null
+                ? accountTypeManager.getAccountInfoForAccount(
+                mCurrentRawContactDelta.getAccountWithDataSet())
+                : accountTypeManager.getAccountInfoForAccount(mPrimaryAccount);
+
+        // Accounts haven't loaded yet or we are editing.
+        if (mAccounts.isEmpty()) {
+            mAccounts.add(account);
+        }
 
         // Get the account information for the primary raw contact delta
         if (isReadOnlyRawContact()) {
@@ -729,9 +748,7 @@
         }
 
         // If we're saving a new contact and there are multiple accounts, add the account selector.
-        final List<AccountWithDataSet> accounts =
-                AccountTypeManager.getInstance(getContext()).getAccounts(true);
-        if (mHasNewContact && !mIsUserProfile && accounts.size() > 1) {
+        if (mHasNewContact && !mIsUserProfile && mAccounts.size() > 1) {
             addAccountSelector(mCurrentRawContactDelta);
         }
     }
@@ -756,11 +773,11 @@
         final OnClickListener clickListener = new OnClickListener() {
             @Override
             public void onClick(View v) {
+                final AccountWithDataSet current = rawContactDelta.getAccountWithDataSet();
+                AccountInfo.sortAccounts(current, mAccounts);
                 final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
                 final AccountsListAdapter adapter =
-                        new AccountsListAdapter(getContext(),
-                                AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
-                                mPrimaryAccount);
+                        new AccountsListAdapter(getContext(), mAccounts, current);
                 popup.setWidth(mAccountHeaderContainer.getWidth());
                 popup.setAnchorView(mAccountHeaderContainer);
                 popup.setAdapter(adapter);
diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java
index fa8d6e2..434d10b 100644
--- a/src/com/android/contacts/model/AccountTypeManager.java
+++ b/src/com/android/contacts/model/AccountTypeManager.java
@@ -599,6 +599,9 @@
 
     @Override
     public AccountInfo getAccountInfoForAccount(AccountWithDataSet account) {
+        if (account == null) {
+            return null;
+        }
         final AccountType type = mTypeProvider.getTypeForAccount(account);
         if (type == null) {
             return null;
diff --git a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
index b42308d..9eea4d1 100644
--- a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
@@ -26,8 +26,11 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.account.AccountDisplayInfo;
+import com.android.contacts.model.account.AccountInfo;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.model.account.DeviceLocalAccountType;
+import com.android.contacts.tests.FakeAccountType;
 
 /**
  * Tests {@link EditorUiUtils}.
@@ -73,8 +76,9 @@
     }
 
     public void testGetProfileAccountInfo_NonLocalAccount() {
-        final AccountDisplayInfo account = new AccountDisplayInfo(ACCOUNT, ACCOUNT_NAME,
-                DISPLAY_LABEL, /*icon*/ null, /*isDeviceAccount*/ false);
+        final AccountInfo account = new AccountInfo(new AccountDisplayInfo(ACCOUNT, ACCOUNT_NAME,
+                DISPLAY_LABEL, null, /* isDeviceAccount */ false),
+                new FakeAccountType("com.example.account"));
 
         final String label = EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(),
                 account);
@@ -87,8 +91,8 @@
 
 
     public void testGetProfileAccountInfo_DeviceLocalAccount() {
-        final AccountDisplayInfo account = new AccountDisplayInfo(ACCOUNT, "Device",
-                "Device", null, true);
+        final AccountInfo account = new AccountInfo(new AccountDisplayInfo(ACCOUNT, "Device",
+                "Device", null, true), new DeviceLocalAccountType(mContext));
 
         final String label = EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(),
                 account);
