diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f72aa8e..8b9f368 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -328,7 +328,7 @@
                 android:value="true" />
         </activity>
 
-        <activity android:name=".wifi.WifiInfo"
+        <activity android:name=".Settings$WifiInfoActivity"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:taskAffinity="com.android.settings"
                 android:parentActivityName="Settings$WifiSettingsActivity">
@@ -337,6 +337,8 @@
                 <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.wifi.WifiInfo" />
         </activity>
 
         <activity android:name=".wifi.WifiConfigInfo"
@@ -350,13 +352,15 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".wifi.WifiAPITest"
+        <activity android:name=".Settings$WifiAPITestActivity"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.wifi.WifiAPITest" />
         </activity>
 
         <activity android:name=".wifi.WifiStatusTest"
@@ -1445,7 +1449,7 @@
             </intent-filter>
         </activity-alias>
 
-        <activity android:name="IccLockSettings"
+        <activity android:name="Settings$IccLockSettingsActivity"
                 android:label="@string/sim_lock_settings"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:process="com.android.phone">
@@ -1454,6 +1458,8 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.IccLockSettings" />
         </activity>
 
         <activity android:name="Settings$AccessibilitySettingsActivity"
@@ -1736,7 +1742,7 @@
         <activity android:name=".EncryptionInterstitial"/>
 
         <!-- Runs in the phone process since it needs access to the Phone object -->
-        <activity android:name=".deviceinfo.Status"
+        <activity android:name=".Settings$StatusActivity"
                 android:label="@string/device_status_activity_title"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:process="com.android.phone">
@@ -1745,10 +1751,12 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.deviceinfo.Status" />
         </activity>
 
         <!-- Runs in the phone process since it needs access to the Phone object -->
-        <activity android:name=".deviceinfo.SimStatus"
+        <activity android:name=".Settings$SimStatusActivity"
                 android:label="@string/sim_status_title"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:process="com.android.phone">
@@ -1757,10 +1765,12 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.deviceinfo.SimStatus" />
         </activity>
 
         <!-- Runs in the phone process since it needs access to the Phone object -->
-        <activity android:name=".deviceinfo.ImeiInformation"
+        <activity android:name=".Settings$ImeiInformationActivity"
                 android:label="@string/imei_information_title"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:process="com.android.phone">
@@ -1769,6 +1779,8 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.deviceinfo.ImeiInformation" />
         </activity>
 
         <activity android:name="Settings$StorageSettingsActivity"
@@ -1873,7 +1885,7 @@
                 android:exported="true"
                 android:permission="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
 
-        <activity android:name="ApnEditor"
+        <activity android:name="Settings$ApnEditorActivity"
                 android:label="@string/apn_edit">
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
@@ -1887,14 +1899,15 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:mimeType="vnd.android.cursor.dir/telephony-carrier" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.ApnEditor" />
         </activity>
 
         <activity android:name="Settings$DevelopmentSettingsActivity"
                 android:label="@string/development_settings_title"
                 android:icon="@drawable/ic_settings_development"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings"
-                android:enabled="false">
+                android:parentActivityName="Settings">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
                 <action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
@@ -2151,11 +2164,13 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="TestingSettings" android:label="@string/testing">
+        <activity android:name="Settings$TestingSettingsActivity" android:label="@string/testing">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.TestingSettings" />
         </activity>
 
         <receiver android:name="TestingSettingsBroadcastReceiver">
@@ -2316,10 +2331,13 @@
                 android:value="true" />
         </activity>
 
-        <activity android:name="com.android.settings.accounts.ChooseAccountActivity"
+        <activity android:name="Settings$ChooseAccountActivity"
             android:label="@string/header_add_an_account"
             android:configChanges="orientation|keyboardHidden|screenSize"
-            android:theme="@style/Theme.SubSettingsDialogWhenLarge"/>
+            android:theme="@style/Theme.SubSettingsDialogWhenLarge">
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.accounts.ChooseAccountActivity" />
+        </activity>
 
         <activity android:name=".CryptKeeper"
                   androidprv:systemUserOnly="true"
@@ -2439,8 +2457,7 @@
         <activity android:name="Settings$PaymentSettingsActivity"
                 android:label="@string/nfc_payment_settings_title"
                 android:icon="@drawable/ic_settings_nfc_payment"
-                android:taskAffinity=""
-                android:enabled="false">
+                android:taskAffinity="">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.NFC_PAYMENT_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -2725,7 +2742,6 @@
         <activity android:name="Settings$SimSettingsActivity"
                 android:label="@string/sim_settings_title"
                 android:icon="@drawable/ic_settings_sim"
-                android:enabled="false"
                 android:taskAffinity="">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.sim.SIM_SUB_INFO_SETTINGS" />
diff --git a/res/layout/icc_lock_tabs.xml b/res/layout/icc_lock_tabs.xml
index 79b9660..d62f595 100644
--- a/res/layout/icc_lock_tabs.xml
+++ b/res/layout/icc_lock_tabs.xml
@@ -47,7 +47,7 @@
             android:layout_height="0dip" />
 
         <FrameLayout
-            android:id="@+id/main_content"
+            android:id="@+id/prefs_container"
             android:layout_width="match_parent"
             android:layout_height="0dip"
             android:layout_weight="1"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e4d5bcc..ad9cde7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7253,13 +7253,13 @@
     <string name="ethernet">Ethernet</string>
 
     <!-- Format string for amount of cellular data used [CHAR LIMIT=30] -->
-    <string name="cell_data_template"><xliff:g name="units" example="GB">%1$s</xliff:g> cellular data</string>
+    <string name="cell_data_template"><xliff:g id="number" example="128">^1</xliff:g><small><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></small><small><small> cellular data</small></small></string>
 
     <!-- Format string for amount of wifi data used [CHAR LIMIT=30] -->
