diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 4d12043..77cc03e 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -87,6 +87,7 @@
     private static final String PIN_DIALOG = "sim_pin";
     private static final String PIN_TOGGLE = "sim_toggle";
     // Keys in icicle
+    private static final String DIALOG_SUB_ID = "dialogSubId";
     private static final String DIALOG_STATE = "dialogState";
     private static final String DIALOG_PIN = "dialogPin";
     private static final String DIALOG_ERROR = "dialogError";
@@ -127,7 +128,7 @@
     // @see android.widget.Toast$TN
     private static final long LONG_DURATION_TIMEOUT = 7000;
 
-    private int mSlotId;
+    private int mSlotId = -1;
     private int mSubId;
     private TelephonyManager mTelephonyManager;
 
@@ -155,7 +156,7 @@
 
     // For top-level settings screen to query
     private boolean isIccLockEnabled() {
-        mTelephonyManager =  mTelephonyManager.createForSubscriptionId(mSubId);
+        mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
         return mTelephonyManager.isIccLockEnabled();
     }
 
@@ -187,27 +188,13 @@
 
         mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG);
         mPinToggle = (SwitchPreference) findPreference(PIN_TOGGLE);
-        if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) {
-            mDialogState = savedInstanceState.getInt(DIALOG_STATE);
-            mPin = savedInstanceState.getString(DIALOG_PIN);
-            mError = savedInstanceState.getString(DIALOG_ERROR);
-            mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE);
-
-            // Restore inputted PIN code
-            switch (mDialogState) {
-                case ICC_NEW_MODE:
-                    mOldPin = savedInstanceState.getString(OLD_PINCODE);
-                    break;
-
-                case ICC_REENTER_MODE:
-                    mOldPin = savedInstanceState.getString(OLD_PINCODE);
-                    mNewPin = savedInstanceState.getString(NEW_PINCODE);
-                    break;
-
-                case ICC_LOCK_MODE:
-                case ICC_OLD_MODE:
-                default:
-                    break;
+        if (savedInstanceState != null) {
+            if (savedInstanceState.containsKey(DIALOG_STATE)
+                    && restoreDialogStates(savedInstanceState)) {
+                Log.d(TAG, "onCreate: restore dialog for slotId=" + mSlotId + ", subId=" + mSubId);
+            } else if (savedInstanceState.containsKey(CURRENT_TAB)
+                    && restoreTabFocus(savedInstanceState)) {
+                Log.d(TAG, "onCreate: restore focus on slotId=" + mSlotId + ", subId=" + mSubId);
             }
         }
 
@@ -219,29 +206,75 @@
         mRes = getResources();
     }
 
+    private boolean restoreDialogStates(Bundle savedInstanceState) {
+        final SubscriptionInfo subInfo = mProxySubscriptionMgr
+                .getActiveSubscriptionInfo(savedInstanceState.getInt(DIALOG_SUB_ID));
+        if (subInfo == null) {
+            return false;
+        }
+
+        final SubscriptionInfo visibleSubInfo = getVisibleSubscriptionInfoForSimSlotIndex(
+                subInfo.getSimSlotIndex());
+        if (visibleSubInfo == null) {
+            return false;
+        }
+        if (visibleSubInfo.getSubscriptionId() != subInfo.getSubscriptionId()) {
+            return false;
+        }
+
+        mSlotId = subInfo.getSimSlotIndex();
+        mSubId = subInfo.getSubscriptionId();
+        mDialogState = savedInstanceState.getInt(DIALOG_STATE);
+        mPin = savedInstanceState.getString(DIALOG_PIN);
+        mError = savedInstanceState.getString(DIALOG_ERROR);
+        mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE);
+
+        // Restore inputted PIN code
+        switch (mDialogState) {
+            case ICC_NEW_MODE:
+                mOldPin = savedInstanceState.getString(OLD_PINCODE);
+                break;
+
+            case ICC_REENTER_MODE:
+                mOldPin = savedInstanceState.getString(OLD_PINCODE);
+                mNewPin = savedInstanceState.getString(NEW_PINCODE);
+                break;
+        }
+        return true;
+    }
+
+    private boolean restoreTabFocus(Bundle savedInstanceState) {
+        int slotId = 0;
+        try {
+            slotId = Integer.parseInt(savedInstanceState.getString(CURRENT_TAB));
+        } catch (NumberFormatException exception) {
+            return false;
+        }
+
+        final SubscriptionInfo subInfo = getVisibleSubscriptionInfoForSimSlotIndex(slotId);
+        if (subInfo == null) {
+            return false;
+        }
+
+        mSlotId = subInfo.getSimSlotIndex();
+        mSubId = subInfo.getSubscriptionId();
+        if (mTabHost != null) {
+            mTabHost.setCurrentTabByTag(getTagForSlotId(mSlotId));
+        }
+        return true;
+    }
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
 
         final int numSims = mProxySubscriptionMgr.getActiveSubscriptionInfoCountMax();
-        final List<SubscriptionInfo> subInfoList =
-                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
-        mSlotId = 0;
         final List<SubscriptionInfo> componenterList = new ArrayList<>();
 
         for (int i = 0; i < numSims; ++i) {
-            final SubscriptionInfo subInfo =
-                    getActiveSubscriptionInfoForSimSlotIndex(subInfoList, i);
+            final SubscriptionInfo subInfo = getVisibleSubscriptionInfoForSimSlotIndex(i);
             if (subInfo != null) {
-                final CarrierConfigManager carrierConfigManager = getContext().getSystemService(
-                        CarrierConfigManager.class);
-                final PersistableBundle bundle = carrierConfigManager.getConfigForSubId(
-                        subInfo.getSubscriptionId());
-                if (bundle != null
-                        && !bundle.getBoolean(CarrierConfigManager
-                        .KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
-                    componenterList.add(subInfo);
-                }
+                componenterList.add(subInfo);
             }
         }
 
@@ -250,6 +283,12 @@
             return super.onCreateView(inflater, container, savedInstanceState);
         }
 
