diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5eec93e..95c65e9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -147,13 +147,14 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".wifi.WifiApSettings">
+        <activity-alias android:name=".wifi.WifiApSettings"
+            android:targetActivity="Settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
-        </activity>
+        </activity-alias>
 
         <activity android:name="ApnSettings" android:label="@string/apn_settings"
                   android:configChanges="orientation|keyboardHidden"
@@ -184,14 +185,15 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".TetherSettings"
-                android:clearTaskOnLaunch="true">
+        <activity-alias android:name=".TetherSettings"
+            android:clearTaskOnLaunch="true"
+            android:targetActivity="Settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
-        </activity>
+        </activity-alias>
 
         <activity android:name=".vpn.VpnSettings"
                 android:configChanges="orientation|keyboardHidden"
diff --git a/res/xml/tether_prefs.xml b/res/xml/tether_prefs.xml
index 95dfaf8..ac93a86 100644
--- a/res/xml/tether_prefs.xml
+++ b/res/xml/tether_prefs.xml
@@ -27,13 +27,10 @@
         android:persistent="false" />
 
     <PreferenceScreen
+        android:fragment="com.android.settings.wifi.WifiApSettings"
         android:key="wifi_ap_settings"
         android:title="@string/wifi_tether_settings_text"
         android:summary="@string/wifi_tether_settings_subtext" >
-        <intent
-            android:action="android.intent.action.MAIN"
-            android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.wifi.WifiApSettings" />
     </PreferenceScreen>
 
     <CheckBoxPreference
diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
index 1a8c1e7..943f09d 100644
--- a/res/xml/wireless_settings.xml
+++ b/res/xml/wireless_settings.xml
@@ -55,13 +55,10 @@
     </PreferenceScreen>
 
     <PreferenceScreen
+        android:fragment="com.android.settings.TetherSettings"
         android:key="tether_settings"
         android:title="@string/tether_settings_title_all"
         android:summary="@string/tether_settings_summary_all">
-        <intent
-            android:action="android.intent.action.MAIN"
-            android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.TetherSettings" />
     </PreferenceScreen>
 
     <PreferenceScreen
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index bcd772e..272a3d4 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -18,27 +18,22 @@
 
 import com.android.settings.wifi.WifiApEnabler;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothPan;
-import android.bluetooth.IBluetooth;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.AssetManager;
 import android.net.ConnectivityManager;
+import android.os.Bundle;
 import android.os.Environment;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
-import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
-import android.util.Log;
 import android.webkit.WebView;
 
 import java.io.InputStream;
@@ -48,7 +43,7 @@
 /*
  * Displays preferences for Tethering.
  */
-public class TetherSettings extends PreferenceActivity {
+public class TetherSettings extends SettingsPreferenceFragment {
     private static final String TAG = "TetheringSettings";
 
     private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
@@ -86,11 +81,16 @@
     private BluetoothPan mBluetoothPan;
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-
-        mBluetoothPan = new BluetoothPan(this);
         addPreferencesFromResource(R.xml.tether_prefs);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        final Activity activity = getActivity();
+        mBluetoothPan = new BluetoothPan(activity);
 
         mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
         mWifiApSettings = (PreferenceScreen) findPreference(WIFI_AP_SETTINGS);
@@ -131,31 +131,31 @@
             }
         }
         if (wifiAvailable && usbAvailable && bluetoothAvailable){
-            setTitle(R.string.tether_settings_title_all);
+            activity.setTitle(R.string.tether_settings_title_all);
         } else if (wifiAvailable && usbAvailable){
-            setTitle(R.string.tether_settings_title_all);
+            activity.setTitle(R.string.tether_settings_title_all);
         } else if (wifiAvailable && bluetoothAvailable){
-            setTitle(R.string.tether_settings_title_all);
+            activity.setTitle(R.string.tether_settings_title_all);
         } else if (wifiAvailable) {
-            setTitle(R.string.tether_settings_title_wifi);
+            activity.setTitle(R.string.tether_settings_title_wifi);
         } else if (usbAvailable && bluetoothAvailable) {
-            setTitle(R.string.tether_settings_title_usb_bluetooth);
+            activity.setTitle(R.string.tether_settings_title_usb_bluetooth);
         } else if (usbAvailable) {
-            setTitle(R.string.tether_settings_title_usb);
+            activity.setTitle(R.string.tether_settings_title_usb);
         } else {
-            setTitle(R.string.tether_settings_title_bluetooth);
+            activity.setTitle(R.string.tether_settings_title_bluetooth);
         }
-        mWifiApEnabler = new WifiApEnabler(this, mEnableWifiAp);
-        mView = new WebView(this);
+        mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
+        mView = new WebView(activity);
     }
 
     @Override
