diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index afeebd8..6cf0d7e 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -102,6 +102,8 @@
     private static final String UP_ACTIVITY_CLASS =
             "com.android.settings.Settings$WirelessSettingsActivity";
 
+    private SubscriptionManager mSubscriptionManager;
+
     //UI objects
     private ListPreference mButtonPreferredNetworkMode;
     private ListPreference mButtonEnabledNetworks;
@@ -110,7 +112,7 @@
     private Preference mLteDataServicePref;
 
     private static final String iface = "rmnet0"; //TODO: this will go away
-    private List<SubscriptionInfo> mSelectableSubInfos = null;
+    private List<SubscriptionInfo> mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
 
     private UserManager mUm;
     private Phone mPhone;
@@ -274,9 +276,12 @@
         super.onCreate(icicle);
         final Context context = getApplicationContext();
 
-        mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
+        mPhone = PhoneGlobals.getPhone();
+        mHandler = new MyHandler();
+        mUm = (UserManager) getSystemService(Context.USER_SERVICE);
         final TelephonyManager tm =
                 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        mSubscriptionManager = SubscriptionManager.from(this);
 
         for (int i = 0; i < tm.getSimCount(); i++) {
             SubscriptionInfo sir = findRecordBySlotId(i);
@@ -285,10 +290,6 @@
             }
         }
 
-        mPhone = PhoneGlobals.getPhone();
-        mHandler = new MyHandler();
-        mUm = (UserManager) getSystemService(Context.USER_SERVICE);
-
         if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
             mUnavailable = true;
             setContentView(R.layout.telephony_disallowed_preference_screen);
@@ -1089,16 +1090,18 @@
      * finds a record with slotId.
      * Since the number of SIMs are few, an array is fine.
      */
