diff --git a/src/com/android/contacts/SimImportFragment.java b/src/com/android/contacts/SimImportFragment.java
index 7421df4..7ce00d2 100644
--- a/src/com/android/contacts/SimImportFragment.java
+++ b/src/com/android/contacts/SimImportFragment.java
@@ -57,7 +57,7 @@
         implements LoaderManager.LoaderCallbacks<ArrayList<SimContact>>,
         MultiSelectEntryContactListAdapter.SelectedContactsListener {
 
-    private static final String KEY_ACCOUNT = "account";
+    private static final String KEY_SELECTED_IDS = "selectedIds";
     private static final String ARG_SUBSCRIPTION_ID = "subscriptionId";
     public static final int NO_SUBSCRIPTION_ID = -1;
 
@@ -70,11 +70,14 @@
     private ListView mListView;
     private View mImportButton;
 
+    private long[] mSelectedContacts;
+
     private int mSubscriptionId;
 
     @Override
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+
         setStyle(STYLE_NORMAL, R.style.PeopleThemeAppCompat_FullScreenDialog);
         mPreferences = new ContactsPreferences(getContext());
         mAccountTypeManager = AccountTypeManager.getInstance(getActivity());
@@ -87,6 +90,9 @@
         final Bundle args = getArguments();
         mSubscriptionId = args == null ? NO_SUBSCRIPTION_ID : args.getInt(ARG_SUBSCRIPTION_ID,
                 NO_SUBSCRIPTION_ID);
+
+        if (savedInstanceState == null) return;
+        mSelectedContacts = savedInstanceState.getLongArray(KEY_SELECTED_IDS);
     }
 
     @Override
@@ -112,8 +118,7 @@
         mAccountHeaderPresenter = new AccountHeaderPresenter(
                 view.findViewById(R.id.account_header_container));
         if (savedInstanceState != null) {
-            AccountWithDataSet account = savedInstanceState.getParcelable(KEY_ACCOUNT);
-            mAccountHeaderPresenter.setCurrentAccount(account);
+            mAccountHeaderPresenter.onRestoreInstanceState(savedInstanceState);
         } else {
             final AccountWithDataSet currentDefaultAccount = AccountWithDataSet
                     .getDefaultOrBestFallback(mPreferences, mAccountTypeManager);
@@ -164,7 +169,10 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        outState.putParcelable(KEY_ACCOUNT, mAccountHeaderPresenter.getCurrentAccount());
+        mAccountHeaderPresenter.onSaveInstanceState(outState);
+        if (mAdapter != null) {
+            outState.putLongArray(KEY_SELECTED_IDS, mAdapter.getSelectedContactIdsArray());
+        }
     }
 
     @Override
@@ -177,8 +185,11 @@
             ArrayList<SimContact> data) {
         mListView.setEmptyView(getView().findViewById(R.id.empty_message));
         mAdapter.setContacts(data);
-        // we default to selecting all contacts.
-        mAdapter.selectAll();
+        if (mSelectedContacts != null) {
+            mAdapter.select(mSelectedContacts);
+        } else {
+            mAdapter.selectAll();
+        }
         mLoadingIndicator.hide();
     }
 
@@ -293,6 +304,14 @@
             }
             setSelectedContactIds(selected);
         }
+
+        public void select(long[] contacts) {
+            final TreeSet<Long> selected = new TreeSet<>();
+            for (long contact : contacts) {
+                selected.add(contact);
+            }
+            setSelectedContactIds(selected);
+        }
     }
 
     public static class SimContactLoader extends AsyncTaskLoader<ArrayList<SimContact>> {
diff --git a/src/com/android/contacts/editor/AccountHeaderPresenter.java b/src/com/android/contacts/editor/AccountHeaderPresenter.java
index de2b014..5323c60 100644
--- a/src/com/android/contacts/editor/AccountHeaderPresenter.java
+++ b/src/com/android/contacts/editor/AccountHeaderPresenter.java
@@ -16,6 +16,7 @@
 package com.android.contacts.editor;
 
 import android.content.Context;
+import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.view.View;
@@ -42,6 +43,8 @@
  */
 public class AccountHeaderPresenter {
 
+    private static final String KEY_SELECTED_ACCOUNT = "accountHeaderSelectedAccount";
+
     public interface Observer {
         void onChange(AccountHeaderPresenter sender);
 
@@ -100,6 +103,18 @@
         return mCurrentAccount;
     }
 
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putParcelable(KEY_SELECTED_ACCOUNT, mCurrentAccount);
+    }
+
+    public void onRestoreInstanceState(Bundle savedInstanceState) {
+        if (savedInstanceState == null) return;
+        if (mCurrentAccount == null) {
+            mCurrentAccount = savedInstanceState.getParcelable(KEY_SELECTED_ACCOUNT);
+        }
+        updateDisplayedAccount();
+    }
+
     private void updateDisplayedAccount() {
         mAccountHeaderContainer.setVisibility(View.GONE);
         if (mCurrentAccount == null) return;
@@ -146,31 +161,40 @@
         final View.OnClickListener onClickListener = new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                final ListPopupWindow popup = new ListPopupWindow(mContext, null);
-                final AccountsListAdapter adapter =
-                        new AccountsListAdapter(mContext,
-                                AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
-                                mCurrentAccount);
-                popup.setWidth(mAccountHeaderContainer.getWidth());
-                popup.setAnchorView(mAccountHeaderContainer);
-                popup.setAdapter(adapter);
-                popup.setModal(true);
-                popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
-                popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-                    @Override
-                    public void onItemClick(AdapterView<?> parent, View view, int position,
-                            long id) {
-                        UiClosables.closeQuietly(popup);
-                        final AccountWithDataSet newAccount = adapter.getItem(position);
-                        setCurrentAccount(newAccount);
-                    }
-                });
-                popup.show();
+                showPopup();
             }
         };
         setUpAccountSelector(nameLabel.toString(), onClickListener);
     }
 
+    private void showPopup() {
+        final ListPopupWindow popup = new ListPopupWindow(mContext);
+        final AccountsListAdapter adapter =
+                new AccountsListAdapter(mContext,
+                        AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
+                        mCurrentAccount);
+        popup.setWidth(mAccountHeaderContainer.getWidth());
+        popup.setAnchorView(mAccountHeaderContainer);
+        popup.setAdapter(adapter);
+        popup.setModal(true);
+        popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+        popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position,
+                    long id) {
+                UiClosables.closeQuietly(popup);
+                final AccountWithDataSet newAccount = adapter.getItem(position);
+                setCurrentAccount(newAccount);
+            }
+        });
+        mAccountHeaderContainer.post(new Runnable() {
+            @Override
+            public void run() {
+                popup.show();
+            }
+        });
+    }
+
     private void setUpAccountSelector(String nameLabel, View.OnClickListener listener) {
         addAccountHeader(nameLabel);
         // Add handlers for choosing another account to save to.
