diff --git a/res/xml/settings.xml b/res/xml/settings.xml
deleted file mode 100644
index 5b6691e..0000000
--- a/res/xml/settings.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-    android:title="@string/settings_label"
-    android:key="parent">
-
-        <!-- Operator hook -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:key="operator_settings">
-            <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" />
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Manufacturer hook -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:key="manufacturer_settings">
-            <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Wireless controls -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:title="@string/radio_controls_title"
-            android:fragment="com.android.settings.WirelessSettings"
-            settings:icon="@drawable/ic_settings_wireless">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Call settings - this is in the phone process -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:key="call_settings"
-            settings:icon="@drawable/ic_settings_call"
-            android:title="@string/call_settings_title">
-            <intent
-                android:action="android.intent.action.MAIN"
-                android:targetPackage="com.android.phone"
-                android:targetClass="com.android.phone.CallFeaturesSetting" />
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Sound -->
-
-        <com.android.settings.IconPreferenceScreen
-            settings:icon="@drawable/ic_settings_sound"
-            android:fragment="com.android.settings.SoundSettings"
-            android:title="@string/sound_settings_title">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Display -->
-
-        <com.android.settings.IconPreferenceScreen
-            settings:icon="@drawable/ic_settings_display"
-            android:fragment="com.android.settings.DisplaySettings"
-            android:title="@string/display_settings_title">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Security & Location -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.SecuritySettings"
-            settings:icon="@drawable/ic_settings_security"
-            android:title="@string/security_settings_title"
-            android:key="security_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Application Settings -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.ApplicationSettings"
-            settings:icon="@drawable/ic_settings_applications"
-            android:title="@string/applications_settings"
-            android:key="applications_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Data Sync. The settings activity will ensure this is resolved to an
-             activity on the system image, otherwise it will remove this
-             preference. -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.ManageAccountsSettings"
-            settings:icon="@drawable/ic_settings_sync"
-            android:title="@string/sync_settings"
-            android:key="sync_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Privacy -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.PrivacySettings"
-            settings:icon="@drawable/ic_settings_privacy"
-            android:title="@string/privacy_settings"
-            android:key="privacy_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Storage -->
-
-        <com.android.settings.IconPreferenceScreen 
-            android:fragment="com.android.settings.deviceinfo.Memory"
-            settings:icon="@drawable/ic_settings_storage"
-            android:title="@string/storage_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Language -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.LanguageSettings"
-            settings:icon="@drawable/ic_settings_language"
-            android:title="@string/language_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Voice input & output -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.VoiceInputOutputSettings"
-            settings:icon="@drawable/ic_settings_speech"
-            android:title="@string/voice_input_output_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Accessibility feedback -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.AccessibilitySettings"
-            settings:icon="@drawable/ic_settings_accessibility"
-            android:title="@string/accessibility_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Dock -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:key="dock_settings"
-            android:fragment="com.android.settings.DockSettings"
-            settings:icon="@drawable/ic_settings_dock"
-            android:title="@string/dock_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- Date & Time -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.DateTimeSettings"
-            settings:icon="@drawable/ic_settings_date_time"
-            android:title="@string/date_and_time_settings_title">
-        </com.android.settings.IconPreferenceScreen>
-
-        <!-- About Device -->
-
-        <com.android.settings.IconPreferenceScreen
-            android:fragment="com.android.settings.DeviceInfoSettings"
-            settings:icon="@drawable/ic_settings_about"
-            android:title="@string/about_settings">
-        </com.android.settings.IconPreferenceScreen>
-
-</PreferenceScreen>
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
new file mode 100644
index 0000000..43338bb
--- /dev/null
+++ b/res/xml/settings_headers.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+
+<preference-headers
+        xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Operator hook -->
+
+    <header
+        android:fragment="com.android.settings.WirelessSettings"
+        android:id="@+id/operator_settings">
+        <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" />
+    </header>
+
+    <!-- Manufacturer hook -->
+
+    <header
+        android:fragment="com.android.settings.WirelessSettings"
+        android:id="@+id/manufacturer_settings">
+        <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
+    </header>
+
+    <!-- Wireless controls -->
+
+    <header
+        android:title="@string/radio_controls_title"
+        android:fragment="com.android.settings.WirelessSettings"
+        android:icon="@drawable/ic_settings_wireless">
+    </header>
+
+    <!-- Call settings - this is in the phone process -->
+
+    <header
+        android:id="@+id/call_settings"
+        android:icon="@drawable/ic_settings_call"
+        android:title="@string/call_settings_title">
+        <intent
+            android:action="android.intent.action.MAIN"
+            android:targetPackage="com.android.phone"
+            android:targetClass="com.android.phone.CallFeaturesSetting" />
+    </header>
+
+    <!-- Sound -->
+
+    <header
+        android:icon="@drawable/ic_settings_sound"
+        android:fragment="com.android.settings.SoundSettings"
+        android:title="@string/sound_settings_title">
+    </header>
+
+    <!-- Display -->
+
+    <header
+        android:icon="@drawable/ic_settings_display"
+        android:fragment="com.android.settings.DisplaySettings"
+        android:title="@string/display_settings_title">
+    </header>
+
+    <!-- Security & Location -->
+
+    <header
+        android:fragment="com.android.settings.SecuritySettings"
+        android:icon="@drawable/ic_settings_security"
+        android:title="@string/security_settings_title"
+        android:id="@+id/security_settings">
+    </header>
+
+    <!-- Application Settings -->
+
+    <header
+        android:fragment="com.android.settings.ApplicationSettings"
+        android:icon="@drawable/ic_settings_applications"
+        android:title="@string/applications_settings"
+        android:id="@+id/applications_settings">
+    </header>
+
+    <!-- Data Sync. The settings activity will ensure this is resolved to an
+         activity on the system image, otherwise it will remove this
+         preference. -->
+
+    <header
+        android:fragment="com.android.settings.ManageAccountsSettings"
+        android:icon="@drawable/ic_settings_sync"
+        android:title="@string/sync_settings"
+        android:id="@+id/sync_settings">
+    </header>
+
+    <!-- Privacy -->
+
+    <header
+        android:fragment="com.android.settings.PrivacySettings"
+        android:icon="@drawable/ic_settings_privacy"
+        android:title="@string/privacy_settings"
+        android:id="@+id/privacy_settings">
+    </header>
+
+    <!-- Storage -->
+
+    <header 
+        android:fragment="com.android.settings.deviceinfo.Memory"
+        android:icon="@drawable/ic_settings_storage"
+        android:title="@string/storage_settings">
+    </header>
+
+    <!-- Language -->
+
+    <header
+        android:fragment="com.android.settings.LanguageSettings"
+        android:icon="@drawable/ic_settings_language"
+        android:title="@string/language_settings">
+    </header>
+
+    <!-- Voice input & output -->
+
+    <header
+        android:fragment="com.android.settings.VoiceInputOutputSettings"
+        android:icon="@drawable/ic_settings_speech"
+        android:title="@string/voice_input_output_settings">
+    </header>
+
+    <!-- Accessibility feedback -->
+
+    <header
+        android:fragment="com.android.settings.AccessibilitySettings"
+        android:icon="@drawable/ic_settings_accessibility"
+        android:title="@string/accessibility_settings">
+    </header>
+
+    <!-- Dock -->
+
+    <header
+        android:id="@+id/dock_settings"
+        android:fragment="com.android.settings.DockSettings"
+        android:icon="@drawable/ic_settings_dock"
+        android:title="@string/dock_settings">
+    </header>
+
+    <!-- Date & Time -->
+
+    <header
+        android:fragment="com.android.settings.DateTimeSettings"
+        android:icon="@drawable/ic_settings_date_time"
+        android:title="@string/date_and_time_settings_title">
+    </header>
+
+    <!-- About Device -->
+
+    <header
+        android:fragment="com.android.settings.DeviceInfoSettings"
+        android:icon="@drawable/ic_settings_about"
+        android:title="@string/about_settings">
+    </header>
+</preference-headers>
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 287e312..dacc19f 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -106,6 +106,8 @@
     private LockPatternUtils mLockPatternUtils;
     private ListPreference mLockAfter;
     
