diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1162273..6647c6a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5545,8 +5545,6 @@
     <string name="sim_no_inserted_msg">No SIM cards inserted</string>
     <!-- SIM status title  [CHAR LIMIT=40] -->
     <string name="sim_status_title">SIM status</string>
-    <!-- SIM status summary [CHAR LIMIT=60] -->
-    <string name="sim_status_summary">SIM related information</string>
     <!-- Title for call back. [CHAR LIMIT=60] -->
     <string name="sim_call_back_title">Call back from default SIM</string>
     <!-- Title for outgoing back. [CHAR LIMIT=60] -->
@@ -5978,8 +5976,6 @@
     <!-- Title and summary for SIM Status -->
     <!-- Title for IMEI preference [CHAR LIMIT=30] -->
     <string name="imei_information_title">IMEI information</string>
-    <!-- Description for IMEI preference [CHAR LIMIT=40] -->
-    <string name="imei_information_summary">IMEI relative information</string>
 
     <!-- Encryption interstitial title [CHAR LIMIT=30] -->
     <string name="encryption_interstitial_header">Encryption</string>
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
index 26b067b..fc6016f 100644
--- a/res/xml/device_info_status.xml
+++ b/res/xml/device_info_status.xml
@@ -29,14 +29,12 @@
         android:persistent="false" />
     <PreferenceScreen android:key="sim_status"
         android:title="@string/sim_status_title"
-        android:summary="@string/sim_status_summary"
         android:persistent="false">
         <intent android:targetPackage="com.android.settings"
             android:targetClass="com.android.settings.deviceinfo.SimStatus" />
     </PreferenceScreen>
     <PreferenceScreen android:key="imei_info"
         android:title="@string/imei_information_title"
-        android:summary="@string/imei_information_summary"
         android:persistent="false">
         <intent android:targetPackage="com.android.settings"
             android:targetClass="com.android.settings.deviceinfo.ImeiInformation" />
diff --git a/res/xml/sim_lock_settings.xml b/res/xml/sim_lock_settings.xml
index 0e43fcd..0246ea2 100644
--- a/res/xml/sim_lock_settings.xml
+++ b/res/xml/sim_lock_settings.xml
@@ -17,8 +17,8 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
         android:title="@string/sim_lock_settings">
-    
-    <CheckBoxPreference
+
+    <SwitchPreference
             android:key="sim_toggle"
             android:title="@string/sim_pin_toggle"
             android:summaryOn="@string/sim_lock_on"
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index a0a237d..58208fa 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -140,6 +140,7 @@
 import com.android.settings.sim.SimSettings;
 import com.android.settings.widget.ChartDataUsageView;
 import com.android.settings.widget.ChartDataUsageView.DataUsageChartListener;
+import com.android.settings.widget.ChartNetworkSeriesView;
 import com.google.android.collect.Lists;
 
 import libcore.util.Objects;
@@ -209,6 +210,8 @@
     private ViewGroup mTabsContainer;
     private TabWidget mTabWidget;
     private ListView mListView;
+    private ChartNetworkSeriesView mSeries;
+    private ChartNetworkSeriesView mDetailedSeries;
     private DataUsageAdapter mAdapter;
 
     /** Distance to inset content from sides, when needed. */
@@ -400,6 +403,8 @@
             mCycleSpinner.setOnItemSelectedListener(mCycleListener);
             mCycleSummary = (TextView) mCycleView.findViewById(R.id.cycle_summary);
             mNetworkSwitches.addView(mCycleView);
+            mSeries = (ChartNetworkSeriesView)view.findViewById(R.id.series);
+            mDetailedSeries = (ChartNetworkSeriesView)view.findViewById(R.id.detail_series);
         }
 
         mChart = (ChartDataUsageView) mHeader.findViewById(R.id.chart);
@@ -658,16 +663,17 @@
         final Context context = getActivity();
         mTabHost.clearAllTabs();
 
