diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 872de1a..e9aaf0f 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -88,6 +88,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.Preference;
+import android.telephony.SubInfoRecord;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -135,6 +137,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
+import com.android.settings.sim.SimSettings;
 import com.android.settings.widget.ChartDataUsageView;
 import com.android.settings.widget.ChartDataUsageView.DataUsageChartListener;
 import com.google.android.collect.Lists;
@@ -143,8 +146,11 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Panel showing data usage history across various networks, including options
@@ -261,6 +267,9 @@
     private MenuItem mMenuSimCards;
     private MenuItem mMenuCellularNetworks;
 
+    private List<SubInfoRecord> mSubInfoList;
+    private Map<Long,String> mMobileTagMap;
+
     /** Flag used to ignore listeners during binding. */
     private boolean mBinding;
 
@@ -283,6 +292,9 @@
         mPolicyEditor = new NetworkPolicyEditor(mPolicyManager);
         mPolicyEditor.read();
 
+        mSubInfoList = SimSettings.getSortedSubInfoList(getActivity());
+        mMobileTagMap = initMobileTabTag(mSubInfoList);
+
         try {
             if (!mNetworkService.isBandwidthControlEnabled()) {
                 Log.w(TAG, "No bandwidth control; leaving");
@@ -649,7 +661,7 @@
             mTabHost.addTab(buildTabSpec(TAB_3G, R.string.data_usage_tab_3g));
             mTabHost.addTab(buildTabSpec(TAB_4G, R.string.data_usage_tab_4g));
         } else if (hasReadyMobileRadio(context)) {
-            mTabHost.addTab(buildTabSpec(TAB_MOBILE, R.string.data_usage_tab_mobile));
+            addMobileTab(context, mSubInfoList);
         }
         if (mShowWifi && hasWifiRadio(context)) {
             mTabHost.addTab(buildTabSpec(TAB_WIFI, R.string.data_usage_tab_wifi));
@@ -695,6 +707,15 @@
                 mEmptyTabContent);
     }
 