+    private SettingsObserver mSettingsObserver;
+
     private final class SettingsObserver implements Observer {
         public void update(Observable o, Object arg) {
             updateToggles();
@@ -125,14 +127,24 @@
         createPreferenceHierarchy();
 
         updateToggles();
+    }
 
+    @Override
+    public void onStart() {
+        super.onStart();
         // listen for Location Manager settings changes
         Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
                 "(" + Settings.System.NAME + "=?)",
                 new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
                 null);
         mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
-        mContentQueryMap.addObserver(new SettingsObserver());
+        mContentQueryMap.addObserver(mSettingsObserver = new SettingsObserver());
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mContentQueryMap.deleteObserver(mSettingsObserver);
     }
 
     private PreferenceScreen createPreferenceHierarchy() {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 224aa53..738acc3 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,354 +16,61 @@
 
 package com.android.settings;
 
-import android.app.Activity;
 import android.app.Fragment;
-import android.content.Context;
-import android.content.Intent;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceScreen;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.LinearLayout;
-import android.widget.TextView;
+import android.preference.PreferenceActivity;
 
-import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Top-level settings activity to handle single pane and double pane UI layout.
  */
-public class Settings extends Activity
-        implements PreferenceFragment.OnPreferenceStartFragmentCallback,
-        SettingsPreferenceFragment.OnStateListener,
+public class Settings extends PreferenceActivity implements
         SettingsPreferenceFragment.FragmentStarter {
 
-    private static final boolean DBG = false;
+    // TODO: Update Call Settings based on airplane mode state.
 
-    private static final String TAG = "Settings";
-
-    private static final String KEY_PARENT = "parent";
-    private static final String KEY_CALL_SETTINGS = "call_settings";
-    private static final String KEY_SYNC_SETTINGS = "sync_settings";
-    private static final String KEY_SEARCH_SETTINGS = "search_settings";
-    private static final String KEY_DOCK_SETTINGS = "dock_settings";
-
-    private static final String KEY_OPERATOR_SETTINGS = "operator_settings";
-    private static final String KEY_MANUFACTURER_SETTINGS = "manufacturer_settings";
-
-    public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
-
-    public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
-
-    private static final String BACK_STACK_PREFS = ":settings:prefs";
-
-    private View mPrefsPane;
-    private View mMainPane;
-    private boolean mSinglePane;
-
-    private BreadCrumbs mBreadCrumbs;
-
+    /**
+     * Populate the activity with the top-level headers.
+     */
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.settings_top_level);
-        mPrefsPane = findViewById(R.id.prefs);
-        mMainPane = findViewById(R.id.top_level);
-        mSinglePane = mMainPane == null;
-        if (mSinglePane) mMainPane = mPrefsPane;
+    public void onBuildHeaders(List<Header> target) {
+        loadHeadersFromResource(R.xml.settings_headers, target);
 
-        final Intent intent = getIntent();
-        String initialFragment = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
-        Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+        updateHeaderList(target);
+    }
 
-        createActionBar();
-
-        if (mSinglePane) {
-            if (initialFragment != null) {
-                showFragment(initialFragment, initialArguments);
-            } else {
-                // Intent#getCompontent() lets us get Fragment name, even when the Intent is
-                // given via <activity-alias>.
-                //
-                // e.g. When we reach here via "ChildSetting" activity-alias,
-                // we should get the name here instead of targetActivity ("Settings").
-                if (intent.getComponent().getClassName().equals(this.getClass().getName())) {
-                    showFragment(TopLevelSettings.class.getName(), null);
-                } else {
-                    showFragment(intent.getComponent().getClassName(), intent.getExtras());
-                }
+    private void updateHeaderList(List<Header> target) {
+        int i = 0;
+        while (i < target.size()) {
+            Header header = target.get(i);
+            long id = header.id;
+            if (id == R.id.dock_settings) {
+                if (!needsDockSettings())
+                    target.remove(header);
+            } else if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
+                Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);
+            } else if (id == R.id.call_settings) {
+                if (!Utils.isVoiceCapable(this))
+                    target.remove(header);
             }
-        } else {
-            if (!intent.getComponent().getClassName().equals(this.getClass().getName())) {
-                if (showFragment(intent.getComponent().getClassName(), intent.getExtras())) {
-                    mMainPane.setVisibility(View.GONE);
-                }
-            } else {
-                Fragment topLevel = getFragmentManager().findFragmentById(R.id.top_level);
-                if (topLevel != null) {
-                    ((TopLevelSettings) topLevel).selectFirst();
-                }
-            }
+            if (target.get(i) == header)
+                i++;
         }
     }
 
-    private void createActionBar() {
-        LayoutInflater inflater = (LayoutInflater)
-                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        View customNavBar = inflater.inflate(R.layout.settings_actionbar, null, false);
-        getActionBar().setCustomNavigationMode(customNavBar);
-        mBreadCrumbs = (BreadCrumbs) customNavBar.findViewById(R.id.bread_crumbs);
-        mBreadCrumbs.setActivity(this);
+    private boolean needsDockSettings() {
+        return getResources().getBoolean(R.bool.has_dock_settings);
     }
 
-    boolean showFragment(Preference preference) {
-        if (mSinglePane) {
-            startWithFragment(preference.getFragment(), preference.getExtras());
-            return false;
-        } else {
-            mBreadCrumbs.clear();
-            return showFragment(preference.getFragment(), preference.getExtras());
-        }
-    }
-
-    private void startWithFragment(String fragmentName, Bundle args) {
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setClass(this, getClass());
-        intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
-        intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
-        startActivity(intent);
-    }
-
-    private boolean showFragment(String fragmentClass, Bundle extras) {
-        if (DBG) Log.d(TAG, "showFragment");
-       Fragment f = Fragment.instantiate(this, fragmentClass, extras);
-        if (f instanceof SettingsPreferenceFragment) {
-            SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
-            spf.setOnStateListener(this);
-            spf.setFragmentStarter(this);
-        }
-        mBreadCrumbs.clear();
-        getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
-        getFragmentManager().openTransaction().replace(R.id.prefs, f).commit();
-        return true;
-    }
-
-    private void addToBreadCrumbs(Fragment fragment) {
-        final CharSequence title = ((PreferenceFragment) fragment)
-                .getPreferenceScreen().getTitle();
-        if (mSinglePane) {
-            mBreadCrumbs.clear();
-        }
-        mBreadCrumbs.push(title);
-    }
-
-    private void removeFromBreadCrumbs(Fragment fragment) {
-        mBreadCrumbs.pop(((PreferenceFragment) fragment).getPreferenceScreen().getTitle());
-        mBreadCrumbs.update();
-    }
-
-    public void onCreated(SettingsPreferenceFragment fragment) {
-        if (DBG) Log.d(TAG, "Fragment created " + fragment);
-        addToBreadCrumbs(fragment);
-    }
-
-    public void onDestroyed(SettingsPreferenceFragment fragment) {
-        Log.d(TAG, "Fragment destroyed " + fragment + " (name: " + fragment.getClass() + ")");
-    }
-
-    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
-        if (DBG) Log.d(TAG, "onPreferenceStartFragment");
-        return startFragment(caller, pref.getFragment(), -1, pref.getExtras());
-    }
-
-    public boolean startFragment(
-            Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
+    public boolean startFragment(Fragment caller, String fragmentClass, int requestCode,
+            Bundle extras) {
         Fragment f = Fragment.instantiate(this, fragmentClass, extras);
         caller.setTargetFragment(f, requestCode);
         if (f instanceof SettingsPreferenceFragment) {
             SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
-            spf.setOnStateListener(this);
             spf.setFragmentStarter(this);
         }
-        getFragmentManager().openTransaction().replace(R.id.prefs, f)
-                .addToBackStack(BACK_STACK_PREFS).commit();
         return true;
     }
-
-    @Override
-    public void onBackPressed() {
-        mBreadCrumbs.pop();
-        mBreadCrumbs.update();
-        super.onBackPressed();
-    }
-
-    public static class TopLevelSettings extends PreferenceFragment {
-
-        private IconPreferenceScreen mHighlightedPreference;
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            // Load the preferences from an XML resource
-            addPreferencesFromResource(R.xml.settings);
-
-            updatePreferenceList();
-        }
-
-        @Override
-        public void onResume() {
-            super.onResume();
-
-            updateCallSettings();
-        }
-
-        private void updateCallSettings() {
-            Preference callSettings = findPreference(KEY_CALL_SETTINGS);
-            // Might have been removed in non-voice-capable devices
-            if (callSettings != null) {
-                callSettings.setEnabled(!AirplaneModeEnabler.isAirplaneModeOn(getActivity()));
-            }
-        }
-
-        private void updatePreferenceList() {
-            final Activity activity = getActivity();
-            PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
-            Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
-            if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
-                    && dockSettings != null) {
-                parent.removePreference(dockSettings);
-            }
-
-            Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
-                    KEY_OPERATOR_SETTINGS);
-            Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
-                    KEY_MANUFACTURER_SETTINGS);
-
-            Preference callSettings = parent.findPreference(KEY_CALL_SETTINGS);
-            if (!Utils.isVoiceCapable(activity) && callSettings != null) {
-                parent.removePreference(callSettings);
-            }
-        }
-
-        @Override
-        public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
-            // If it is a fragment preference, replace the prefs pane in the 2 pane UI.
-            final String fragmentClass = preference.getFragment();
-            if (fragmentClass != null) {
-                boolean showed = ((Settings) getActivity()).showFragment(preference);
-                if (showed) {
-                    highlight(preference);
-                }
-                return showed;
-            }
-            return false;
-        }
-
-        void highlight(Preference preference) {
-            if (mHighlightedPreference != null) {
-                mHighlightedPreference.setHighlighted(false);
-            }
-            mHighlightedPreference = (IconPreferenceScreen) preference;
-            mHighlightedPreference.setHighlighted(true);
-        }
-
-        void selectFirst() {
-            Preference first = getPreferenceScreen().getPreference(0);
-            onPreferenceTreeClick(getPreferenceScreen(), first);
-        }
-    }
-
-    public static class BreadCrumbs extends LinearLayout implements OnClickListener {
-
-        private ArrayList<CharSequence> mTitles = new ArrayList<CharSequence>();
-        private TextView mLevelUpTitle;
-        private TextView mCurrentLevelTitle;
-        private View mDivider;
-        private Activity mActivity;
-
-        public BreadCrumbs(Context context) {
-            this(context, null);
-        }
-
-        public BreadCrumbs(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-
-        public void push(CharSequence title) {
-            if (mTitles.size() == 0
-                    || !TextUtils.equals(title, mTitles.get(mTitles.size() - 1))) {
-                mTitles.add(title);
-                update();
-            }
-        }
-
-        public void pop() {
-            if (mTitles.size() > 0) {
-                mTitles.remove(mTitles.size() - 1);
-            }
-        }
-
-        public void pop(CharSequence title) {
-            if (mTitles.size() > 1) {
-                mTitles.remove(title);
-            }
-        }
-
-        public void clear() {
-            mTitles.clear();
-        }
-
-        private void initNavViews() {
-            if (mLevelUpTitle == null) {
-                mLevelUpTitle = (TextView) findViewById(R.id.level_up_title);
-                mCurrentLevelTitle = (TextView) findViewById(R.id.level_current_title);
-                mDivider = findViewById(R.id.level_divider);
-                if (mLevelUpTitle != null) {
-                    mLevelUpTitle.setOnClickListener(this);
-                }
-                if (mCurrentLevelTitle != null) {
-                    mCurrentLevelTitle.setOnClickListener(this);
-                }
-            }
-        }
-
-        public void update() {
-            initNavViews();
-            if (mLevelUpTitle == null) return;
-
-            final int titleCount = mTitles.size();
-            if (titleCount > 1) {
-                mLevelUpTitle.setText(mTitles.get(titleCount - 2));
-                mLevelUpTitle.setVisibility(VISIBLE);
-                mDivider.setVisibility(VISIBLE);
-            } else {
-                mLevelUpTitle.setVisibility(GONE);
-                mDivider.setVisibility(GONE);
-            }
-            if (titleCount > 0) {
-                mCurrentLevelTitle.setText(mTitles.get(titleCount - 1));
-            } else {
-                mCurrentLevelTitle.setText("");
-            }
-        }
-
-        public void setActivity(Activity activity) {
-            mActivity = activity;
-        }
-
-        public void onClick(View v) {
-            if (mActivity == null)
-                return;
-            if (v == mLevelUpTitle) {
-                mActivity.onBackPressed();
-            }
-        }
-    }
 }
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 87726c1..f632a02 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -35,7 +35,6 @@
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
-import android.util.Log;
 import android.webkit.WebView;
 
 import java.io.InputStream;
