diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 8880001..eed3b49 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -24,11 +24,12 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.PixelFormat;
-import android.os.AsyncResult;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.telephony.SubscriptionInfo;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
@@ -49,9 +50,6 @@
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.settings.network.ProxySubscriptionManager;
 
@@ -112,7 +110,6 @@
     private TabWidget mTabWidget;
     private ListView mListView;
 
-    private Phone mPhone;
     private ProxySubscriptionManager mProxySubscriptionMgr;
 
     private EditPinPreference mPinDialog;
@@ -121,24 +118,18 @@
     private Resources mRes;
 
     // For async handler to identify request type
-    private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100;
-    private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101;
     private static final int MSG_SIM_STATE_CHANGED = 102;
 
     // @see android.widget.Toast$TN
     private static final long LONG_DURATION_TIMEOUT = 7000;
 
+    private int mSubId;
+    private TelephonyManager mTelephonyManager;
+
     // For replies from IccCard interface
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
-            final AsyncResult ar = (AsyncResult) msg.obj;
             switch (msg.what) {
-                case MSG_ENABLE_ICC_PIN_COMPLETE:
-                    iccLockChanged(ar.exception == null, msg.arg1, ar.exception);
-                    break;
-                case MSG_CHANGE_ICC_PIN_COMPLETE:
-                    iccPinChanged(ar.exception == null, msg.arg1);
-                    break;
                 case MSG_SIM_STATE_CHANGED:
                     updatePreferences();
                     break;
@@ -158,11 +149,12 @@
     };
 
     // For top-level settings screen to query
-    static boolean isIccLockEnabled() {
-        return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled();
+    private boolean isIccLockEnabled() {
+        mTelephonyManager =  mTelephonyManager.createForSubscriptionId(mSubId);
+        return mTelephonyManager.isIccLockEnabled();
     }
 
-    static String getSummary(Context context) {
+    private String getSummary(Context context) {
         final Resources res = context.getResources();
         final String summary = isIccLockEnabled()
                 ? res.getString(R.string.sim_lock_on)
@@ -184,6 +176,8 @@
         mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(getContext());
         mProxySubscriptionMgr.setLifecycle(getLifecycle());
 
+        mTelephonyManager = getContext().getSystemService(TelephonyManager.class);
+
         addPreferencesFromResource(R.xml.sim_lock_settings);
 
         mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG);
@@ -251,15 +245,13 @@
                             : subInfo.getDisplayName())));
             }
             final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(subInfoList, 0);
-
-            mPhone = (sir == null) ? null : PhoneFactory.getPhone(sir.getSimSlotIndex());
+            mSubId = sir.getSubscriptionId();
 
             if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_TAB)) {
                 mTabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB));
             }
             return view;
         } else {
-            mPhone = PhoneFactory.getDefaultPhone();
             return super.onCreateView(inflater, container, savedInstanceState);
         }
     }
@@ -271,14 +263,20 @@
     }
 
     private void updatePreferences() {
+
+        final List<SubscriptionInfo> subInfoList =
+                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
+        final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(subInfoList, 0);
+        mSubId = sir.getSubscriptionId();
+
         if (mPinDialog != null) {
-            mPinDialog.setEnabled(mPhone != null);
+            mPinDialog.setEnabled(sir != null);
         }
         if (mPinToggle != null) {
-            mPinToggle.setEnabled(mPhone != null);
+            mPinToggle.setEnabled(sir != null);
 
-            if (mPhone != null) {
-                mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
+            if (sir != null) {
+                mPinToggle.setChecked(isIccLockEnabled());
             }
         }
     }
@@ -462,29 +460,52 @@
     private void tryChangeIccLockState() {
         // Try to change icc lock. If it succeeds, toggle the lock state and
         // reset dialog state. Else inject error message and show dialog again.
-        final Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);
-        mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
+        new SetIccLockEnabled(mToState, mPin).execute();
         // Disable the setting till the response is received.
         mPinToggle.setEnabled(false);
     }
 
