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 82e41cb..3c589cc 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -140,6 +140,16 @@
     public static class WallpaperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ManagedProfileSettingsActivity 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 d989535..cd09742 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -56,6 +56,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;
@@ -72,9 +73,12 @@
 import com.android.settings.dashboard.DashboardSummary;
 import com.android.settings.dashboard.SearchResultsSummary;
 import com.android.settings.datausage.DataUsageSummary;
+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;
@@ -116,6 +120,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;
@@ -315,6 +321,7 @@
             AppNotificationSettings.class.getName(),
             OtherSoundSettings.class.getName(),
             ApnSettings.class.getName(),
+            ApnEditor.class.getName(),
             WifiCallingSettings.class.getName(),
             ZenModePrioritySettings.class.getName(),
             ZenModeAutomationSettings.class.getName(),
@@ -330,6 +337,14 @@
             WallpaperTypeSettings.class.getName(),
             VrListenerSettings.class.getName(),
             ManagedProfileSettings.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(),
     };
 
 
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/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;
+    }
 }