-    <string name="wifi_data_template"><xliff:g name="units" example="GB">%1$s</xliff:g> Wi-Fi data</string>
+    <string name="wifi_data_template"><xliff:g id="number" example="128">^1</xliff:g><small><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></small><small><small> Wi-Fi data</small></small></string>
 
     <!-- Format string for amount of ethernet data used [CHAR LIMIT=30] -->
-    <string name="ethernet_data_template"><xliff:g name="units" example="GB">%1$s</xliff:g> ethernet data</string>
+    <string name="ethernet_data_template"><xliff:g id="number" example="128">^1</xliff:g><small><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></small><small><small> ethernet data</small></small></string>
 
     <!-- Format for a summary describing the amount of data before the user is warned [CHAR LIMIT=NONE] -->
     <string name="cell_warning_only"><xliff:g name="amount" example="1 GB">%1$s</xliff:g> Data warning</string>
diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
index 7ec8a4d..74f873b 100644
--- a/res/xml/device_info_settings.xml
+++ b/res/xml/device_info_settings.xml
@@ -38,7 +38,7 @@
                 android:summary="@string/device_status_summary">
             <intent android:action="android.intent.action.MAIN"
                     android:targetPackage="com.android.settings"
-                    android:targetClass="com.android.settings.deviceinfo.Status" />
+                    android:targetClass="com.android.settings.Settings$StatusActivity" />
         </PreferenceScreen>
 
         <!-- Manual -->
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
index 2cb5c6d..a0b7590 100644
--- a/res/xml/device_info_status.xml
+++ b/res/xml/device_info_status.xml
@@ -33,13 +33,13 @@
         android:title="@string/sim_status_title"
         android:persistent="false">
         <intent android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.deviceinfo.SimStatus" />
+            android:targetClass="com.android.settings.Settings$SimStatusActivity" />
     </PreferenceScreen>
     <PreferenceScreen android:key="imei_info"
         android:title="@string/imei_information_title"
         android:persistent="false">
         <intent android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.deviceinfo.ImeiInformation" />
+            android:targetClass="com.android.settings.Settings$ImeiInformationActivity" />
     </PreferenceScreen>
     <com.android.settings.CopyablePreference android:key="wifi_ip_address"
         android:enabled="false"
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index 0ba10c0..68a867e 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -28,7 +28,7 @@
 
             <intent android:action="android.intent.action.MAIN"
                     android:targetPackage="com.android.settings"
-                    android:targetClass="com.android.settings.IccLockSettings"/>
+                    android:targetClass="com.android.settings.Settings$IccLockSettingsActivity"/>
 
         </Preference>
 
diff --git a/res/xml/testing_settings.xml b/res/xml/testing_settings.xml
index 4e5c5dd..bce03e5 100644
--- a/res/xml/testing_settings.xml
+++ b/res/xml/testing_settings.xml
@@ -37,7 +37,7 @@
         <intent
                 android:action="android.intent.action.MAIN"
                 android:targetPackage="com.android.settings"
-                android:targetClass="com.android.settings.wifi.WifiInfo" />
+                android:targetClass="com.android.settings.Settings$WifiInfoActivity" />
     </PreferenceScreen>
 
     <!--    
diff --git a/res/xml/testing_wifi_settings.xml b/res/xml/testing_wifi_settings.xml
index 7844aaa..4ee269a 100644
--- a/res/xml/testing_wifi_settings.xml
+++ b/res/xml/testing_wifi_settings.xml
@@ -23,7 +23,7 @@
                 <intent
                 android:action="android.intent.action.MAIN"
                 android:targetPackage="com.android.settings"
-                android:targetClass="com.android.settings.wifi.WifiAPITest" />
+                android:targetClass="com.android.settings.Settings$WifiAPITestActivity" />
     </Preference>
 
     <Preference
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index 3163b63..8a963d8 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -16,8 +16,12 @@
 
 package com.android.settings;
 
+import static android.app.Activity.RESULT_OK;
+import static android.content.Context.TELEPHONY_SERVICE;
+
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.app.DialogFragment;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Intent;
@@ -31,6 +35,7 @@
 import android.support.v7.preference.EditTextPreference;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -38,14 +43,18 @@
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnKeyListener;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 
 import java.util.HashSet;
 import java.util.Set;
 
-public class ApnEditor extends InstrumentedPreferenceActivity
-        implements Preference.OnPreferenceChangeListener {
+public class ApnEditor extends SettingsPreferenceFragment
+        implements OnPreferenceChangeListener, OnKeyListener {
 
     private final static String TAG = ApnEditor.class.getSimpleName();
 
@@ -60,7 +69,6 @@
     private static final int MENU_DELETE = Menu.FIRST;
     private static final int MENU_SAVE = Menu.FIRST + 1;
     private static final int MENU_CANCEL = Menu.FIRST + 2;
-    private static final int ERROR_DIALOG_ID = 0;
 
     private static String sNotSet;
     private EditTextPreference mName;
@@ -152,7 +160,7 @@
 
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.apn_editor);
@@ -242,7 +250,7 @@
             return;
         }
 
-        mCursor = managedQuery(mUri, sProjection, null, null);
+        mCursor = getActivity().managedQuery(mUri, sProjection, null, null);
         mCursor.moveToFirst();
 
         mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
@@ -526,8 +534,8 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        super.onCreateOptionsMenu(menu, inflater);
         // If it's a new APN, then cancel will delete the new entry in onPause
         if (!mNewApn) {
             menu.add(0, MENU_DELETE, 0, R.string.menu_delete)
@@ -537,7 +545,6 @@
             .setIcon(android.R.drawable.ic_menu_save);
         menu.add(0, MENU_CANCEL, 0, R.string.menu_cancel)
             .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
-        return true;
     }
 
     @Override