-    private void iccLockChanged(boolean success, int attemptsRemaining, Throwable exception) {
+    private class SetIccLockEnabled extends AsyncTask<Void, Void, Void> {
+        private final boolean mState;
+        private final String mPassword;
+        private int mAttemptsRemaining;
+
+        private SetIccLockEnabled(boolean state, String pin) {
+            mState = state;
+            mPassword = pin;
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            mTelephonyManager =  mTelephonyManager.createForSubscriptionId(mSubId);
+            mAttemptsRemaining = mTelephonyManager.setIccLockEnabled(mState, mPassword);
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void aVoid) {
+            if (mAttemptsRemaining == TelephonyManager.CHANGE_ICC_LOCK_SUCCESS) {
+                iccLockChanged(true, mAttemptsRemaining);
+            } else {
+                iccLockChanged(false, mAttemptsRemaining);
+            }
+        }
+    }
+
+    private void iccLockChanged(boolean success, int attemptsRemaining) {
+        Log.d(TAG, "iccLockChanged: success = " + success);
         if (success) {
             mPinToggle.setChecked(mToState);
         } else {
-            if (exception instanceof CommandException) {
-                final CommandException.Error err =
-                        ((CommandException) exception).getCommandError();
-                if (err == CommandException.Error.PASSWORD_INCORRECT) {
-                    createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
+            if (attemptsRemaining >= 0) {
+                createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
+            } else {
+                if (mToState) {
+                    Toast.makeText(getContext(), mRes.getString(
+                            R.string.sim_pin_enable_failed), Toast.LENGTH_LONG).show();
                 } else {
-                    if (mToState) {
-                        Toast.makeText(getContext(), mRes.getString
-                               (R.string.sim_pin_enable_failed), Toast.LENGTH_LONG).show();
-                    } else {
-                        Toast.makeText(getContext(), mRes.getString
-                               (R.string.sim_pin_disable_failed), Toast.LENGTH_LONG).show();
-                    }
+                    Toast.makeText(getContext(), mRes.getString(
+                            R.string.sim_pin_disable_failed), Toast.LENGTH_LONG).show();
                 }
             }
         }
@@ -540,21 +561,46 @@
     }
 
     private void iccPinChanged(boolean success, int attemptsRemaining) {
+        Log.d(TAG, "iccPinChanged: success = " + success);
         if (!success) {
             createCustomTextToast(getPinPasswordErrorMessage(attemptsRemaining));
         } else {
             Toast.makeText(getContext(), mRes.getString(R.string.sim_change_succeeded),
                     Toast.LENGTH_SHORT)
                     .show();
-
         }
         resetDialogState();
     }
 
     private void tryChangePin() {
-        final Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE);
-        mPhone.getIccCard().changeIccLockPassword(mOldPin,
-                mNewPin, callback);
+        new ChangeIccLockPassword(mOldPin, mNewPin).execute();
+    }
+
+    private class ChangeIccLockPassword extends AsyncTask<Void, Void, Void> {
+        private final String mOldPwd;
+        private final String mNewPwd;
+        private int mAttemptsRemaining;
+
+        private ChangeIccLockPassword(String oldPin, String newPin) {
+            mOldPwd = oldPin;
+            mNewPwd = newPin;
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+            mAttemptsRemaining = mTelephonyManager.changeIccLockPassword(mOldPwd, mNewPwd);
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void aVoid) {
+            if (mAttemptsRemaining == TelephonyManager.CHANGE_ICC_LOCK_SUCCESS) {
+                iccPinChanged(true, mAttemptsRemaining);
+            } else {
+                iccPinChanged(false, mAttemptsRemaining);
+            }
+        }
     }
 
     private String getPinPasswordErrorMessage(int attemptsRemaining) {
@@ -610,8 +656,6 @@
             final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(
                     mProxySubscriptionMgr.getActiveSubscriptionsInfo(), slotId);
 
-            mPhone = (sir == null) ? null : PhoneFactory.getPhone(sir.getSimSlotIndex());
-
             // The User has changed tab; update the body.
             updatePreferences();
         }