-        final boolean mobileSplit = isMobilePolicySplit();
-        if (mobileSplit && hasReadyMobile4gRadio(context)) {
-            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)) {
-            addMobileTab(context, mSubInfoList);
+        for (int i = 0; i < mTelephonyManager.getSimCount(); i++) {
+            final SubscriptionInfo sir = Utils.findRecordBySlotId(context, i);
+            if (sir != null) {
+                addMobileTab(context, sir);
+            }
         }
+
         if (mShowWifi && hasWifiRadio(context)) {
             mTabHost.addTab(buildTabSpec(TAB_WIFI, R.string.data_usage_tab_wifi));
         }
+
         if (mShowEthernet && hasEthernet(context)) {
             mTabHost.addTab(buildTabSpec(TAB_ETHERNET, R.string.data_usage_tab_ethernet));
         }
@@ -736,6 +742,7 @@
         if (!isAdded()) return;
 
         final Context context = getActivity();
+        final Resources resources = context.getResources();
         final String currentTab = mTabHost.getCurrentTabTag();
         final boolean isOwner = ActivityManager.getCurrentUser() == UserHandle.USER_OWNER;
 
@@ -799,6 +806,21 @@
         getActivity().invalidateOptionsMenu();
 
         mBinding = false;
+
+        int seriesColor = resources.getColor(R.color.sim_noitification);
+        if (mCurrentTab != null && mCurrentTab.length() > TAB_MOBILE.length() ){
+            final int slotId = Integer.parseInt(mCurrentTab.substring(TAB_MOBILE.length(),
+                    mCurrentTab.length()));
+            final SubscriptionInfo sir = com.android.settings.Utils.findRecordBySlotId(context,
+                    slotId);
+
+            if (sir != null) {
+                seriesColor = sir.getIconTint();
+            }
+        }
+
+        mSeries.setChartColor(Color.BLACK, seriesColor, seriesColor);
+        mDetailedSeries.setChartColor(Color.BLACK, seriesColor, seriesColor);
     }
 
     private boolean isAppDetailMode() {
@@ -2588,13 +2610,11 @@
             }
         };
 
