diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index cb9c54b..a625b47 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -195,7 +195,6 @@
     private INetworkStatsService mStatsService;
     private NetworkPolicyManager mPolicyManager;
     private TelephonyManager mTelephonyManager;
-    private SubscriptionManager mSubscriptionManager;
 
     private INetworkStatsSession mStatsSession;
 
@@ -287,14 +286,13 @@
                 ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
         mPolicyManager = NetworkPolicyManager.from(context);
         mTelephonyManager = TelephonyManager.from(context);
-        mSubscriptionManager = SubscriptionManager.from(context);
 
         mPrefs = getActivity().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
 
         mPolicyEditor = new NetworkPolicyEditor(mPolicyManager);
         mPolicyEditor.read();
 
-        mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
+        mSubInfoList = SimSettings.getSortedSubInfoList(getActivity());
         mMobileTagMap = initMobileTabTag(mSubInfoList);
 
         try {
@@ -944,7 +942,7 @@
         } else {
             //SUB SELECT
             isEnable = mTelephonyManager.getDataEnabled()
-                && (subId == mSubscriptionManager.getDefaultDataSubId());
+                && (subId == SubscriptionManager.getDefaultDataSubId());
         }
         return isEnable;
     }
@@ -1133,8 +1131,8 @@
 
     private void handleMultiSimDataDialog() {
         final SubscriptionInfo currentSir = getCurrentTabSubInfo(getActivity());
-        final SubscriptionInfo nextSir = mSubscriptionManager.getActiveSubscriptionInfo(
-                mSubscriptionManager.getDefaultDataSubId());
+        final SubscriptionInfo nextSir = SubscriptionManager.getSubscriptionInfoForSubscriber(
+                SubscriptionManager.getDefaultDataSubId());
 
         if (currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
             setMobileDataEnabled(true);
@@ -1151,7 +1149,7 @@
         builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int id) {
-                mSubscriptionManager.setDefaultDataSubId(currentSir.getSubscriptionId());
+                SubscriptionManager.setDefaultDataSubId(currentSir.getSubscriptionId());
                 setMobileDataEnabled(true);
                 updateBody();
             }
@@ -2248,7 +2246,7 @@
         final NetworkTemplate template = intent.getParcelableExtra(EXTRA_NETWORK_TEMPLATE);
         if (template == null) {
             final int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
-                    SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+                    SubscriptionManager.INVALID_SUB_ID);
             if (SubscriptionManager.isValidSubId(subId)) {
                 return TAB_MOBILE + String.valueOf(subId);
             }
@@ -2341,8 +2339,7 @@
         final ConnectivityManager conn = ConnectivityManager.from(context);
         final TelephonyManager tele = TelephonyManager.from(context);
 
-        final List<SubscriptionInfo> subInfoList =
-                SubscriptionManager.from(context).getActiveSubscriptionInfoList();
+        final List<SubscriptionInfo> subInfoList = SubscriptionManager.getActiveSubscriptionInfoList();
         // No activated Subscription
         if (subInfoList == null) {
             return false;
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index cfe27bb..d8744cc 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -215,7 +215,7 @@
             mTabHost.clearAllTabs();
 
             for (int i = 0; i < numSims; ++i) {
-                final SubscriptionInfo subInfo = Utils.findRecordBySlotId(this, i);
+                final SubscriptionInfo subInfo = Utils.findRecordBySlotId(i);
                 mTabHost.addTab(buildTabSpec(String.valueOf(i),
                         String.valueOf(subInfo == null
                             ? context.getString(R.string.sim_editor_title, i + 1)
@@ -469,7 +469,7 @@
         @Override
         public void onTabChanged(String tabId) {
             final int slotId = Integer.parseInt(tabId);
-            final SubscriptionInfo sir = Utils.findRecordBySlotId(getBaseContext(), slotId);
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(slotId);
 
             mPhone = (sir == null) ? null
                 : PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 9b7b0cf..ab39689 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -111,7 +111,6 @@
     private static final boolean ONLY_ONE_TRUST_AGENT = true;
 
     private DevicePolicyManager mDPM;
-    private SubscriptionManager mSubscriptionManager;
 
     private ChooseLockSettingsHelper mChooseLockSettingsHelper;
     private LockPatternUtils mLockPatternUtils;
@@ -371,10 +370,9 @@
     /* Return true if a SIM is ready for locking.
      * TODO: consider adding to TelephonyManager or SubscritpionManasger.
      */
-    private boolean isSimReady() {
+    private static boolean isSimReady() {
         int simState = TelephonyManager.SIM_STATE_UNKNOWN;
-        final List<SubscriptionInfo> subInfoList =
-                mSubscriptionManager.getActiveSubscriptionInfoList();
+        final List<SubscriptionInfo> subInfoList = SubscriptionManager.getActiveSubscriptionInfoList();
         if (subInfoList != null) {
             for (SubscriptionInfo subInfo : subInfoList) {
                 simState = TelephonyManager.getDefault().getSimState(subInfo.getSimSlotIndex());
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index f7aa566..e687beb 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -988,17 +988,15 @@
      * finds a record with subId.
      * Since the number of SIMs are few, an array is fine.
      */
-    public static SubscriptionInfo findRecordBySubId(Context context, final int subId) {
+    public static SubscriptionInfo findRecordBySubId(final int subId) {
         final List<SubscriptionInfo> subInfoList =
-                SubscriptionManager.from(context).getActiveSubscriptionInfoList();
-        if (subInfoList != null) {
-            final int subInfoLength = subInfoList.size();
+                SubscriptionManager.getActiveSubscriptionInfoList();
+        final int subInfoLength = subInfoList.size();
 
-            for (int i = 0; i < subInfoLength; ++i) {
-                final SubscriptionInfo sir = subInfoList.get(i);
-                if (sir != null && sir.getSubscriptionId() == subId) {
-                    return sir;
-                }
+        for (int i = 0; i < subInfoLength; ++i) {
+            final SubscriptionInfo sir = subInfoList.get(i);
+            if (sir != null && sir.getSubscriptionId() == subId) {
+                return sir;
             }
         }
 
@@ -1009,18 +1007,16 @@
      * finds a record with slotId.
      * Since the number of SIMs are few, an array is fine.
      */
-    public static SubscriptionInfo findRecordBySlotId(Context context, final int slotId) {
+    public static SubscriptionInfo findRecordBySlotId(final int slotId) {
         final List<SubscriptionInfo> subInfoList =
-                SubscriptionManager.from(context).getActiveSubscriptionInfoList();
-        if (subInfoList != null) {
-            final int subInfoLength = subInfoList.size();
+                SubscriptionManager.getActiveSubscriptionInfoList();
+        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/settings/deviceinfo/ImeiInformation.java b/src/com/android/settings/deviceinfo/ImeiInformation.java
index 72d3158..921ef8e 100644
--- a/src/com/android/settings/deviceinfo/ImeiInformation.java
+++ b/src/com/android/settings/deviceinfo/ImeiInformation.java
@@ -42,12 +42,9 @@
     private static final String KEY_IMEI = "imei";
     private static final String KEY_IMEI_SV = "imei_sv";
 
-    private SubscriptionManager mSubscriptionManager;
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mSubscriptionManager = SubscriptionManager.from(this);
         final TelephonyManager telephonyManager =
             (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
         initPreferenceScreen(telephonyManager.getSimCount());
@@ -103,17 +100,17 @@
         }
     }
 
-    private Phone getPhoneFromSlotId(int slotIdx) {
-        final SubscriptionInfo subInfo =
-                mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(slotIdx);
+    private Phone getPhoneFromSlotId(int slotId) {
+        final List<SubscriptionInfo> subInfos = SubscriptionManager.getSubscriptionInfoUsingSlotId(slotId);
 
-        if (subInfo == null) {
+        if (subInfos == null || subInfos.size() < 1) {
             return null;
         }
 
         final Phone[] phones = PhoneFactory.getPhones();
         for (int i = 0; i < phones.length; i++) {
-            if (phones[i].getSubId() == subInfo.getSubscriptionId()) {
+            // Currently we only operate with the first subscription of a SIM.
+            if (phones[i].getSubId() == subInfos.get(0).getSubscriptionId()) {
                 return phones[i];
             }
         }
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 11daf0c..46addf3 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -11,7 +11,7 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License.
+￼* limitations under the License.
  */
 
 package com.android.settings.deviceinfo;
@@ -143,7 +143,7 @@
         mSignalStrength = findPreference(KEY_SIGNAL_STRENGTH);
 
         for (int i = 0; i < mTelephonyManager.getSimCount(); i++) {
-            final SubscriptionInfo sir = Utils.findRecordBySlotId(this, i);
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(i);
             if (sir != null) {
                 mSelectableSubInfos.add(sir);
             }
@@ -355,7 +355,7 @@
         final Phone phone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(
                         mSir.getSubscriptionId()));
         if (UserHandle.myUserId() == UserHandle.USER_OWNER
-                && mSir.getSubscriptionId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                && mSir.getSubscriptionId() != SubscriptionManager.INVALID_SUB_ID) {
             if (phone == null) {
                 Log.e(TAG, "Unable to locate a phone object for the given Subscription ID.");
                 return;
diff --git a/src/com/android/settings/sim/SimBootReceiver.java b/src/com/android/settings/sim/SimBootReceiver.java
index f8d7106..2d9d15e 100644
--- a/src/com/android/settings/sim/SimBootReceiver.java
+++ b/src/com/android/settings/sim/SimBootReceiver.java
@@ -19,6 +19,8 @@
 import com.android.settings.R;
 import com.android.settings.Settings.SimSettingsActivity;
 
+import java.util.List;
+
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -29,9 +31,10 @@
 import android.content.res.Resources;
 import android.support.v4.app.NotificationCompat;
 import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.util.Log;
 
 import com.android.settings.Utils;
 
@@ -44,17 +47,16 @@
     private SharedPreferences mSharedPreferences = null;
     private TelephonyManager mTelephonyManager;
     private Context mContext;
-    private SubscriptionManager mSubscriptionManager;
 
     @Override
     public void onReceive(Context context, Intent intent) {
         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
         mContext = context;
-        mSubscriptionManager = SubscriptionManager.from(mContext);
         mSharedPreferences = mContext.getSharedPreferences(SHARED_PREFERENCES_NAME,
                 Context.MODE_PRIVATE);
 
-        mSubscriptionManager.registerOnSubscriptionsChangedListener(mSubscriptionListener);
+        SubscriptionManager.register(mContext, mSubscriptionListener,
+                SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
     }
 
     private void detectChangeAndNotify() {
@@ -69,12 +71,12 @@
         // by checking if the list is empty.
         // This is not completely correct, but works for most cases.
         // See Bug: 18377252
-        if (mSubscriptionManager.getActiveSubscriptionInfoList().size() < 1) {
+        if (SubscriptionManager.getActiveSubscriptionInfoList().size() < 1) {
             return;
         }
 
         for (int i = 0; i < numSlots; i++) {
-            final SubscriptionInfo sir = Utils.findRecordBySlotId(mContext, i);
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(i);
             final String key = SLOT_PREFIX+i;
             final int lastSubId = getLastSubId(key);
 
@@ -131,10 +133,9 @@
         notificationManager.cancel(NOTIFICATION_ID);
     }
 
-    private final OnSubscriptionsChangedListener mSubscriptionListener =
-            new OnSubscriptionsChangedListener() {
+    private final SubscriptionListener mSubscriptionListener = new SubscriptionListener() {
         @Override
-        public void onSubscriptionsChanged() {
+        public void onSubscriptionInfoChanged() {
             detectChangeAndNotify();
         }
     };
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index e0d26b0..e2f56cb 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -69,7 +69,6 @@
 
 public class SimSettings extends RestrictedSettingsFragment implements Indexable {
     private static final String TAG = "SimSettings";
-    private static final boolean DBG = false;
 
     private static final String DISALLOW_CONFIG_SIM = "no_config_sim";
     private static final String SIM_CARD_CATEGORY = "sim_cards";
@@ -119,9 +118,6 @@
 
     private PreferenceCategory mSimCards = null;
 
-    private SubscriptionManager mSubscriptionManager;
-    private Utils mUtils;
-
     public SimSettings() {
         super(DISALLOW_CONFIG_SIM);
     }
@@ -130,13 +126,9 @@
     public void onCreate(final Bundle bundle) {
         super.onCreate(bundle);
 
-        mSubscriptionManager = SubscriptionManager.from(getActivity());
-
         if (mSubInfoList == null) {
-            mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
-            // FIXME: b/18385348, SimSettings.java needs to handle null from getActiveSubscription
+            mSubInfoList = SubscriptionManager.getActiveSubscriptionInfoList();
         }
-        if (DBG) log("[onCreate] mSubInfoList=" + mSubInfoList);
 
         createPreferences();
         updateAllOptions();
@@ -156,7 +148,7 @@
         mAvailableSubInfos = new ArrayList<SubscriptionInfo>(numSlots);
         mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
         for (int i = 0; i < numSlots; ++i) {
-            final SubscriptionInfo sir = Utils.findRecordBySlotId(getActivity(), i);
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(i);
             mSimCards.addPreference(new SimPreference(getActivity(), sir, i));
             mAvailableSubInfos.add(sir);
             if (sir != null) {
@@ -174,7 +166,7 @@
 
         mAvailableSubInfos = new ArrayList<SubscriptionInfo>(numSlots);
         for (int i = 0; i < numSlots; ++i) {
-            final SubscriptionInfo sir = Utils.findRecordBySlotId(getActivity(), i);
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(i);
             mAvailableSubInfos.add(sir);
             if (sir != null) {
             }
@@ -187,7 +179,7 @@
     }
 
     private void updateSimSlotValues() {
-        mSubscriptionManager.getAllSubscriptionInfoList();
+        SubscriptionManager.getAllSubscriptionInfoList();
 
         final int prefSize = mSimCards.getPreferenceCount();
         for (int i = 0; i < prefSize; ++i) {
@@ -206,11 +198,9 @@
 
     private void updateSmsValues() {
         final Preference simPref = findPreference(KEY_SMS);
-        final SubscriptionInfo sir = Utils.findRecordBySubId(getActivity(),
-                mSubscriptionManager.getDefaultSmsSubId());
+        final SubscriptionInfo sir = Utils.findRecordBySubId(SubscriptionManager.getDefaultSmsSubId());
         simPref.setTitle(R.string.sms_messages_title);
-        if (DBG) log("[updateSmsValues] mSubInfoList=" + mSubInfoList);
-        if (mSubInfoList != null && mSubInfoList.size() == 1) {
+        if (mSubInfoList.size() == 1) {
             simPref.setSummary(mSubInfoList.get(0).getDisplayName());
         } else if (sir != null) {
             simPref.setSummary(sir.getDisplayName());
@@ -222,12 +212,9 @@
 
     private void updateCellularDataValues() {
         final Preference simPref = findPreference(KEY_CELLULAR_DATA);
-        final SubscriptionInfo sir = Utils.findRecordBySubId(getActivity(),
-                mSubscriptionManager.getDefaultDataSubId());
+        final SubscriptionInfo sir = Utils.findRecordBySubId(SubscriptionManager.getDefaultDataSubId());
         simPref.setTitle(R.string.cellular_data_title);
-        if (DBG) log("[updateCellularDataValues] mSubInfoList=" + mSubInfoList);
-
-        if (mSubInfoList != null && mSubInfoList.size() == 1) {
+        if (mSubInfoList.size() == 1) {
             simPref.setSummary(mSubInfoList.get(0).getDisplayName());
         } else if (sir != null) {
             simPref.setSummary(sir.getDisplayName());
@@ -253,9 +240,7 @@
     public void onResume() {
         super.onResume();
 
-        mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
-        if (DBG) log("[onResme] mSubInfoList=" + mSubInfoList);
-
+        mSubInfoList = SubscriptionManager.getActiveSubscriptionInfoList();
         updateAvailableSubInfos();
         updateAllOptions();
     }
@@ -290,7 +275,7 @@
 
                         if (id == DATA_PICK) {
                             sir = mSelectableSubInfos.get(value);
-                            mSubscriptionManager.setDefaultDataSubId(sir.getSubscriptionId());
+                            SubscriptionManager.setDefaultDataSubId(sir.getSubscriptionId());
                         } else if (id == CALLS_PICK) {
                             final TelecomManager telecomManager =
                                     TelecomManager.from(getActivity());
@@ -300,7 +285,7 @@
                                     value < 1 ? null : phoneAccountsList.get(value - 1));
                         } else if (id == SMS_PICK) {
                             sir = mSelectableSubInfos.get(value);
-                            mSubscriptionManager.setDefaultSmsSubId(sir.getSubscriptionId());
+                            SubscriptionManager.setDefaultSmsSubId(sir.getSubscriptionId());
                         }
 
                         updateActivitesCategory();
@@ -514,16 +499,16 @@
                     String displayName = nameText.getText().toString();
                     int subId = mSubInfoRecord.getSubscriptionId();
                     mSubInfoRecord.setDisplayName(displayName);
-                    mSubscriptionManager.setDisplayName(displayName, subId,
+                    SubscriptionManager.setDisplayName(displayName, subId,
                             SubscriptionManager.NAME_SOURCE_USER_INPUT);
-                    Utils.findRecordBySubId(getActivity(), subId).setDisplayName(displayName);
+                    Utils.findRecordBySubId(subId).setDisplayName(displayName);
 
                     final int tintSelected = tintSpinner.getSelectedItemPosition();
                     int subscriptionId = mSubInfoRecord.getSubscriptionId();
                     int tint = mTintArr[tintSelected];
                     mSubInfoRecord.setIconTint(tint);
-                    mSubscriptionManager.setIconTint(tint, subscriptionId);
-                    Utils.findRecordBySubId(getActivity(), subscriptionId).setIconTint(tint);
+                    SubscriptionManager.setIconTint(tint, subscriptionId);
+                    Utils.findRecordBySubId(subscriptionId).setIconTint(tint);
 
                     updateAllOptions();
                     update();
@@ -611,8 +596,27 @@
 
     }
 
-    private void log(String s) {
-        Log.d(TAG, s);
+    /**
+     * Sort Subscription List in SIM Id, Subscription Id
+     * @param context The Context
+     * @return Sorted Subscription List or NULL if no activated Subscription
+     */
+    public static List<SubscriptionInfo> getSortedSubInfoList(Context context) {
+        List<SubscriptionInfo> infoList = SubscriptionManager.getActiveSubscriptionInfoList();
+        if (infoList != null) {
+            Collections.sort(infoList, new Comparator<SubscriptionInfo>() {
+
+                @Override
+                public int compare(SubscriptionInfo arg0, SubscriptionInfo arg1) {
+                    int flag = arg0.getSimSlotIndex() - arg1.getSimSlotIndex();
+                    if (flag == 0) {
+                        return arg0.getSubscriptionId() - arg1.getSubscriptionId();
+                    }
+                    return flag;
+                }
+            });
+        }
+        return infoList;
     }
 
     /**