@@ -562,7 +569,13 @@
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        view.setOnKeyListener(this);
+    }
+
+    public boolean onKey(View v, int keyCode, KeyEvent event) {
+        if (event.getAction() != KeyEvent.ACTION_DOWN) return false;
         switch (keyCode) {
             case KeyEvent.KEYCODE_BACK: {
                 if (validateAndSave(false)) {
@@ -571,11 +584,11 @@
                 return true;
             }
         }
-        return super.onKeyDown(keyCode, event);
+        return false;
     }
 
     @Override
-    protected void onSaveInstanceState(Bundle icicle) {
+    public void onSaveInstanceState(Bundle icicle) {
         super.onSaveInstanceState(icicle);
         if (validateAndSave(true)) {
             icicle.putInt(SAVED_POS, mCursor.getInt(ID_INDEX));
@@ -595,7 +608,7 @@
         String mnc = checkNotSet(mMnc.getText());
 
         if (getErrorMsg() != null && !force) {
-            showDialog(ERROR_DIALOG_ID);
+            ErrorDialog.showError(this);
             return false;
         }
 
@@ -703,35 +716,6 @@
         return errorMsg;
     }
 
-    @Override
-    protected Dialog onCreateDialog(int id) {
-
-        if (id == ERROR_DIALOG_ID) {
-            String msg = getErrorMsg();
-
-            return new AlertDialog.Builder(this)
-                    .setTitle(R.string.error_title)
-                    .setPositiveButton(android.R.string.ok, null)
-                    .setMessage(msg)
-                    .create();
-        }
-
-        return super.onCreateDialog(id);
-    }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        super.onPrepareDialog(id, dialog);
-
-        if (id == ERROR_DIALOG_ID) {
-            String msg = getErrorMsg();
-
-            if (msg != null) {
-                ((AlertDialog)dialog).setMessage(msg);
-            }
-        }
-    }
-
     private void deleteApn() {
         getContentResolver().delete(mUri, null, null);
         finish();
@@ -765,4 +749,24 @@
         }
     }
 
+    public static class ErrorDialog extends DialogFragment {
+
+        public static void showError(ApnEditor editor) {
+            ErrorDialog dialog = new ErrorDialog();
+            dialog.setTargetFragment(editor, 0);
+            dialog.show(editor.getFragmentManager(), "error");
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            String msg = ((ApnEditor) getTargetFragment()).getErrorMsg();
+
+            return new AlertDialog.Builder(getContext())
+                    .setTitle(R.string.error_title)
+                    .setPositiveButton(android.R.string.ok, null)
+                    .setMessage(msg)
+                    .create();
+        }
+    }
+
 }
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 25d4fb1..9d7f10a 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -31,7 +31,9 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ListView;
 import android.widget.TabHost;
 import android.widget.TabHost.OnTabChangeListener;
@@ -53,7 +55,7 @@
  * these operations.
  *
  */