@@ -220,8 +219,8 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
+    public void onStart() {
+        super.onStart();
 
         final Activity activity = getActivity();
 
@@ -244,8 +243,8 @@
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
+    public void onStop() {
+        super.onStop();
         getActivity().unregisterReceiver(mTetherChangeReceiver);
         mTetherChangeReceiver = null;
         mWifiApEnabler.pause();
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
index 488e117..dc3a96b 100644
--- a/src/com/android/settings/TextToSpeechSettings.java
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -37,9 +37,9 @@
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.preference.Preference.OnPreferenceClickListener;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
 import android.speech.tts.TextToSpeech;
@@ -126,6 +126,7 @@
         mDefaultLocVariant = currentLocale.getVariant();
 
         mTts = new TextToSpeech(activity, this);
+        initClickers();
     }
 
 
@@ -136,7 +137,6 @@
             // whenever we return to this screen, we don't know the state of the
             // system, so we have to recheck that we can play the demo, or it must be disabled.
             // TODO make the TTS service listen to "changes in the system", i.e. sd card un/mount
-            initClickers();
             updateWidgetState();
             checkVoiceData();
         }
@@ -357,7 +357,6 @@
             mTts.setLanguage(new Locale(mDefaultLanguage, mDefaultCountry, mDefaultLocVariant));
             mTts.setSpeechRate(mDefaultRate/100.0f);
             initDefaultSettings();