+        if (mSlotId < 0) {
+            mSlotId = componenterList.get(0).getSimSlotIndex();
+            mSubId = componenterList.get(0).getSubscriptionId();
+            Log.d(TAG, "onCreateView: default slotId=" + mSlotId + ", subId=" + mSubId);
+        }
+
         if (componenterList.size() > 1) {
             final View view = inflater.inflate(R.layout.icc_lock_tabs, container, false);
             final ViewGroup prefs_container = (ViewGroup) view.findViewById(R.id.prefs_container);
@@ -262,25 +301,21 @@
             mListView = (ListView) view.findViewById(android.R.id.list);
 
             mTabHost.setup();
-            mTabHost.setOnTabChangedListener(mTabListener);
             mTabHost.clearAllTabs();
 
             for (SubscriptionInfo subInfo : componenterList) {
-                int slot = subInfo.getSimSlotIndex();
-                mTabHost.addTab(buildTabSpec(String.valueOf(slot),
+                final int slot = subInfo.getSimSlotIndex();
+                final String tag = getTagForSlotId(slot);
+                mTabHost.addTab(buildTabSpec(tag,
                         String.valueOf(subInfo == null
                                 ? getContext().getString(R.string.sim_editor_title, slot + 1)
                                 : subInfo.getDisplayName())));
             }
 
-            mSubId = componenterList.get(0).getSubscriptionId();
-
-            if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_TAB)) {
-                mTabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB));
-            }
+            mTabHost.setCurrentTabByTag(getTagForSlotId(mSlotId));
+            mTabHost.setOnTabChangedListener(mTabListener);
             return view;
         } else {
-            mSlotId = componenterList.get(0).getSimSlotIndex();
             return super.onCreateView(inflater, container, savedInstanceState);
         }
     }
@@ -293,17 +328,20 @@
 
     private void updatePreferences() {
 
-        final List<SubscriptionInfo> subInfoList =
-                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
-        final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(subInfoList, mSlotId);
-        mSubId = (sir == null) ? SubscriptionManager.INVALID_SUBSCRIPTION_ID
-            : sir.getSubscriptionId();
+        final SubscriptionInfo sir = getVisibleSubscriptionInfoForSimSlotIndex(mSlotId);
+        final int subId = (sir != null) ? sir.getSubscriptionId()
+                : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+        if (mSubId != subId) {
+            mSubId = subId;
+            resetDialogState();
+            if ((mPinDialog != null) && mPinDialog.isDialogOpen()) {
+                mPinDialog.getDialog().dismiss();
+            }
+        }
 
         if (mPinDialog != null) {
             mPinDialog.setEnabled(sir != null);
-            if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-                mPinDialog.getDialog().dismiss();
-            }
         }
         if (mPinToggle != null) {
             mPinToggle.setEnabled(sir != null);
@@ -355,6 +393,7 @@
         // dialog state. In other cases, where this activity manually launches
         // the dialog, store the state of the dialog.
         if (mPinDialog.isDialogOpen()) {
+            out.putInt(DIALOG_SUB_ID, mSubId);
             out.putInt(DIALOG_STATE, mDialogState);
             out.putString(DIALOG_PIN, mPinDialog.getEditText().getText().toString());
             out.putString(DIALOG_ERROR, mError);
@@ -370,11 +409,6 @@
                     out.putString(OLD_PINCODE, mOldPin);
                     out.putString(NEW_PINCODE, mNewPin);
                     break;
-
-                case ICC_LOCK_MODE:
-                case ICC_OLD_MODE:
-                default:
-                    break;
             }
         } else {
             super.onSaveInstanceState(out);
@@ -672,23 +706,50 @@
         mDialogState = OFF_MODE;
     }
 
-    private static SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(
-            List<SubscriptionInfo> subInfoList, int slotId) {
+    private String getTagForSlotId(int slotId) {
+        return String.valueOf(slotId);
+    }
+
+    private int getSlotIndexFromTag(String tag) {
+        int slotId = -1;
+        try {
+            slotId = Integer.parseInt(tag);
+        } catch (NumberFormatException exception) {
+        }
+        return slotId;
+    }
+
+    private SubscriptionInfo getVisibleSubscriptionInfoForSimSlotIndex(int slotId) {
+        final List<SubscriptionInfo> subInfoList =
+                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
         if (subInfoList == null) {
             return null;
         }
+        final CarrierConfigManager carrierConfigManager = getContext().getSystemService(
+                CarrierConfigManager.class);
         for (SubscriptionInfo subInfo : subInfoList) {
-            if (subInfo.getSimSlotIndex() == slotId) {
+            if ((isSubscriptionVisible(carrierConfigManager, subInfo)
+                    && (subInfo.getSimSlotIndex() == slotId))) {
                 return subInfo;
             }
         }
         return null;
     }
 
+    private boolean isSubscriptionVisible(CarrierConfigManager carrierConfigManager,
+            SubscriptionInfo subInfo) {
+        final PersistableBundle bundle = carrierConfigManager
+                .getConfigForSubId(subInfo.getSubscriptionId());
+        if (bundle == null) {
+            return false;
+        }
+        return !bundle.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL);
+    }
+
     private OnTabChangeListener mTabListener = new OnTabChangeListener() {
         @Override
         public void onTabChanged(String tabId) {
-            mSlotId = Integer.parseInt(tabId);
+            mSlotId = getSlotIndexFromTag(tabId);
 
             // The User has changed tab; update the body.
             updatePreferences();