+    /**
+     * Build {@link TabSpec} with thin indicator, and empty content.
+     */
+    private TabSpec buildTabSpec(String tag, String title) {
+        return mTabHost.newTabSpec(tag).setIndicator(title).setContent(
+                mEmptyTabContent);
+    }
+
+
     private OnTabChangeListener mTabListener = new OnTabChangeListener() {
         @Override
         public void onTabChanged(String tabId) {
@@ -733,11 +754,11 @@
 
         // TODO: remove mobile tabs when SIM isn't ready
 
-        if (TAB_MOBILE.equals(currentTab)) {
+        if (isMobileTab(currentTab)) {
             setPreferenceTitle(mDataEnabledView, R.string.data_usage_enable_mobile);
             setPreferenceTitle(mDisableAtLimitView, R.string.data_usage_disable_mobile_limit);
-            mTemplate = buildTemplateMobileAll(getActiveSubscriberId(context));
-
+            mTemplate = buildTemplateMobileAll(getActiveSubscriberId(context,getSubId(currentTab)));
+            mDataEnabledSupported = isMobileDataAvailable(getSubId(currentTab));
         } else if (TAB_3G.equals(currentTab)) {
             setPreferenceTitle(mDataEnabledView, R.string.data_usage_enable_3g);
             setPreferenceTitle(mDisableAtLimitView, R.string.data_usage_disable_3g_limit);
@@ -911,13 +932,18 @@
      */
     private Boolean mMobileDataEnabled;
 
-    private boolean isMobileDataEnabled() {
+    private boolean isMobileDataEnabled(long subId) {
+        boolean isEnable = false;
         if (mMobileDataEnabled != null) {
             // TODO: deprecate and remove this once enabled flag is on policy
-            return mMobileDataEnabled;
+            // Multiple Subscriptions, the value need to be reseted
+            isEnable = mMobileDataEnabled.booleanValue();
+            mMobileDataEnabled = null;
         } else {
-            return mTelephonyManager.getDataEnabled();
+            //SUB SELECT
+            isEnable = mTelephonyManager.getDataEnabled() && isMobileDataAvailable(subId);
         }
+        return isEnable;
     }
 
     private void setMobileDataEnabled(boolean enabled) {
@@ -974,14 +1000,15 @@
         }
 
         // TODO: move enabled state directly into policy
-        if (TAB_MOBILE.equals(mCurrentTab)) {
+        if (isMobileTab(mCurrentTab)) {
             mBinding = true;
-            mDataEnabled.setChecked(isMobileDataEnabled());
+            mDataEnabled.setChecked(isMobileDataEnabled(getSubId(mCurrentTab)));
             mBinding = false;
         }
 
         final NetworkPolicy policy = mPolicyEditor.getPolicy(mTemplate);
-        if (isNetworkPolicyModifiable(policy)) {
+        //SUB SELECT
+        if (isNetworkPolicyModifiable(policy) && isMobileDataAvailable(getSubId(mCurrentTab))) {
             mDisableAtLimit.setChecked(policy != null && policy.limitBytes != LIMIT_DISABLED);
             if (!isAppDetailMode()) {
                 mChart.bindNetworkPolicy(policy);
@@ -1082,7 +1109,7 @@
 
             final boolean dataEnabled = !mDataEnabled.isChecked();
             final String currentTab = mCurrentTab;
-            if (TAB_MOBILE.equals(currentTab)) {
+            if (isMobileTab(currentTab)) {
                 if (dataEnabled) {
                     setMobileDataEnabled(true);
                 } else {
@@ -1225,7 +1252,7 @@
         final String totalPhrase = Formatter.formatFileSize(context, totalBytes);
         mCycleSummary.setText(totalPhrase);
 
-        if (TAB_MOBILE.equals(mCurrentTab) || TAB_3G.equals(mCurrentTab)
+        if (isMobileTab(mCurrentTab) || TAB_3G.equals(mCurrentTab)
                 || TAB_4G.equals(mCurrentTab)) {
             if (isAppDetailMode()) {
                 mDisclaimer.setVisibility(View.GONE);
@@ -1325,6 +1352,11 @@
         return SystemProperties.get(TEST_SUBSCRIBER_PROP, actualSubscriberId);
     }
 
+    private static String getActiveSubscriberId(Context context, long subId) {
+        final TelephonyManager tele = TelephonyManager.from(context);
+        return tele.getSubscriberId(subId);
+    }
+
     private DataUsageChartListener mChartListener = new DataUsageChartListener() {
         @Override
         public void onWarningChanged() {
@@ -1806,7 +1838,7 @@
             } else if (TAB_4G.equals(currentTab)) {
                 message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = Math.max(5 * GB_IN_BYTES, minLimitBytes);
-            } else if (TAB_MOBILE.equals(currentTab)) {
+            } else if (isMobileTab(currentTab)) {
                 message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = Math.max(5 * GB_IN_BYTES, minLimitBytes);
             } else {
@@ -2176,7 +2208,14 @@
      */
     private static String computeTabFromIntent(Intent intent) {
         final NetworkTemplate template = intent.getParcelableExtra(EXTRA_NETWORK_TEMPLATE);
-        if (template == null) return null;
+        if (template == null) {
+            final long subId = intent.getLongExtra(PhoneConstants.SUBSCRIPTION_KEY,
+                    SubscriptionManager.INVALID_SUB_ID);
+            if (SubscriptionManager.isValidSubId(subId)) {
+                return TAB_MOBILE + String.valueOf(subId);
+            }
+            return null;
+        }
 
         switch (template.getMatchRule()) {
             case MATCH_MOBILE_3G_LOWER:
@@ -2264,8 +2303,33 @@
         final ConnectivityManager conn = ConnectivityManager.from(context);
         final TelephonyManager tele = TelephonyManager.from(context);
 
+        final List<SubInfoRecord> subInfoList = SubscriptionManager.getActiveSubInfoList();
+        // No activated Subscription
+        if (subInfoList == null) {
+            return false;
+        }
         // require both supported network and ready SIM
-        return conn.isNetworkSupported(TYPE_MOBILE) && tele.getSimState() == SIM_STATE_READY;
+        boolean isReady = true;
+        for (SubInfoRecord subInfo : subInfoList) {
+            isReady = isReady & tele.getSimState(subInfo.slotId) == SIM_STATE_READY;
+        }
+        return conn.isNetworkSupported(TYPE_MOBILE) && isReady;
+    }
+
+    /*
+     * TODO: consider adding to TelephonyManager or SubscritpionManager.
+     */
+    public static boolean hasReadyMobileRadio(Context context, long subId) {
+        if (TEST_RADIOS) {
+            return SystemProperties.get(TEST_RADIOS_PROP).contains("mobile");
+        }
+
+        final ConnectivityManager conn = ConnectivityManager.from(context);
+        final TelephonyManager tele = TelephonyManager.from(context);
+        final int slotId = SubscriptionManager.getSlotId(subId);
+        final boolean isReady = tele.getSimState(slotId) == SIM_STATE_READY;
+
+        return conn.isNetworkSupported(TYPE_MOBILE) && isReady;
     }
 
     /**
@@ -2485,4 +2549,53 @@
             }
         };
 
+        private void addMobileTab(Context context, List<SubInfoRecord> subInfoList) {
+            if (subInfoList != null) {
+                for (SubInfoRecord subInfo : mSubInfoList) {
+                    if (hasReadyMobileRadio(context,subInfo.subId)) {
+                        mTabHost.addTab(buildTabSpec(mMobileTagMap.get(subInfo.subId),
+                                subInfo.displayName));
+                    }
+                }
+            }
+        }
+
+        /**
+         * Init a map with subId key and mobile tag name
+         * @param subInfoList The subscription Info List
+         * @return The map or null if no activated subscription
+         */
+        private Map<Long, String> initMobileTabTag(List<SubInfoRecord> subInfoList) {
+            Map<Long,String> map = null;
+            if (subInfoList != null) {
+                String mobileTag;
+                map = new HashMap<Long, String>();
+                for (SubInfoRecord subInfo : subInfoList) {
+                    mobileTag = TAB_MOBILE + String.valueOf(subInfo.subId);
+                    map.put(subInfo.subId,mobileTag);
+                }
+            }
+            return map;
+        }
+
+        private static boolean isMobileTab(String currentTab) {
+            return currentTab != null ? currentTab.contains(TAB_MOBILE) : false;
+        }
+
+        private long getSubId(String currentTab) {
+            Set<Long> set = mMobileTagMap.keySet();
+            for (Long subId : set) {
+                if (mMobileTagMap.get(subId).equals(currentTab)) {
+                    return subId;
+                }
+            }
+            Log.e(TAG, "currentTab = " + currentTab + " non mobile tab called this function");
+            return -1;
+        }
+
+        //SUB SELECT
+        private boolean isMobileDataAvailable(long subId) {
+            long[] subIds = SubscriptionManager.getSubId(PhoneConstants.SUB1);
+            return subIds[0] == subId;
+        }
 }
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 46a3c8e..b068c51 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -43,6 +43,8 @@
 import android.security.KeyStore;
 import android.service.trust.TrustAgentService;
 import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubInfoRecord;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -299,13 +301,8 @@
         if (!mIsPrimary || !tm.hasIccCard()) {
             root.removePreference(root.findPreference(KEY_SIM_LOCK));
         } else {
-            // Disable SIM lock if sim card is missing or unknown
-            if ((TelephonyManager.getDefault().getSimState() ==
-                                 TelephonyManager.SIM_STATE_ABSENT) ||
-                (TelephonyManager.getDefault().getSimState() ==
-                                 TelephonyManager.SIM_STATE_UNKNOWN)) {
-                root.findPreference(KEY_SIM_LOCK).setEnabled(false);
-            }
+            // Disable SIM lock if there is no ready SIM card.
+            root.findPreference(KEY_SIM_LOCK).setEnabled(isSimReady());
         }
         if (Settings.System.getInt(getContentResolver(),
                 Settings.System.LOCK_TO_APP_ENABLED, 0) != 0) {
@@ -372,6 +369,24 @@
         return root;
     }
 
+    /* Return true if a SIM is ready for locking.
+     * TODO: consider adding to TelephonyManager or SubscritpionManasger.
+     */
+    private static boolean isSimReady() {
+        int simState = TelephonyManager.SIM_STATE_UNKNOWN;
+        final List<SubInfoRecord> subInfoList = SubscriptionManager.getActiveSubInfoList();
+        if (subInfoList != null) {
+            for (SubInfoRecord subInfo : subInfoList) {
+                simState = TelephonyManager.getDefault().getSimState(subInfo.slotId);
+                if((simState != TelephonyManager.SIM_STATE_ABSENT) &&
+                            (simState != TelephonyManager.SIM_STATE_UNKNOWN)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     private static ArrayList<TrustAgentComponentInfo> getActiveTrustAgents(
             PackageManager pm, LockPatternUtils utils) {
         ArrayList<TrustAgentComponentInfo> result = new ArrayList<TrustAgentComponentInfo>();
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index a46df0a..5c7a456 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -876,9 +876,7 @@
         final TelephonyManager tm =
                 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
 
-        // TODO: Uncomment to re-enable SimSettings.
         return tm.getSimCount() > 0;
-        //return false;
     }
 
     /**
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 2c3d827..94cd6ed 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -36,21 +36,12 @@
 import android.os.UserHandle;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
-import android.telephony.CellBroadcastMessage;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.PhoneStateListener;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ListAdapter;
 import android.widget.Toast;
 
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.PhoneFactory;
-import com.android.internal.telephony.PhoneStateIntentReceiver;
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -59,13 +50,6 @@
 
 /**
  * Display the following information
- * # Phone Number
- * # Network
- * # Roaming
- * # Device Id (IMEI in GSM and MEID in CDMA)
- * # Network type
- * # Operator info (area info cell broadcast for Brazil)
- * # Signal Strength
  * # Battery Strength  : TODO
  * # Uptime
  * # Awake Time
@@ -74,53 +58,14 @@
  */
 public class Status extends PreferenceActivity {
 
-    private static final String KEY_DATA_STATE = "data_state";
-    private static final String KEY_SERVICE_STATE = "service_state";
-    private static final String KEY_OPERATOR_NAME = "operator_name";
-    private static final String KEY_ROAMING_STATE = "roaming_state";
-    private static final String KEY_NETWORK_TYPE = "network_type";
-    private static final String KEY_LATEST_AREA_INFO = "latest_area_info";
-    private static final String KEY_PHONE_NUMBER = "number";
-    private static final String KEY_IMEI_SV = "imei_sv";
-    private static final String KEY_IMEI = "imei";
-    private static final String KEY_PRL_VERSION = "prl_version";
-    private static final String KEY_MIN_NUMBER = "min_number";
-    private static final String KEY_MEID_NUMBER = "meid_number";
-    private static final String KEY_SIGNAL_STRENGTH = "signal_strength";
     private static final String KEY_BATTERY_STATUS = "battery_status";
     private static final String KEY_BATTERY_LEVEL = "battery_level";
     private static final String KEY_IP_ADDRESS = "wifi_ip_address";
     private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
     private static final String KEY_BT_ADDRESS = "bt_address";
     private static final String KEY_SERIAL_NUMBER = "serial_number";
-    private static final String KEY_ICC_ID = "icc_id";
     private static final String KEY_WIMAX_MAC_ADDRESS = "wimax_mac_address";
-    private static final String[] PHONE_RELATED_ENTRIES = {
-        KEY_DATA_STATE,
-        KEY_SERVICE_STATE,
-        KEY_OPERATOR_NAME,
-        KEY_ROAMING_STATE,
-        KEY_NETWORK_TYPE,
-        KEY_LATEST_AREA_INFO,
-        KEY_PHONE_NUMBER,
-        KEY_IMEI,
-        KEY_IMEI_SV,
-        KEY_PRL_VERSION,
-        KEY_MIN_NUMBER,
-        KEY_MEID_NUMBER,
-        KEY_SIGNAL_STRENGTH,
-        KEY_ICC_ID
-    };
-
-    static final String CB_AREA_INFO_RECEIVED_ACTION =
-            "android.cellbroadcastreceiver.CB_AREA_INFO_RECEIVED";
-
-    static final String GET_LATEST_CB_AREA_INFO_ACTION =
-            "android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO";
-
-    // Require the sender to have this permission to prevent third-party spoofing.
-    static final String CB_AREA_INFO_SENDER_PERMISSION =
-            "android.permission.RECEIVE_EMERGENCY_BROADCAST";
+    private static final String KEY_SIM_STATUS = "sim_status";
 
     // Broadcasts to listen to for connectivity changes.
     private static final String[] CONNECTIVITY_INTENTS = {
@@ -130,26 +75,18 @@
             WifiManager.NETWORK_STATE_CHANGED_ACTION,
     };
 
-    private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200;
-    private static final int EVENT_SERVICE_STATE_CHANGED = 300;
-
     private static final int EVENT_UPDATE_STATS = 500;
 
     private static final int EVENT_UPDATE_CONNECTIVITY = 600;
 
     private ConnectivityManager mCM;
-    private TelephonyManager mTelephonyManager;
     private WifiManager mWifiManager;
 
-    private Phone mPhone = null;
-    private PhoneStateIntentReceiver mPhoneStateReceiver;
     private Resources mRes;
-    private boolean mShowLatestAreaInfo;
 
     private String mUnknown;
     private String mUnavailable;
 
-    private Preference mSignalStrength;
     private Preference mUptime;
     private Preference mBatteryStatus;
     private Preference mBatteryLevel;
@@ -175,15 +112,6 @@
             }
 
             switch (msg.what) {
-                case EVENT_SIGNAL_STRENGTH_CHANGED:
-                    status.updateSignalStrength();
-                    break;
-
-                case EVENT_SERVICE_STATE_CHANGED:
-                    ServiceState serviceState = status.mPhoneStateReceiver.getServiceState();
-                    status.updateServiceState(serviceState);
-                    break;
-
                 case EVENT_UPDATE_STATS:
                     status.updateTimes();
                     sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
@@ -208,32 +136,6 @@
         }
     };
 
-    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
-        @Override
-        public void onDataConnectionStateChanged(int state) {
-            updateDataState();
-            updateNetworkType();
-        }
-    };
-
-    private BroadcastReceiver mAreaInfoReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (CB_AREA_INFO_RECEIVED_ACTION.equals(action)) {
-                Bundle extras = intent.getExtras();
-                if (extras == null) {
-                    return;
-                }
-                CellBroadcastMessage cbMessage = (CellBroadcastMessage) extras.get("message");
-                if (cbMessage != null && cbMessage.getServiceCategory() == 50) {
-                    String latestAreaInfo = cbMessage.getMessageBody();
-                    updateAreaInfo(latestAreaInfo);
-                }
-            }
-        }
-    };
-
     private IntentFilter mConnectivityIntentFilter;
     private final BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {
         @Override
@@ -260,7 +162,6 @@
         mHandler = new MyHandler(this);
 
         mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
-        mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
         mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
 
         addPreferencesFromResource(R.xml.device_info_status);
@@ -275,76 +176,9 @@
         mUnknown = mRes.getString(R.string.device_info_default);
         mUnavailable = mRes.getString(R.string.status_unavailable);
 
-        if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
-            mPhone = PhoneFactory.getDefaultPhone();
-        }
         // Note - missing in zaku build, be careful later...
-        mSignalStrength = findPreference(KEY_SIGNAL_STRENGTH);
         mUptime = findPreference("up_time");
 
-        if (mPhone == null || Utils.isWifiOnly(getApplicationContext())) {
-            for (String key : PHONE_RELATED_ENTRIES) {
-                removePreferenceFromScreen(key);
-            }
-        } else {
-            // NOTE "imei" is the "Device ID" since it represents
-            //  the IMEI in GSM and the MEID in CDMA
-            if (mPhone.getPhoneName().equals("CDMA")) {
-                setSummaryText(KEY_MEID_NUMBER, mPhone.getMeid());
-                setSummaryText(KEY_MIN_NUMBER, mPhone.getCdmaMin());
-                if (getResources().getBoolean(R.bool.config_msid_enable)) {
-                    findPreference(KEY_MIN_NUMBER).setTitle(R.string.status_msid_number);
-                }
-                setSummaryText(KEY_PRL_VERSION, mPhone.getCdmaPrlVersion());
-                removePreferenceFromScreen(KEY_IMEI_SV);
-
-                if (mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) {
-                    // Show ICC ID and IMEI for LTE device
-                    setSummaryText(KEY_ICC_ID, mPhone.getIccSerialNumber());
-                    setSummaryText(KEY_IMEI, mPhone.getImei());
-                } else {
-                    // device is not GSM/UMTS, do not display GSM/UMTS features
-                    // check Null in case no specified preference in overlay xml
-                    removePreferenceFromScreen(KEY_IMEI);
-                    removePreferenceFromScreen(KEY_ICC_ID);
-                }
-            } else {
-                setSummaryText(KEY_IMEI, mPhone.getDeviceId());
-
-                setSummaryText(KEY_IMEI_SV,
-                        ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
-                            .getDeviceSoftwareVersion());
-
-                // device is not CDMA, do not display CDMA features
-                // check Null in case no specified preference in overlay xml
-                removePreferenceFromScreen(KEY_PRL_VERSION);
-                removePreferenceFromScreen(KEY_MEID_NUMBER);
-                removePreferenceFromScreen(KEY_MIN_NUMBER);
-                removePreferenceFromScreen(KEY_ICC_ID);
-
-                // only show area info when SIM country is Brazil
-                if ("br".equals(mTelephonyManager.getSimCountryIso())) {
-                    mShowLatestAreaInfo = true;
-                }
-            }
-
-            String rawNumber = mTelephonyManager.getLine1Number();  // may be null or empty
-            String formattedNumber = null;
-            if (!TextUtils.isEmpty(rawNumber)) {
-                formattedNumber = PhoneNumberUtils.formatNumber(rawNumber);
-            }
-            // If formattedNumber is null or empty, it'll display as "Unknown".
-            setSummaryText(KEY_PHONE_NUMBER, formattedNumber);
-
-            mPhoneStateReceiver = new PhoneStateIntentReceiver(this, mHandler);
-            mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED);
-            mPhoneStateReceiver.notifyServiceState(EVENT_SERVICE_STATE_CHANGED);
-
-            if (!mShowLatestAreaInfo) {
-                removePreferenceFromScreen(KEY_LATEST_AREA_INFO);
-            }
-        }
-
         if (!hasBluetooth()) {
             getPreferenceScreen().removePreference(mBtAddress);
             mBtAddress = null;
@@ -394,24 +228,6 @@
     @Override
     protected void onResume() {
         super.onResume();
-
-        if (mPhone != null && !Utils.isWifiOnly(getApplicationContext())) {
-            mPhoneStateReceiver.registerIntent();
-
-            updateSignalStrength();
-            updateServiceState(mPhone.getServiceState());
-            updateDataState();
-            mTelephonyManager.listen(mPhoneStateListener,
-                    PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
-            if (mShowLatestAreaInfo) {
-                registerReceiver(mAreaInfoReceiver, new IntentFilter(CB_AREA_INFO_RECEIVED_ACTION),
-                        CB_AREA_INFO_SENDER_PERMISSION, null);
-                // Ask CellBroadcastReceiver to broadcast the latest area info received
-                Intent getLatestIntent = new Intent(GET_LATEST_CB_AREA_INFO_ACTION);
-                sendBroadcastAsUser(getLatestIntent, UserHandle.ALL,
-                        CB_AREA_INFO_SENDER_PERMISSION);
-            }
-        }
         registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
                          android.Manifest.permission.CHANGE_NETWORK_STATE, null);
         registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
@@ -422,13 +238,6 @@
     public void onPause() {
         super.onPause();
 
-        if (mPhone != null && !Utils.isWifiOnly(getApplicationContext())) {
-            mPhoneStateReceiver.unregisterIntent();
-            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
-        }
-        if (mShowLatestAreaInfo) {
-            unregisterReceiver(mAreaInfoReceiver);
-        }
         unregisterReceiver(mBatteryInfoReceiver);
         unregisterReceiver(mConnectivityReceiver);
         mHandler.removeMessages(EVENT_UPDATE_STATS);
@@ -469,100 +278,6 @@
              }
     }
 
-    private void updateNetworkType() {
-        // Whether EDGE, UMTS, etc...
-        String networktype = null;
-        if (TelephonyManager.NETWORK_TYPE_UNKNOWN != mTelephonyManager.getNetworkType()) {
-            networktype = mTelephonyManager.getNetworkTypeName();
-        }
-        setSummaryText(KEY_NETWORK_TYPE, networktype);
-    }
-
-    private void updateDataState() {
-        int state = mTelephonyManager.getDataState();
-        String display = mRes.getString(R.string.radioInfo_unknown);
-
-        switch (state) {
-            case TelephonyManager.DATA_CONNECTED:
-                display = mRes.getString(R.string.radioInfo_data_connected);
-                break;
-            case TelephonyManager.DATA_SUSPENDED:
-                display = mRes.getString(R.string.radioInfo_data_suspended);
-                break;
-            case TelephonyManager.DATA_CONNECTING:
-                display = mRes.getString(R.string.radioInfo_data_connecting);
-                break;
-            case TelephonyManager.DATA_DISCONNECTED:
-                display = mRes.getString(R.string.radioInfo_data_disconnected);
-                break;
-        }
-
-        setSummaryText(KEY_DATA_STATE, display);
-    }
-
-    private void updateServiceState(ServiceState serviceState) {
-        int state = serviceState.getState();
-        String display = mRes.getString(R.string.radioInfo_unknown);
-
-        switch (state) {
-            case ServiceState.STATE_IN_SERVICE:
-                display = mRes.getString(R.string.radioInfo_service_in);
-                break;
-            case ServiceState.STATE_OUT_OF_SERVICE:
-            case ServiceState.STATE_EMERGENCY_ONLY:
-                display = mRes.getString(R.string.radioInfo_service_out);
-                break;
-            case ServiceState.STATE_POWER_OFF:
-                display = mRes.getString(R.string.radioInfo_service_off);
-                break;
-        }
-
-        setSummaryText(KEY_SERVICE_STATE, display);
-
-        if (serviceState.getRoaming()) {
-            setSummaryText(KEY_ROAMING_STATE, mRes.getString(R.string.radioInfo_roaming_in));
-        } else {
-            setSummaryText(KEY_ROAMING_STATE, mRes.getString(R.string.radioInfo_roaming_not));
-        }
-        setSummaryText(KEY_OPERATOR_NAME, serviceState.getOperatorAlphaLong());
-    }
-
-    private void updateAreaInfo(String areaInfo) {
-        if (areaInfo != null) {
-            setSummaryText(KEY_LATEST_AREA_INFO, areaInfo);
-        }
-    }
-
-    void updateSignalStrength() {
-        // TODO PhoneStateIntentReceiver is deprecated and PhoneStateListener
-        // should probably used instead.
-
-        // not loaded in some versions of the code (e.g., zaku)
-        if (mSignalStrength != null) {
-            int state =
-                    mPhoneStateReceiver.getServiceState().getState();
-            Resources r = getResources();
-
-            if ((ServiceState.STATE_OUT_OF_SERVICE == state) ||
-                    (ServiceState.STATE_POWER_OFF == state)) {
-                mSignalStrength.setSummary("0");
-            }
-
-            int signalDbm = mPhoneStateReceiver.getSignalStrengthDbm();
-
-            if (-1 == signalDbm) signalDbm = 0;
-
-            int signalAsu = mPhoneStateReceiver.getSignalStrengthLevelAsu();
-
-            if (-1 == signalAsu) signalAsu = 0;
-
-            mSignalStrength.setSummary(String.valueOf(signalDbm) + " "
-                        + r.getString(R.string.radioInfo_display_dbm) + "   "
-                        + String.valueOf(signalAsu) + " "
-                        + r.getString(R.string.radioInfo_display_asu));
-        }
-    }
-
     private void setWimaxStatus() {
         if (mWimaxMacAddress != null) {
             String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index a49ede6..b0cce25 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -20,24 +20,31 @@
 import com.android.settings.R;
 
 import android.app.AlertDialog;
+import android.app.Fragment;
 import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.ContentUris;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.DialogInterface;
 import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.preference.ListPreference;
 import android.preference.Preference;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceCategory;
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceScreen;
+import android.provider.Telephony;
 import android.telephony.SubInfoRecord;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.PhoneNumberUtils;
 import android.telecom.PhoneAccount;
 import android.telephony.CellInfo;
 import android.text.TextUtils;
@@ -53,6 +60,7 @@
 import android.widget.TextView;
 
 import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.settings.RestrictedSettingsFragment;
 import com.android.settings.SettingsPreferenceFragment;
@@ -64,6 +72,8 @@
 import com.android.settings.search.SearchIndexableRaw;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 public class SimSettings extends RestrictedSettingsFragment implements Indexable {
@@ -75,9 +85,31 @@
     private static final String KEY_CALLS = "sim_calls";
     private static final String KEY_SMS = "sim_sms";
     private static final String KEY_ACTIVITIES = "activities";
+    private static final int ID_INDEX = 0;
+    private static final int NAME_INDEX = 1;
+    private static final int APN_INDEX = 2;
+    private static final int PROXY_INDEX = 3;
+    private static final int PORT_INDEX = 4;
+    private static final int USER_INDEX = 5;
+    private static final int SERVER_INDEX = 6;
+    private static final int PASSWORD_INDEX = 7;
+    private static final int MMSC_INDEX = 8;
+    private static final int MCC_INDEX = 9;
+    private static final int MNC_INDEX = 10;
+    private static final int NUMERIC_INDEX = 11;
+    private static final int MMSPROXY_INDEX = 12;
+    private static final int MMSPORT_INDEX = 13;
+    private static final int AUTH_TYPE_INDEX = 14;
+    private static final int TYPE_INDEX = 15;
+    private static final int PROTOCOL_INDEX = 16;
+    private static final int CARRIER_ENABLED_INDEX = 17;
+    private static final int BEARER_INDEX = 18;
+    private static final int ROAMING_PROTOCOL_INDEX = 19;
+    private static final int MVNO_TYPE_INDEX = 20;
+    private static final int MVNO_MATCH_DATA_INDEX = 21;
 
     /**
-     * By UX design we have use only one Subscription Information(SubInfo) record per SIM slot.
+     * By UX design we use only one Subscription Information(SubInfo) record per SIM slot.
      * mAvalableSubInfos is the list of SubInfos we present to the user.
      * mSubInfoList is the list of all SubInfos.
      */
@@ -88,7 +120,36 @@
     private SubInfoRecord mCalls = null;
     private SubInfoRecord mSMS = null;
 
+    private PreferenceCategory mSimCards = null;
+
     private int mNumSims;
+    /**
+     * Standard projection for the interesting columns of a normal note.
+     */
+    private static final String[] sProjection = new String[] {
+            Telephony.Carriers._ID,     // 0
+            Telephony.Carriers.NAME,    // 1
+            Telephony.Carriers.APN,     // 2
+            Telephony.Carriers.PROXY,   // 3
+            Telephony.Carriers.PORT,    // 4
+            Telephony.Carriers.USER,    // 5
+            Telephony.Carriers.SERVER,  // 6
+            Telephony.Carriers.PASSWORD, // 7
+            Telephony.Carriers.MMSC, // 8
+            Telephony.Carriers.MCC, // 9
+            Telephony.Carriers.MNC, // 10
+            Telephony.Carriers.NUMERIC, // 11
+            Telephony.Carriers.MMSPROXY,// 12
+            Telephony.Carriers.MMSPORT, // 13
+            Telephony.Carriers.AUTH_TYPE, // 14
+            Telephony.Carriers.TYPE, // 15
+            Telephony.Carriers.PROTOCOL, // 16
+            Telephony.Carriers.CARRIER_ENABLED, // 17
+            Telephony.Carriers.BEARER, // 18
+            Telephony.Carriers.ROAMING_PROTOCOL, // 19
+            Telephony.Carriers.MVNO_TYPE,   // 20
+            Telephony.Carriers.MVNO_MATCH_DATA  // 21
+    };
 
     public SimSettings() {
         super(DISALLOW_CONFIG_SIM);
@@ -112,14 +173,14 @@
 
         addPreferencesFromResource(R.xml.sim_settings);
 
-        final PreferenceCategory simCards = (PreferenceCategory)findPreference(SIM_CARD_CATEGORY);
+        mSimCards = (PreferenceCategory)findPreference(SIM_CARD_CATEGORY);
 
         final int numSlots = tm.getSimCount();
         mAvailableSubInfos = new ArrayList<SubInfoRecord>(numSlots);
         mNumSims = 0;
         for (int i = 0; i < numSlots; ++i) {
             final SubInfoRecord sir = findRecordBySlotId(i);
-            simCards.addPreference(new SimPreference(getActivity(), sir, i));
+            mSimCards.addPreference(new SimPreference(getActivity(), sir, i));
             mAvailableSubInfos.add(sir);
             if (sir != null) {
                 mNumSims++;
@@ -129,6 +190,22 @@
         updateActivitesCategory();
     }
 
+    private void updateAvailableSubInfos(){
+        final TelephonyManager tm =
+            (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
+        final int numSlots = tm.getSimCount();
+
+        mNumSims = 0;
+        mAvailableSubInfos = new ArrayList<SubInfoRecord>(numSlots);
+        for (int i = 0; i < numSlots; ++i) {
+            final SubInfoRecord sir = findRecordBySlotId(i);
+            mAvailableSubInfos.add(sir);
+            if (sir != null) {
+                mNumSims++;
+            }
+        }
+    }
+
     private void updateAllOptions() {
         updateSimSlotValues();
         updateActivitesCategory();
@@ -136,12 +213,10 @@
 
     private void updateSimSlotValues() {
         SubscriptionManager.getAllSubInfoList();
-        final PreferenceCategory simCards = (PreferenceCategory)findPreference(SIM_CARD_CATEGORY);
-        final PreferenceScreen prefScreen = getPreferenceScreen();
 
-        final int prefSize = prefScreen.getPreferenceCount();
+        final int prefSize = mSimCards.getPreferenceCount();
         for (int i = 0; i < prefSize; ++i) {
-            Preference pref = prefScreen.getPreference(i);
+            Preference pref = mSimCards.getPreference(i);
             if (pref instanceof SimPreference) {
                 ((SimPreference)pref).update();
             }
@@ -198,7 +273,9 @@
     private void updateSmsValues() {
         final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_SMS);
         final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultSmsSubId());
-        if (sir != null) {
+        if (mSubInfoList.size() == 1) {
+            simPref.setSelectedItem(mSubInfoList.get(0).slotId + 1);
+        } else if (sir != null) {
             simPref.setSelectedItem(sir.slotId + 1);
         }
         simPref.setEnabled(mNumSims >= 1);
@@ -207,7 +284,9 @@
     private void updateCellularDataValues() {
         final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_CELLULAR_DATA);
         final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultDataSubId());
-        if (sir != null) {
+        if (mSubInfoList.size() == 1) {
+            simPref.setSelectedItem(mSubInfoList.get(0).slotId);
+        } else if (sir != null) {
             simPref.setSelectedItem(sir.slotId);
         }
         simPref.setEnabled(mNumSims >= 1);
@@ -216,7 +295,9 @@
     private void updateCallValues() {
         final DropDownPreference simPref = (DropDownPreference) findPreference(KEY_CALLS);
         final SubInfoRecord sir = findRecordBySubId(SubscriptionManager.getDefaultVoiceSubId());
-        if (sir != null) {
+        if (mSubInfoList.size() == 1) {
+            simPref.setSelectedItem(mSubInfoList.get(0).slotId + 1);
+        } else if (sir != null) {
             simPref.setSelectedItem(sir.slotId + 1);
         }
         simPref.setEnabled(mNumSims >= 1);
@@ -225,6 +306,9 @@
     @Override
     public void onResume() {
         super.onResume();
+
+        mSubInfoList = SubscriptionManager.getActiveSubInfoList();
+        updateAvailableSubInfos();
         updateAllOptions();
     }
 
@@ -318,6 +402,31 @@
             }
         }
 
+        public String getCarrierName() {
+            Uri mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, mSubInfoRecord.subId);
+            Cursor mCursor = getActivity().managedQuery(mUri, sProjection, null, null);
+            mCursor.moveToFirst();
+            return mCursor.getString(1);
+        }
+
+        public String getFormattedPhoneNumber() {
+            try{
+                final String rawNumber = PhoneFactory.getPhone(mSlotId).getLine1Number();
+                String formattedNumber = null;
+                if (!TextUtils.isEmpty(rawNumber)) {
+                    formattedNumber = PhoneNumberUtils.formatNumber(rawNumber);
+                }
+
+                return formattedNumber;
+            } catch (java.lang.IllegalStateException ise){
+                return "Unknown";
+            }
+        }
+
+        public SubInfoRecord getSubInfoRecord() {
+            return mSubInfoRecord;
+        }
+
         public void createEditDialog(SimPreference simPref) {
             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 
@@ -329,10 +438,10 @@
             nameText.setText(mSubInfoRecord.displayName);
 
             TextView numberView = (TextView)dialogLayout.findViewById(R.id.number);
-            numberView.setText(mSubInfoRecord.number);
+            numberView.setText(simPref.getFormattedPhoneNumber());
 
             TextView carrierView = (TextView)dialogLayout.findViewById(R.id.carrier);
-            carrierView.setText(mSubInfoRecord.displayName);
+            carrierView.setText(getCarrierName());
 
             builder.setTitle(R.string.sim_editor_title);
 
@@ -369,6 +478,29 @@
     }
 
     /**
+     * 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<SubInfoRecord> getSortedSubInfoList(Context context) {
+        List<SubInfoRecord> infoList = SubscriptionManager.getActiveSubInfoList();
+        if (infoList != null) {
+            Collections.sort(infoList, new Comparator<SubInfoRecord>() {
+
+                @Override
+                public int compare(SubInfoRecord arg0, SubInfoRecord arg1) {
+                    int flag = arg0.slotId - arg1.slotId;
+                    if (flag == 0) {
+                        return (int) (arg0.subId - arg1.subId);
+                    }
+                    return flag;
+                }
+            });
+        }
+        return infoList;
+    }
+
+    /**
      * For search
      */
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