-            initClickers();
             updateWidgetState();
             checkVoiceData();
             mTtsStarted = true;
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index f1e74ac..6386c86 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -31,7 +31,6 @@
 import android.text.InputType;
 import android.util.Log;
 import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -39,7 +38,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
-import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AlphabetIndexer;
 import android.widget.EditText;
 import android.widget.ListAdapter;
@@ -47,6 +46,7 @@
 import android.widget.SectionIndexer;
 import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
 
 import java.util.Locale;
 
@@ -198,8 +198,10 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
+        MenuItem actionItem =
+                menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
                 .setIcon(R.drawable.ic_menu_add);
+        actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
     }
 
     @Override
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 4c43712..d635403 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -20,8 +20,8 @@
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.graphics.drawable.Drawable;
@@ -29,9 +29,9 @@
 import android.os.SystemProperties;
 import android.preference.Preference;
 import android.preference.PreferenceGroup;
+import android.preference.PreferenceActivity.Header;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
-import android.util.Log;
 
 import java.util.List;
 
@@ -203,6 +203,66 @@
         return false;
     }
 
+    public static boolean updateHeaderToSpecificActivityFromMetaDataOrRemove(Context context,
+            List<Header> target, Header header) {
+
+        Intent intent = header.intent;
+        if (intent != null) {
+            // Find the activity that is in the system image
+            PackageManager pm = context.getPackageManager();
+            List<ResolveInfo> list = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
+            int listSize = list.size();
+            for (int i = 0; i < listSize; i++) {
+                ResolveInfo resolveInfo = list.get(i);
+                if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+                        != 0) {
+                    Drawable icon = null;
+                    String title = null;
+                    String summary = null;
+
+                    // Get the activity's meta-data
+                    try {
+                        Resources res = pm.getResourcesForApplication(
+                                resolveInfo.activityInfo.packageName);
+                        Bundle metaData = resolveInfo.activityInfo.metaData;
+
+                        if (res != null && metaData != null) {
+                            icon = res.getDrawable(metaData.getInt(META_DATA_PREFERENCE_ICON));
+                            title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE));
+                            summary = res.getString(metaData.getInt(META_DATA_PREFERENCE_SUMMARY));
+                        }
+                    } catch (NameNotFoundException e) {
+                        // Ignore
+                    } catch (NotFoundException e) {
+                        // Ignore
+                    }
+
+                    // Set the preference title to the activity's label if no
+                    // meta-data is found
+                    if (TextUtils.isEmpty(title)) {
+                        title = resolveInfo.loadLabel(pm).toString();
+                    }
+
+                    // Set icon, title and summary for the preference
+                    // TODO:
+                    //header.icon = icon;
+                    header.title = title;
+                    header.summary = summary;
+                    // Replace the intent with this specific activity
+                    header.intent = new Intent().setClassName(resolveInfo.activityInfo.packageName,
+                            resolveInfo.activityInfo.name);
+
+                    return true;
+                }
+            }
+        }
+
+        // Did not find a matching activity, so remove the preference
+        if (target.remove(header)) System.err.println("Removed " + header.id);
+
+        return false;
+    }
+
     /**
      * Returns true if Monkey is running.
      */