-    public static SubscriptionInfo findRecordBySlotId(final int slotId) {
+    public SubscriptionInfo findRecordBySlotId(final int slotId) {
         final List<SubscriptionInfo> subInfoList =
-            SubscriptionManager.getActiveSubscriptionInfoList();
-        final int subInfoLength = subInfoList.size();
+            mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (subInfoList != null) {
+            final int subInfoLength = subInfoList.size();
 
-        for (int i = 0; i < subInfoLength; ++i) {
-            final SubscriptionInfo sir = subInfoList.get(i);
-            if (sir.getSimSlotIndex() == slotId) {
-                //Right now we take the first subscription on a SIM.
-                return sir;
+            for (int i = 0; i < subInfoLength; ++i) {
+                final SubscriptionInfo sir = subInfoList.get(i);
+                if (sir.getSimSlotIndex() == slotId) {
+                    //Right now we take the first subscription on a SIM.
+                    return sir;
+                }
             }
         }
 
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index e8cffa9..58f5919 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -133,13 +133,14 @@
     /** The singleton instance. */
     private static PhoneInterfaceManager sInstance;
 
-    PhoneGlobals mApp;
-    Phone mPhone;
-    CallManager mCM;
-    AppOpsManager mAppOps;
-    MainThreadHandler mMainThreadHandler;
+    private PhoneGlobals mApp;
+    private Phone mPhone;
+    private CallManager mCM;
+    private AppOpsManager mAppOps;
+    private MainThreadHandler mMainThreadHandler;
+    private SubscriptionManager mSubscriptionManager;
+    private SharedPreferences mTelephonySharedPreferences;
 
-    SharedPreferences mTelephonySharedPreferences;
     private static final String PREF_CARRIERS_ALPHATAG_PREFIX = "carrier_alphtag_";
     private static final String PREF_CARRIERS_NUMBER_PREFIX = "carrier_number_";
     private static final String PREF_ENABLE_VIDEO_CALLING = "enable_video_calling";
@@ -726,6 +727,8 @@
         mMainThreadHandler = new MainThreadHandler();
         mTelephonySharedPreferences =
                 PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
+        mSubscriptionManager = SubscriptionManager.from(app);
+
         publish();
     }
 
@@ -790,11 +793,13 @@
         }
 
         boolean isValid = false;
-        List<SubscriptionInfo> slist = SubscriptionManager.getActiveSubscriptionInfoList();
-        for (SubscriptionInfo subInfoRecord : slist) {
-            if (subInfoRecord.getSubscriptionId() == subId) {
-                isValid = true;
-                break;
+        List<SubscriptionInfo> slist = mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (slist != null) {
+            for (SubscriptionInfo subInfoRecord : slist) {
+                if (subInfoRecord.getSubscriptionId() == subId) {
+                    isValid = true;
+                    break;
+                }
             }
         }
         if (isValid == false) {
diff --git a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
index a99c5f0..9d7be9b 100644
--- a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
+++ b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
@@ -50,6 +50,8 @@
     private String LOG_TAG = PhoneAccountSettingsFragment.class.getSimpleName();
 
     private TelecomManager mTelecomManager;
+    private SubscriptionManager mSubscriptionManager;
+
     private Context mApplicationContext;
 
     private PreferenceCategory mAccountList;
@@ -68,6 +70,7 @@
 
         mTelecomManager = TelecomManager.from(getActivity());
         mApplicationContext = getActivity().getApplicationContext();
+        mSubscriptionManager = SubscriptionManager.from(mApplicationContext);
     }
 
     @Override
@@ -297,7 +300,11 @@
     }
 
     private void initAccountList() {
-        for (SubscriptionInfo subscription : SubscriptionManager.getActiveSubscriptionInfoList()) {
+        List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (sil == null) {
+            return;
+        }
+        for (SubscriptionInfo subscription : sil) {
             CharSequence label = subscription.getDisplayName();
             Intent intent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 3523288..c105fff 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -27,8 +27,8 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionListener;
 import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
@@ -82,7 +82,7 @@
             // Populate the phone account data.
             int subId = mPhone.getSubId();
             int color = PhoneAccount.NO_COLOR;
-            int slotId = SubscriptionManager.INVALID_SLOT_ID;
+            int slotId = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
             String line1Number = mTelephonyManager.getLine1NumberForSubscriber(subId);
             if (line1Number == null) {
                 line1Number = "";
@@ -108,7 +108,8 @@
                 CharSequence subDisplayName = null;
                 // We can only get the real slotId from the SubInfoRecord, we can't calculate the
                 // slotId from the subId or the phoneId in all instances.
-                SubscriptionInfo record = SubscriptionManager.getSubscriptionInfoForSubscriber(subId);
+                SubscriptionInfo record =
+                        mSubscriptionManager.getActiveSubscriptionInfo(subId);
                 if (record != null) {
                     subDisplayName = record.getDisplayName();
                     slotId = record.getSimSlotIndex();
@@ -170,9 +171,10 @@
         }
     }
 
-    private final SubscriptionListener mSubscriptionListener = new SubscriptionListener() {
+    private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
+            new OnSubscriptionsChangedListener() {
         @Override
-        public void onSubscriptionInfoChanged() {
+        public void onSubscriptionsChanged() {
             // Any time the SubscriptionInfo changes...rerun the setup
             tearDownAccounts();
             setupAccounts();
@@ -195,6 +197,7 @@
     private final Context mContext;
     private final TelecomManager mTelecomManager;
     private final TelephonyManager mTelephonyManager;
+    private final SubscriptionManager mSubscriptionManager;
     private List<AccountEntry> mAccounts = new LinkedList<AccountEntry>();
     private int mServiceState = ServiceState.STATE_POWER_OFF;
 
@@ -202,6 +205,7 @@
         mContext = context;
         mTelecomManager = TelecomManager.from(context);
         mTelephonyManager = TelephonyManager.from(context);
+        mSubscriptionManager = SubscriptionManager.from(context);
     }
 
     static synchronized final TelecomAccountRegistry getInstance(Context context) {
@@ -216,13 +220,14 @@
      */
     void setupOnBoot() {
         // TODO: When this object "finishes" we should unregister by invoking
-        // SubscriptionManager.unregister(mContext, mSubscriptionListener);
+        // SubscriptionManager.getInstance(mContext).unregister(mOnSubscriptionsChangedListener);
         // This is not strictly necessary because it will be unregistered if the
         // notification fails but it is good form.
 
-        // Register for SubscriptionInfo list changes
-        SubscriptionManager.register(mContext, mSubscriptionListener,
-                SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
+        // Register for SubscriptionInfo list changes which is guaranteed
+        // to invoke onSubscriptionsChanged the first time.
+        SubscriptionManager.from(mContext).registerOnSubscriptionsChangedListener(
+                mOnSubscriptionsChangedListener);
 
         // We also need to listen for changes to the service state (e.g. emergency -> in service)
         // because this could signal a removal or addition of a SIM in a single SIM phone.