-public class IccLockSettings extends InstrumentedPreferenceActivity
+public class IccLockSettings extends SettingsPreferenceFragment
         implements EditPinPreference.OnPinEnteredListener {
     private static final String TAG = "IccLockSettings";
     private static final boolean DBG = true;
@@ -153,12 +155,8 @@
     }
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        final Context context = getApplicationContext();
-        final TelephonyManager tm =
-                (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-        final int numSims = tm.getSimCount();
 
         if (Utils.isMonkeyRunning()) {
             finish();
@@ -198,33 +196,53 @@
         // Don't need any changes to be remembered
         getPreferenceScreen().setPersistent(false);
 
-        if (numSims > 1) {
-            setContentView(R.layout.icc_lock_tabs);
+        mRes = getResources();
+    }
 
-            mTabHost = (TabHost) findViewById(android.R.id.tabhost);
-            mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
-            mListView = (ListView) findViewById(android.R.id.list);
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+
+        final TelephonyManager tm =
+                (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        final int numSims = tm.getSimCount();
+        if (numSims > 1) {
+            View view = inflater.inflate(R.layout.icc_lock_tabs, container, false);
+            final ViewGroup prefs_container = (ViewGroup) view.findViewById(R.id.prefs_container);
+            Utils.prepareCustomPreferencesList(container, view, prefs_container, false);
+            View prefs = super.onCreateView(inflater, prefs_container, savedInstanceState);
+            prefs_container.addView(prefs);
+
+            mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
+            mTabWidget = (TabWidget) view.findViewById(android.R.id.tabs);
+            mListView = (ListView) view.findViewById(android.R.id.list);
 
             mTabHost.setup();
             mTabHost.setOnTabChangedListener(mTabListener);
             mTabHost.clearAllTabs();
 
-            SubscriptionManager sm = SubscriptionManager.from(this);
+            SubscriptionManager sm = SubscriptionManager.from(getContext());
             for (int i = 0; i < numSims; ++i) {
                 final SubscriptionInfo subInfo = sm.getActiveSubscriptionInfoForSimSlotIndex(i);
                 mTabHost.addTab(buildTabSpec(String.valueOf(i),
                         String.valueOf(subInfo == null
-                            ? context.getString(R.string.sim_editor_title, i + 1)
+                            ? getContext().getString(R.string.sim_editor_title, i + 1)
                             : subInfo.getDisplayName())));
             }
             final SubscriptionInfo sir = sm.getActiveSubscriptionInfoForSimSlotIndex(0);
 
             mPhone = (sir == null) ? null
                 : PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
+            return view;
         } else {
             mPhone = PhoneFactory.getDefaultPhone();
+            return super.onCreateView(inflater, container, savedInstanceState);
         }
-        mRes = getResources();
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
         updatePreferences();
     }
 
@@ -243,13 +261,13 @@
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
 
         // ACTION_SIM_STATE_CHANGED is sticky, so we'll receive current state after this call,
         // which will call updatePreferences().
         final IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
-        registerReceiver(mSimStateReceiver, filter);
+        getContext().registerReceiver(mSimStateReceiver, filter);
 
         if (mDialogState != OFF_MODE) {
             showPinDialog();
@@ -260,13 +278,13 @@
     }
 
     @Override
-    protected void onPause() {
+    public void onPause() {
         super.onPause();
-        unregisterReceiver(mSimStateReceiver);
+        getContext().unregisterReceiver(mSimStateReceiver);
     }
 
     @Override
-    protected void onSaveInstanceState(Bundle out) {
+    public void onSaveInstanceState(Bundle out) {
         // Need to store this state for slider open/close
         // There is one case where the dialog is popped up by the preference
         // framework. In that case, let the preference framework store the
@@ -412,8 +430,8 @@
         if (success) {
             mPinToggle.setChecked(mToState);
         } else {
-            Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), Toast.LENGTH_LONG)
-                    .show();
+            Toast.makeText(getContext(), getPinPasswordErrorMessage(attemptsRemaining),
+                    Toast.LENGTH_LONG).show();
         }
         mPinToggle.setEnabled(true);
         resetDialogState();
@@ -421,11 +439,11 @@
 
     private void iccPinChanged(boolean success, int attemptsRemaining) {
         if (!success) {
-            Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining),
+            Toast.makeText(getContext(), getPinPasswordErrorMessage(attemptsRemaining),
                     Toast.LENGTH_LONG)
                     .show();
         } else {
-            Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded),
+            Toast.makeText(getContext(), mRes.getString(R.string.sim_change_succeeded),
                     Toast.LENGTH_SHORT)
                     .show();
 
@@ -476,7 +494,7 @@
         @Override
         public void onTabChanged(String tabId) {
             final int slotId = Integer.parseInt(tabId);
-            final SubscriptionInfo sir = SubscriptionManager.from(getBaseContext())
+            final SubscriptionInfo sir = SubscriptionManager.from(getActivity().getBaseContext())
                     .getActiveSubscriptionInfoForSimSlotIndex(slotId);
 
             mPhone = (sir == null) ? null
diff --git a/src/com/android/settings/InstrumentedPreferenceActivity.java b/src/com/android/settings/InstrumentedPreferenceActivity.java
deleted file mode 100644
index 3b19b33..0000000
--- a/src/com/android/settings/InstrumentedPreferenceActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * 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.
- */
-
-package com.android.settings;
-
-import com.android.internal.logging.MetricsLogger;
-
-/**
- * Instrumented activity that logs visibility state.
- */
-public abstract class InstrumentedPreferenceActivity extends PreferenceActivity {
-    /**
-     * Declare the view of this category.
-     *
-     * Categories are defined in {@link com.android.internal.logging.MetricsProto.MetricsEvent}
-     * or if there is no relevant existing category you may define one in
-     * {@link com.android.settings.InstrumentedFragment}.
-     */
-    protected abstract int getMetricsCategory();
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        MetricsLogger.visible(this, getMetricsCategory());
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        MetricsLogger.hidden(this, getMetricsCategory());
-    }
-}
diff --git a/src/com/android/settings/PreferenceActivity.java b/src/com/android/settings/PreferenceActivity.java
deleted file mode 100644
index 31b5f1f..0000000
--- a/src/com/android/settings/PreferenceActivity.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * 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.
- */
-package com.android.settings;
-
-import android.annotation.Nullable;
-import android.os.Bundle;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-public class PreferenceActivity extends SettingsActivity {
-
-    private PreferenceActivityFragment mFragment;
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        getIntent().putExtra(EXTRA_SHOW_FRAGMENT, PreferenceActivityFragment.class.getName());
-        super.onCreate(savedInstanceState);
-    }
-
-    public void addPreferencesFromResource(int resource) {
-        mFragment.addPreferencesFromResource(resource);
-    }
-
-    public Preference findPreference(String preference) {
-        return mFragment.findPreference(preference);
-    }
-
-    public PreferenceScreen getPreferenceScreen() {
-        return mFragment.getPreferenceScreen();
-    }
-
-    public void setPreferenceScreen(PreferenceScreen screen) {
-        mFragment.setPreferenceScreen(screen);
-    }
-
-    public boolean onPreferenceTreeClick(Preference preference) {
-        return false;
-    }
-
-    @Override
-    protected boolean isValidFragment(String fragmentName) {
-        return super.isValidFragment(fragmentName)
-                || PreferenceActivityFragment.class.getName().equals(fragmentName);
-    }
-
-    public static class PreferenceActivityFragment extends SettingsPreferenceFragment {
-        @Override
-        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-            ((PreferenceActivity) getActivity()).mFragment = this;
-        }
-
-        @Override
-        public boolean onPreferenceTreeClick(Preference preference) {
-            if (((PreferenceActivity) getActivity()).onPreferenceTreeClick(preference)) {
-                return true;
-            }
-            return super.onPreferenceTreeClick(preference);
-        }
-
-        @Override
-        protected int getMetricsCategory() {
-            if (getActivity() instanceof InstrumentedPreferenceActivity) {
-                return ((InstrumentedPreferenceActivity) getActivity()).getMetricsCategory();
-            }
-            return InstrumentedFragment.PREFERENCE_ACTIVITY_FRAGMENT;
-        }
-    }
-
-}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 1eb3af4..1bf1e0e 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -141,6 +141,16 @@
     public static class ManagedProfileSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeletionHelperActivity extends SettingsActivity { /* empty */ }
 
+    public static class ApnEditorActivity extends SettingsActivity { /* empty */ }
+    public static class ChooseAccountActivity extends SettingsActivity { /* empty */ }
+    public static class IccLockSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class ImeiInformationActivity extends SettingsActivity { /* empty */ }
+    public static class SimStatusActivity extends SettingsActivity { /* empty */ }
+    public static class StatusActivity extends SettingsActivity { /* empty */ }
+    public static class TestingSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class WifiAPITestActivity extends SettingsActivity { /* empty */ }
+    public static class WifiInfoActivity extends SettingsActivity { /* empty */ }
+
     // Categories.
     public static class WirelessSettings extends SettingsActivity { /* empty */ }
     public static class DeviceSettings extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 9a65d3c..330c9ea 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -57,6 +57,7 @@
 import com.android.settings.accessibility.CaptionPropertiesFragment;
 import com.android.settings.accounts.AccountSettings;
 import com.android.settings.accounts.AccountSyncSettings;
+import com.android.settings.accounts.ChooseAccountActivity;
 import com.android.settings.accounts.ManagedProfileSettings;
 import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.applications.DrawOverlayDetails;
@@ -74,9 +75,12 @@
 import com.android.settings.dashboard.SearchResultsSummary;
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.deletionhelper.DeletionHelperFragment;
+import com.android.settings.deviceinfo.ImeiInformation;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
 import com.android.settings.deviceinfo.PrivateVolumeSettings;
 import com.android.settings.deviceinfo.PublicVolumeSettings;
+import com.android.settings.deviceinfo.SimStatus;
+import com.android.settings.deviceinfo.Status;
 import com.android.settings.deviceinfo.StorageSettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageDetail;
@@ -119,6 +123,8 @@
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.wifi.AdvancedWifiSettings;
 import com.android.settings.wifi.SavedAccessPointsWifiSettings;
+import com.android.settings.wifi.WifiAPITest;
+import com.android.settings.wifi.WifiInfo;
 import com.android.settings.wifi.WifiSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -318,6 +324,7 @@
             AppNotificationSettings.class.getName(),
             OtherSoundSettings.class.getName(),
             ApnSettings.class.getName(),
+            ApnEditor.class.getName(),
             WifiCallingSettings.class.getName(),
             ZenModePrioritySettings.class.getName(),
             ZenModeAutomationSettings.class.getName(),
@@ -334,6 +341,14 @@
             VrListenerSettings.class.getName(),
             ManagedProfileSettings.class.getName(),
             DeletionHelperFragment.class.getName(),
+            ChooseAccountActivity.class.getName(),
+            IccLockSettings.class.getName(),
+            ImeiInformation.class.getName(),
+            SimStatus.class.getName(),
+            Status.class.getName(),
+            TestingSettings.class.getName(),
+            WifiAPITest.class.getName(),
+            WifiInfo.class.getName(),
     };
 
 