-        private void addMobileTab(Context context, List<SubscriptionInfo> subInfoList) {
-            if (subInfoList != null && mMobileTagMap != null) {
-                for (SubscriptionInfo subInfo : mSubInfoList) {
-                    if (hasReadyMobileRadio(context, subInfo.getSubscriptionId())) {
-                        mTabHost.addTab(buildTabSpec(mMobileTagMap.get(subInfo.getSubscriptionId()),
-                                subInfo.getDisplayName()));
-                    }
+        private void addMobileTab(Context context, SubscriptionInfo subInfo) {
+            if (subInfo != null && mMobileTagMap != null) {
+                if (hasReadyMobileRadio(context, subInfo.getSubscriptionId())) {
+                    mTabHost.addTab(buildTabSpec(mMobileTagMap.get(subInfo.getSubscriptionId()),
+                            subInfo.getDisplayName()));
                 }
             }
         }
@@ -2620,13 +2640,17 @@
          * @return The map or null if no activated subscription
          */
         private Map<Integer, String> initMobileTabTag(List<SubscriptionInfo> subInfoList) {
+            final Context context = getActivity();
             Map<Integer, String> map = null;
             if (subInfoList != null) {
                 String mobileTag;
                 map = new HashMap<Integer, String>();
-                for (SubscriptionInfo subInfo : subInfoList) {
-                    mobileTag = TAB_MOBILE + String.valueOf(subInfo.getSubscriptionId());
-                    map.put(subInfo.getSubscriptionId(), mobileTag);
+                for (int i = 0; i < mTelephonyManager.getSimCount(); i++) {
+                    final SubscriptionInfo subInfo = Utils.findRecordBySlotId(context, i);
+                    mobileTag = TAB_MOBILE + i;
+                    if (subInfo != null) {
+                        map.put(subInfo.getSubscriptionId(), mobileTag);
+                    }
                 }
             }
             return map;
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index cfe27bb..5201375 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -25,10 +25,10 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
-import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -106,7 +106,7 @@
     private Phone mPhone;
 
     private EditPinPreference mPinDialog;
-    private CheckBoxPreference mPinToggle;
+    private SwitchPreference mPinToggle;
 
     private Resources mRes;
 
@@ -173,7 +173,7 @@
         addPreferencesFromResource(R.xml.sim_lock_settings);
 
         mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG);
-        mPinToggle = (CheckBoxPreference) findPreference(PIN_TOGGLE);
+        mPinToggle = (SwitchPreference) findPreference(PIN_TOGGLE);
         if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) {
             mDialogState = savedInstanceState.getInt(DIALOG_STATE);
             mPin = savedInstanceState.getString(DIALOG_PIN);
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index fe45299..858880b 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -91,20 +91,20 @@
                         new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
-                        // TODO: We need an API to remove an account from a different user.
-                        // See: http://b/15466880
-                        AccountManager.get(AccountSyncSettings.this.getActivity())
-                                .removeAccountAsUser(mAccount,
-                                new AccountManagerCallback<Boolean>() {
+                        Activity activity = getActivity();
+                        AccountManager.get(activity)
+                                .removeAccountAsUser(mAccount, activity,
+                                new AccountManagerCallback<Bundle>() {
                             @Override
-                            public void run(AccountManagerFuture<Boolean> future) {
+                            public void run(AccountManagerFuture<Bundle> future) {
                                 // If already out of this screen, don't proceed.
                                 if (!AccountSyncSettings.this.isResumed()) {
                                     return;
                                 }
                                 boolean failed = true;
                                 try {
-                                    if (future.getResult() == true) {
+                                    if (future.getResult()
+                                            .getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) {
                                         failed = false;
                                     }
                                 } catch (OperationCanceledException e) {
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 11daf0c..2afdb84 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -22,6 +22,8 @@
 import android.content.IntentFilter;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.ServiceManager;
+import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.preference.Preference;
@@ -34,9 +36,11 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.provider.Telephony;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.telephony.ITelephony;
 import com.android.internal.telephony.DefaultPhoneNotifier;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
@@ -232,11 +236,18 @@
     private void updateNetworkType() {
         // Whether EDGE, UMTS, etc...
         String networktype = null;
-        if (TelephonyManager.NETWORK_TYPE_UNKNOWN
-                != mTelephonyManager.getNetworkType(mSir.getSubscriptionId())) {
-            networktype = mTelephonyManager.getNetworkTypeName(
-                    mTelephonyManager.getNetworkType(mSir.getSubscriptionId()));
+        final ITelephony telephony = ITelephony.Stub.asInterface(
+                ServiceManager.getService(Context.TELEPHONY_SERVICE));
+        try {
+            final int actualNetworkType = telephony.getVoiceNetworkTypeForSubscriber(
+                    mSir.getSubscriptionId());
+            if (TelephonyManager.NETWORK_TYPE_UNKNOWN != actualNetworkType) {
+                networktype = mTelephonyManager.getNetworkTypeName(actualNetworkType);
+            }
+        } catch (RemoteException remoteException){
+            // Do nothing, networkType will remain null.
         }
+
         setSummaryText(KEY_NETWORK_TYPE, networktype);
     }
 
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index e6dd9c7..b00faf1 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -307,7 +307,8 @@
             }
         }
 
-        if (mEdit || (mAccessPoint.getState() == null && mAccessPoint.getLevel() != -1)){
+        if ((mEdit) || (mAccessPoint != null
+                && mAccessPoint.getState() == null && mAccessPoint.getLevel() != -1)){
             mConfigUi.setCancelButton(res.getString(R.string.wifi_cancel));
         }else{
             mConfigUi.setCancelButton(res.getString(R.string.wifi_display_options_done));
diff --git a/src/com/android/settings/wifi/WifiSetupActivity.java b/src/com/android/settings/wifi/WifiSetupActivity.java
index 1d0e824..a036bae 100644
--- a/src/com/android/settings/wifi/WifiSetupActivity.java
+++ b/src/com/android/settings/wifi/WifiSetupActivity.java
@@ -239,7 +239,7 @@
             return new AlertDialog.Builder(getActivity())
                     .setMessage(messageRes)
                     .setCancelable(false)
-                    .setNegativeButton(R.string.wifi_skip_anyway,
+                    .setPositiveButton(R.string.wifi_skip_anyway,
                             new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int id) {
@@ -247,7 +247,7 @@
                             activity.finishOrNext(RESULT_SKIP);
                         }
                     })
-                    .setPositiveButton(R.string.wifi_dont_skip,
+                    .setNegativeButton(R.string.wifi_dont_skip,
                             new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int id) {