-    protected Dialog onCreateDialog(int id) {
+    public Dialog onCreateDialog(int id) {
         if (id == DIALOG_TETHER_HELP) {
             Locale locale = Locale.getDefault();
 
             // check for the full language + country resource, if not there, try just language
-            AssetManager am = getAssets();
+            final AssetManager am = getActivity().getAssets();
             String path = HELP_PATH.replace("%y", locale.getLanguage().toLowerCase());
             path = path.replace("%z", "_"+locale.getCountry().toLowerCase());
             boolean useCountry = true;
@@ -185,7 +185,7 @@
 
             mView.loadUrl(url);
 
-            return new AlertDialog.Builder(this)
+            return new AlertDialog.Builder(getActivity())
                 .setCancelable(true)
                 .setTitle(R.string.tethering_help_button_text)
                 .setView(mView)
@@ -218,31 +218,33 @@
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
 
+        final Activity activity = getActivity();
+
         mTetherChangeReceiver = new TetherChangeReceiver();
         IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
-        Intent intent = registerReceiver(mTetherChangeReceiver, filter);
+        Intent intent = activity.registerReceiver(mTetherChangeReceiver, filter);
 
         filter = new IntentFilter();
         filter.addAction(Intent.ACTION_MEDIA_SHARED);
         filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
         filter.addDataScheme("file");
-        registerReceiver(mTetherChangeReceiver, filter);
+        activity.registerReceiver(mTetherChangeReceiver, filter);
 
         filter = new IntentFilter();
         filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
-        registerReceiver(mTetherChangeReceiver, filter);
+        activity.registerReceiver(mTetherChangeReceiver, filter);
 
-        if (intent != null) mTetherChangeReceiver.onReceive(this, intent);
+        if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
         mWifiApEnabler.resume();
     }
 
     @Override
-    protected void onPause() {
+    public void onPause() {
         super.onPause();
-        unregisterReceiver(mTetherChangeReceiver);
+        getActivity().unregisterReceiver(mTetherChangeReceiver);
         mTetherChangeReceiver = null;
         mWifiApEnabler.pause();
     }
@@ -458,7 +460,8 @@
         } else if (preference == mTetherHelp) {
             showDialog(DIALOG_TETHER_HELP);
         }
-        return false;
+
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 
     private String findIface(String[] ifaces, String[] regexes) {
diff --git a/src/com/android/settings/wifi/WifiApSettings.java b/src/com/android/settings/wifi/WifiApSettings.java
index ca1b856..7336c6c 100644
--- a/src/com/android/settings/wifi/WifiApSettings.java
+++ b/src/com/android/settings/wifi/WifiApSettings.java
@@ -17,29 +17,24 @@
 package com.android.settings.wifi;
 
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.Activity;
 import android.app.Dialog;
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.preference.CheckBoxPreference;
-import android.provider.Settings;
-import android.util.Log;
 import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.AuthAlgorithm;
 import android.net.wifi.WifiConfiguration.KeyMgmt;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
 
 /*
  * Displays preferences for Tethering.
  */
-public class WifiApSettings extends PreferenceActivity
+public class WifiApSettings extends SettingsPreferenceFragment
                             implements DialogInterface.OnClickListener {
 
     private static final String WIFI_AP_SSID_AND_SECURITY = "wifi_ap_ssid_and_security";
@@ -61,26 +56,34 @@
     private WifiConfiguration mWifiConfig = null;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.wifi_ap_settings);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        final Activity activity = getActivity();
 
         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
         mWifiConfig = mWifiManager.getWifiApConfiguration();
         mSecurityType = getResources().getStringArray(R.array.wifi_ap_security);
 
-        addPreferencesFromResource(R.xml.wifi_ap_settings);
+
 
         mCreateNetwork = findPreference(WIFI_AP_SSID_AND_SECURITY);
         mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
 
-        mWifiApEnabler = new WifiApEnabler(this, mEnableWifiAp);
+        mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
 
         if(mWifiConfig == null) {
-            String s = getString(com.android.internal.R.string.wifi_tether_configure_ssid_default);
-            mCreateNetwork.setSummary(String.format(getString(CONFIG_SUBTEXT),
+            final String s = activity.getString(
+                    com.android.internal.R.string.wifi_tether_configure_ssid_default);
+            mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT),
                                                     s, mSecurityType[OPEN_INDEX]));
         } else {
-            mCreateNetwork.setSummary(String.format(getString(CONFIG_SUBTEXT),
+            mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT),
                                       mWifiConfig.SSID,
                                       mWifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
                                       mSecurityType[WPA_INDEX] : mSecurityType[OPEN_INDEX]));
@@ -88,22 +91,23 @@
     }
 
     @Override
-    protected Dialog onCreateDialog(int id) {
+    public Dialog onCreateDialog(int id) {
         if (id == DIALOG_AP_SETTINGS) {
-            mDialog = new WifiApDialog(this, this, mWifiConfig);
+            final Activity activity = getActivity();
+            mDialog = new WifiApDialog(activity, this, mWifiConfig);
             return mDialog;
         }
         return null;
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
         mWifiApEnabler.resume();
     }
 
     @Override
-    protected void onPause() {
+    public void onPause() {
         super.onPause();
         mWifiApEnabler.pause();
     }
@@ -117,7 +121,6 @@
     }
 
     public void onClick(DialogInterface dialogInterface, int button) {
-
         if (button == DialogInterface.BUTTON_POSITIVE) {
             mWifiConfig = mDialog.getConfig();
             if (mWifiConfig != null) {
@@ -135,7 +138,7 @@
                 } else {
                     mWifiManager.setWifiApConfiguration(mWifiConfig);
                 }
-                mCreateNetwork.setSummary(String.format(getString(CONFIG_SUBTEXT),
+                mCreateNetwork.setSummary(String.format(getActivity().getString(CONFIG_SUBTEXT),
                             mWifiConfig.SSID,
                             mWifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
                             mSecurityType[WPA_INDEX] : mSecurityType[OPEN_INDEX]));