@@ -1068,7 +1083,7 @@
             for (DashboardCategory category : categories) {
                 for (Tile tile : category.tiles) {
                     ComponentName component = tile.intent.getComponent();
-                    if (packageName.equals(component)&& !ArrayUtils.contains(
+                    if (packageName.equals(component.getPackageName()) && !ArrayUtils.contains(
                             SETTINGS_FOR_RESTRICTED, component.getClassName())) {
                         setTileEnabled(component, false, isAdmin, pm);
                     }
@@ -1079,18 +1094,11 @@
 
     private void setTileEnabled(ComponentName component, boolean enabled, boolean isAdmin,
                                 PackageManager pm) {
-        if (UserHandle.MU_ENABLED && !isAdmin
+        if (UserHandle.MU_ENABLED && !isAdmin && getPackageName().equals(component.getPackageName())
                 && !ArrayUtils.contains(SETTINGS_FOR_RESTRICTED, component.getClassName())) {
             enabled = false;
         }
-        int state = pm.getComponentEnabledSetting(component);
-        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
-        if (isEnabled != enabled) {
-            pm.setComponentEnabledSetting(component, enabled
-                    ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
-                    : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                    PackageManager.DONT_KILL_APP);
-        }
+        setTileEnabled(component, enabled);
     }
 
     private void getMetaData() {
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index a992897..f5d7d86 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -23,6 +23,7 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.support.annotation.XmlRes;
@@ -42,6 +43,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
+
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.widget.FloatingActionButton;
 import com.android.settingslib.HelpUtils;
@@ -693,6 +695,27 @@
         }
     }
 
+    protected Intent getIntent() {
+        if (getActivity() == null) {
+            return null;
+        }
+        return getActivity().getIntent();
+    }
+
+    protected void setResult(int result, Intent intent) {
+        if (getActivity() == null) {
+            return;
+        }
+        getActivity().setResult(result, intent);
+    }
+
+    protected void setResult(int result) {
+        if (getActivity() == null) {
+            return;
+        }
+        getActivity().setResult(result);
+    }
+
     protected final Context getPrefContext() {
         return getPreferenceManager().getContext();
     }
@@ -704,10 +727,6 @@
             SettingsActivity sa = (SettingsActivity) activity;
             sa.startPreferencePanel(fragmentClass, extras, titleRes, null, caller, requestCode);
             return true;
-        } else if (activity instanceof PreferenceActivity) {
-            PreferenceActivity sa = (PreferenceActivity) activity;
-            sa.startPreferencePanel(fragmentClass, extras, titleRes, null, caller, requestCode);
-            return true;
         } else {
             Log.w(TAG,
                     "Parent isn't SettingsActivity nor PreferenceActivity, thus there's no way to "
diff --git a/src/com/android/settings/TestingSettings.java b/src/com/android/settings/TestingSettings.java
index 7a6f252..264db52 100644
--- a/src/com/android/settings/TestingSettings.java
+++ b/src/com/android/settings/TestingSettings.java
@@ -20,15 +20,17 @@
 import android.os.UserManager;
 import android.support.v7.preference.PreferenceScreen;
 
-public class TestingSettings extends PreferenceActivity {
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+
+public class TestingSettings extends SettingsPreferenceFragment {
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         
         addPreferencesFromResource(R.xml.testing_settings);
 
-        final UserManager um = UserManager.get(this);
+        final UserManager um = UserManager.get(getContext());
         if (!um.isAdminUser()) {
             PreferenceScreen preferenceScreen = (PreferenceScreen)
                     findPreference("radio_info_settings");
@@ -36,4 +38,8 @@
         }
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsEvent.TESTING;
+    }
 }
diff --git a/src/com/android/settings/TestingSettingsBroadcastReceiver.java b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
index 18d59be..a66f208 100644
--- a/src/com/android/settings/TestingSettingsBroadcastReceiver.java
+++ b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
@@ -6,6 +6,8 @@
 
 import static com.android.internal.telephony.TelephonyIntents.SECRET_CODE_ACTION;
 
+import com.android.settings.Settings.TestingSettingsActivity;
+
 
 public class TestingSettingsBroadcastReceiver extends BroadcastReceiver {
   
@@ -16,7 +18,7 @@
     public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(SECRET_CODE_ACTION)) {
             Intent i = new Intent(Intent.ACTION_MAIN);
-            i.setClass(context, TestingSettings.class);
+            i.setClass(context, TestingSettingsActivity.class);
             i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(i);
         }
diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java
index d9a181d..ce16ba3 100644
--- a/src/com/android/settings/accounts/AddAccountSettings.java
+++ b/src/com/android/settings/accounts/AddAccountSettings.java
@@ -34,6 +34,7 @@
 
 import com.android.settings.ChooseLockSettingsHelper;
 import com.android.settings.R;
+import com.android.settings.Settings;
 import com.android.settings.Utils;
 
 import java.io.IOException;
@@ -216,7 +217,7 @@
                 getIntent().getStringArrayExtra(AccountPreferenceBase.AUTHORITIES_FILTER_KEY);
         final String[] accountTypes =
                 getIntent().getStringArrayExtra(AccountPreferenceBase.ACCOUNT_TYPES_FILTER_KEY);
-        final Intent intent = new Intent(this, ChooseAccountActivity.class);
+        final Intent intent = new Intent(this, Settings.ChooseAccountActivity.class);
         if (authorities != null) {
             intent.putExtra(AccountPreferenceBase.AUTHORITIES_FILTER_KEY, authorities);
         }
diff --git a/src/com/android/settings/accounts/ChooseAccountActivity.java b/src/com/android/settings/accounts/ChooseAccountActivity.java
index 2f904cf..2e3280b 100644
--- a/src/com/android/settings/accounts/ChooseAccountActivity.java
+++ b/src/com/android/settings/accounts/ChooseAccountActivity.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.accounts;
 
+import static android.app.Activity.RESULT_CANCELED;
+import static android.app.Activity.RESULT_OK;
+import static android.content.Intent.EXTRA_USER;
+
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
 import android.content.ContentResolver;
@@ -32,14 +36,15 @@
 import android.support.v7.preference.PreferenceGroup;
 import android.util.Log;
 
-import com.google.android.collect.Maps;
-
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.util.CharSequences;
-import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+import com.google.android.collect.Maps;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,17 +52,13 @@
 import java.util.HashSet;
 import java.util.Map;
 
-import static android.content.Intent.EXTRA_USER;
-
-import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
 /**
  * Activity asking a user to select an account to be set up.
  *
  * An extra {@link UserHandle} can be specified in the intent as {@link EXTRA_USER}, if the user for
  * which the action needs to be performed is different to the one the Settings App will run in.
  */
-public class ChooseAccountActivity extends InstrumentedPreferenceActivity {
+public class ChooseAccountActivity extends SettingsPreferenceFragment {
 
     private static final String TAG = "ChooseAccountActivity";
     private String[] mAuthorities;
@@ -97,7 +98,7 @@
     }
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.add_account_settings);
@@ -112,9 +113,9 @@
             }
         }
         mAddAccountGroup = getPreferenceScreen();
-        mUm = UserManager.get(this);
-        mUserHandle = Utils.getSecureTargetUser(getActivityToken(), mUm, null /* arguments */,
-                getIntent().getExtras());
+        mUm = UserManager.get(getContext());
+        mUserHandle = Utils.getSecureTargetUser(getActivity().getActivityToken(), mUm,
+                null /* arguments */, getIntent().getExtras());
         updateAuthDescriptions();
     }
 
@@ -123,7 +124,7 @@
      * and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated().
      */
     private void updateAuthDescriptions() {
-        mAuthDescs = AccountManager.get(this).getAuthenticatorTypesAsUser(
+        mAuthDescs = AccountManager.get(getContext()).getAuthenticatorTypesAsUser(
                 mUserHandle.getIdentifier());
         for (int i = 0; i < mAuthDescs.length; i++) {
             mTypeToAuthDescription.put(mAuthDescs[i].type, mAuthDescs[i]);
@@ -233,7 +234,8 @@
         if (mTypeToAuthDescription.containsKey(accountType)) {
             try {
                 AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
-                Context authContext = createPackageContextAsUser(desc.packageName, 0, mUserHandle);
+                Context authContext = getActivity()
+                        .createPackageContextAsUser(desc.packageName, 0, mUserHandle);
                 icon = getPackageManager().getUserBadgedIcon(
                         authContext.getDrawable(desc.iconId), mUserHandle);
             } catch (PackageManager.NameNotFoundException e) {
@@ -259,7 +261,8 @@
         if (mTypeToAuthDescription.containsKey(accountType)) {
             try {
                 AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
-                Context authContext = createPackageContextAsUser(desc.packageName, 0, mUserHandle);
+                Context authContext = getActivity()
+                        .createPackageContextAsUser(desc.packageName, 0, mUserHandle);
                 label = authContext.getResources().getText(desc.labelId);
             } catch (PackageManager.NameNotFoundException e) {
                 Log.w(TAG, "No label name for account type " + accountType);
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index bd6ae5c..51804c1 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -32,6 +32,7 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -189,8 +190,8 @@
         if (mSummaryPreference != null) {
             Formatter.BytesResult usedResult = Formatter.formatBytes(context.getResources(),
                     info.usageLevel, Formatter.FLAG_SHORTER);
-            mSummaryPreference.setAmount(usedResult.value);
-            mSummaryPreference.setUnits(getString(mDataUsageTemplate, usedResult.units));
+            mSummaryPreference.setTitle(TextUtils.expandTemplate(getText(mDataUsageTemplate),
+                    usedResult.value, usedResult.units));
             long limit = info.limitLevel;
             if (limit <= 0) {
                 limit = info.warningLevel;
diff --git a/src/com/android/settings/deviceinfo/ImeiInformation.java b/src/com/android/settings/deviceinfo/ImeiInformation.java
index 6b63d55..7145212 100644
--- a/src/com/android/settings/deviceinfo/ImeiInformation.java
+++ b/src/com/android/settings/deviceinfo/ImeiInformation.java
@@ -27,10 +27,10 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
-import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
-public class ImeiInformation extends InstrumentedPreferenceActivity {
+public class ImeiInformation extends SettingsPreferenceFragment {
 
     private static final String KEY_PRL_VERSION = "prl_version";
     private static final String KEY_MIN_NUMBER = "min_number";
@@ -43,9 +43,9 @@
     private boolean isMultiSIM = false;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mSubscriptionManager = SubscriptionManager.from(this);
+        mSubscriptionManager = SubscriptionManager.from(getContext());
         final TelephonyManager telephonyManager =
             (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
         initPreferenceScreen(telephonyManager.getSimCount());
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 610744b..e580afe 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.deviceinfo;
 
+import static android.content.Context.CARRIER_CONFIG_SERVICE;
+import static android.content.Context.TELEPHONY_SERVICE;
+
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -27,6 +30,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
+import android.telephony.CarrierConfigManager;
 import android.telephony.CellBroadcastMessage;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.PhoneStateListener;
@@ -35,10 +39,11 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-import android.telephony.CarrierConfigManager;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ListView;
 import android.widget.TabHost;
 import android.widget.TabHost.OnTabChangeListener;
@@ -50,8 +55,9 @@
 import com.android.internal.telephony.DefaultPhoneNotifier;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
-import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
 
 import java.util.List;
 
@@ -67,7 +73,7 @@
  * # Signal Strength
  *
  */
-public class SimStatus extends InstrumentedPreferenceActivity {
+public class SimStatus extends SettingsPreferenceFragment {
     private static final String TAG = "SimStatus";
 
     private static final String KEY_DATA_STATE = "data_state";
@@ -131,12 +137,13 @@
     };
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
         mCarrierConfigManager = (CarrierConfigManager) getSystemService(CARRIER_CONFIG_SERVICE);
 
-        mSelectableSubInfos = SubscriptionManager.from(this).getActiveSubscriptionInfoList();
+        mSelectableSubInfos = SubscriptionManager.from(getContext())
+                .getActiveSubscriptionInfoList();
 
         addPreferencesFromResource(R.xml.device_info_sim_status);
 
@@ -145,17 +152,28 @@
         // Note - missing in zaku build, be careful later...
         mSignalStrength = findPreference(KEY_SIGNAL_STRENGTH);
 
+        updatePhoneInfos();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
         if (mSelectableSubInfos == null) {
             mSir = null;
         } else {
             mSir = mSelectableSubInfos.size() > 0 ? mSelectableSubInfos.get(0) : null;
 
             if (mSelectableSubInfos.size() > 1) {
-                setContentView(R.layout.icc_lock_tabs);
+                View view = inflater.inflate(R.layout.icc_lock_tabs, container, false);
+                final ViewGroup prefs_container = (ViewGroup) view.findViewById(
+                        R.id.prefs_container);
+                Utils.prepareCustomPreferencesList(container, view, prefs_container, false);
+                View prefs = super.onCreateView(inflater, prefs_container, savedInstanceState);
+                prefs_container.addView(prefs);
 
-                mTabHost = (TabHost) findViewById(android.R.id.tabhost);
-                mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
-                mListView = (ListView) findViewById(android.R.id.list);
+                mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
+                mTabWidget = (TabWidget) view.findViewById(android.R.id.tabs);
+                mListView = (ListView) view.findViewById(android.R.id.list);
 
                 mTabHost.setup();
                 mTabHost.setOnTabChangedListener(mTabListener);
@@ -167,7 +185,7 @@
                 }
             }
         }
-        updatePhoneInfos();
+        return super.onCreateView(inflater, container, savedInstanceState);
     }
 
     @Override
@@ -176,7 +194,7 @@
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
         if (mPhone != null) {
             updatePreference();
@@ -189,11 +207,12 @@
                     | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
                     | PhoneStateListener.LISTEN_SERVICE_STATE);
             if (mShowLatestAreaInfo) {
-                registerReceiver(mAreaInfoReceiver, new IntentFilter(CB_AREA_INFO_RECEIVED_ACTION),
+                getContext().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,
+                getContext().sendBroadcastAsUser(getLatestIntent, UserHandle.ALL,
                         CB_AREA_INFO_SENDER_PERMISSION);
             }
         }
@@ -208,7 +227,7 @@
                     PhoneStateListener.LISTEN_NONE);
         }
         if (mShowLatestAreaInfo) {
-            unregisterReceiver(mAreaInfoReceiver);
+            getContext().unregisterReceiver(mAreaInfoReceiver);
         }
     }
 
@@ -250,7 +269,7 @@
 
         boolean show4GForLTE = false;
         try {
-            Context con = createPackageContext("com.android.systemui", 0);
+            Context con = getActivity().createPackageContext("com.android.systemui", 0);
             int id = con.getResources().getIdentifier("config_show4GForLTE",
                     "bool", "com.android.systemui");
             show4GForLTE = con.getResources().getBoolean(id);
@@ -395,7 +414,7 @@
             // TODO: http://b/23763013
             final Phone phone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(
                         mSir.getSubscriptionId()));
-            if (UserManager.get(this).isAdminUser()
+            if (UserManager.get(getContext()).isAdminUser()
                     && SubscriptionManager.isValidSubscriptionId(mSir.getSubscriptionId())) {
                 if (phone == null) {
                     Log.e(TAG, "Unable to locate a phone object for the given Subscription ID.");
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 41f59ef..1ba3978 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.deviceinfo;
 
+import static android.content.Context.CONNECTIVITY_SERVICE;
+import static android.content.Context.WIFI_SERVICE;
+
 import android.bluetooth.BluetoothAdapter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -37,8 +40,8 @@
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.util.ArrayUtils;
-import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 
 import java.lang.ref.WeakReference;
@@ -51,7 +54,7 @@
  * # XMPP/buzz/tickle status : TODO
  *
  */
-public class Status extends InstrumentedPreferenceActivity {
+public class Status extends SettingsPreferenceFragment {
 
     private static final String KEY_BATTERY_STATUS = "battery_status";
     private static final String KEY_BATTERY_LEVEL = "battery_level";
@@ -152,7 +155,7 @@
     }
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         mHandler = new MyHandler(this);
@@ -202,8 +205,8 @@
         // Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
         // Also remove on Wi-Fi only devices.
         //TODO: the bug above will surface in split system user mode.
-        if (!UserManager.get(this).isAdminUser()
-                || Utils.isWifiOnly(this)) {
+        if (!UserManager.get(getContext()).isAdminUser()
+                || Utils.isWifiOnly(getContext())) {
             removePreferenceFromScreen(KEY_SIM_STATUS);
             removePreferenceFromScreen(KEY_IMEI_INFO);
         }
@@ -215,11 +218,12 @@
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
-        registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
+        getContext().registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
                          android.Manifest.permission.CHANGE_NETWORK_STATE, null);
-        registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        getContext().registerReceiver(mBatteryInfoReceiver,
+                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
         mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
     }
 
@@ -227,8 +231,8 @@
     public void onPause() {
         super.onPause();
 
-        unregisterReceiver(mBatteryInfoReceiver);
-        unregisterReceiver(mConnectivityReceiver);
+        getContext().unregisterReceiver(mBatteryInfoReceiver);
+        getContext().unregisterReceiver(mConnectivityReceiver);
         mHandler.removeMessages(EVENT_UPDATE_STATS);
     }
 
diff --git a/src/com/android/settings/wifi/WifiAPITest.java b/src/com/android/settings/wifi/WifiAPITest.java
index e6bf6b8..6abf67d 100644
--- a/src/com/android/settings/wifi/WifiAPITest.java
+++ b/src/com/android/settings/wifi/WifiAPITest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.wifi;
 
+import static android.content.Context.WIFI_SERVICE;
+
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.net.wifi.WifiManager;
@@ -25,15 +27,16 @@
 import android.text.Editable;
 import android.widget.EditText;
 
-import com.android.settings.PreferenceActivity;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
 
 /**
  * Provide an interface for testing out the Wifi API
  */
-public class WifiAPITest extends PreferenceActivity implements
-Preference.OnPreferenceClickListener {
+public class WifiAPITest extends SettingsPreferenceFragment implements
+        Preference.OnPreferenceClickListener {
 
     private static final String TAG = "WifiAPITest";
     private int netid;
@@ -58,15 +61,14 @@
     //============================
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        onCreatePreferences();
         mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
     }
 
-
-    private void onCreatePreferences() {
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         addPreferencesFromResource(R.layout.wifi_api_test);
 
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
@@ -82,6 +84,11 @@
 
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsEvent.TESTING;
+    }
+
     //============================
     // Preference callbacks
     //============================
@@ -99,11 +106,11 @@
         if (pref == mWifiDisconnect) {
             mWifiManager.disconnect();
         } else if (pref == mWifiDisableNetwork) {
-            AlertDialog.Builder alert = new AlertDialog.Builder(this);
+            AlertDialog.Builder alert = new AlertDialog.Builder(getContext());
             alert.setTitle("Input");
             alert.setMessage("Enter Network ID");
             // Set an EditText view to get user input
-            final EditText input = new EditText(this);
+            final EditText input = new EditText(getPrefContext());
             alert.setView(input);
             alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int whichButton) {
@@ -125,11 +132,11 @@
                     });
             alert.show();
         } else if (pref == mWifiEnableNetwork) {
-            AlertDialog.Builder alert = new AlertDialog.Builder(this);
+            AlertDialog.Builder alert = new AlertDialog.Builder(getContext());
             alert.setTitle("Input");
             alert.setMessage("Enter Network ID");
             // Set an EditText view to get user input
-            final EditText input = new EditText(this);
+            final EditText input = new EditText(getPrefContext());
             alert.setView(input);
             alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int whichButton) {
diff --git a/src/com/android/settings/wifi/WifiInfo.java b/src/com/android/settings/wifi/WifiInfo.java
index a431a82..373a587 100644
--- a/src/com/android/settings/wifi/WifiInfo.java
+++ b/src/com/android/settings/wifi/WifiInfo.java
@@ -18,19 +18,24 @@
 
 import android.os.Bundle;
 
-import com.android.settings.PreferenceActivity;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
 
 /**
  * Wifi information menu item on the diagnostic screen
  */
-public class WifiInfo extends PreferenceActivity {
+public class WifiInfo extends SettingsPreferenceFragment {
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.testing_wifi_settings);
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsEvent.TESTING;
+    }
 }
