diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0ec6098..b645f9f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -205,6 +205,22 @@
                 android:resource="@id/wifi_settings" />
         </activity>
 
+        <activity android:name="Settings$SavedAccessPointsSettingsActivity"
+                android:taskAffinity="com.android.settings"
+                android:label="@string/wifi_saved_access_points_label"
+                android:configChanges="orientation|keyboardHidden|screenSize"
+                android:parentActivityName="Settings$WifiSettingsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.WIFI_IF_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.wifi.SavedAccessPointsSettings" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/wifi_settings" />
+        </activity>
+
         <activity android:name=".wifi.WifiInfo"
                 android:theme="@style/Theme.SubSettingsDialogWhenLarge"
                 android:taskAffinity="com.android.settings"
diff --git a/res/layout/wifi_advance_layout.xml b/res/layout/wifi_advance_layout.xml
new file mode 100644
index 0000000..b4a257a
--- /dev/null
+++ b/res/layout/wifi_advance_layout.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="48dip"
+    android:gravity="center_vertical"
+    android:background="?android:attr/selectableItemBackground">
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:paddingTop="6dip"
+        android:paddingBottom="6dip">
+
+        <TextView
+            android:id="@+android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingStart="16dip"
+            android:paddingEnd="16dip"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:ellipsize="marquee"
+            android:fadingEdge="horizontal" />
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@android:id/title"
+            android:layout_alignStart="@android:id/title"
+            android:paddingStart="16dip"
+            android:layout_marginEnd="16dip"
+            android:visibility="gone"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="4" />
+
+    </RelativeLayout>
+
+    <LinearLayout
+        android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        android:orientation="vertical" />
+
+</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 611801c..bf975e2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1539,7 +1539,9 @@
     <string name="wifi_connect_failed_message" product="default">The phone was unable to connect to this Wi\u2011Fi network.</string>
 
     <!-- Wi-Fi Advanced Settings --> <skip />
-    <!-- Wi-Fi settings screen, advanced, settings section.  This is a header shown above advanced wifi settings. -->
+    <!-- Wi-Fi settings screen, Saved networks, settings section.  This is a header shown above Saved networks wifi settings. [CHAR LIMIT=30] -->
+    <string name="wifi_saved_access_points_titlebar">Saved networks</string>
+    <!-- Wi-Fi settings screen, advanced, settings section.  This is a header shown above advanced wifi settings. [CHAR LIMIT=30] -->
     <string name="wifi_advanced_titlebar">Advanced Wi\u2011Fi</string>
     <!-- Wi-Fi settings screen, setting title for setting the band [CHAR LIMIT=50]-->
     <string name="wifi_setting_frequency_band_title">Wi\u2011Fi frequency band</string>
@@ -1553,7 +1555,9 @@
     <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's current IP address. -->
     <string name="wifi_advanced_ip_address_title">IP address</string>
 
-    <!-- Wifi Advanced settings.  Used as a label under the shortcut icon that goes to Wifi advanced settings. [CHAR LIMIT=20]-->
+    <!-- Wifi saved access points.  Used as a label under the shortcut icon that goes to Wifi saved access points. [CHAR LIMIT=20] -->
+    <string name="wifi_saved_access_points_label">Saved networks</string>
+    <!-- Wifi Advanced settings.  Used as a label under the shortcut icon that goes to Wifi advanced settings. [CHAR LIMIT=20] -->
     <string name="wifi_advanced_settings_label">IP settings</string>
     <!-- Menu item to save the IP settings -->
     <string name="wifi_ip_settings_menu_save">Save</string>
@@ -3625,6 +3629,8 @@
 
     <!-- Label for power consumed by the screen -->
     <string name="power_screen">Screen</string>
+    <!-- Label for power consumed by the flashlight -->
+    <string name="power_flashlight">Flashlight</string>
     <!-- Label for power consumed by Wi-Fi -->
     <string name="power_wifi">Wi\u2011Fi</string>
     <!-- Label for power consumed by Bluetooth -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 6d2fdd7..0f7e652 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -238,11 +238,6 @@
         <item name="android:singleLine">true</item>
     </style>
 
-    <style name="InputMethodPreferenceStyle">
-        <item name="android:layout">@layout/preference_inputmethod</item>
-        <item name="android:widgetLayout">@layout/preference_inputmethod_widget</item>
-    </style>
-
     <style name="TextAppearance.PagerTabs" parent="@android:style/TextAppearance.Material.Small">
         <item name="android:textAllCaps">true</item>
         <item name="android:textStyle">bold</item>
diff --git a/res/xml/wifi_advanced_settings.xml b/res/xml/wifi_advanced_settings.xml
index efa94b2..118f691 100644
--- a/res/xml/wifi_advanced_settings.xml
+++ b/res/xml/wifi_advanced_settings.xml
@@ -68,20 +68,25 @@
             android:title="@string/wifi_menu_wps_pbc"
             android:persistent="false" />
 
+    <Preference
+            android:key="wps_pin_entry"
+            android:title="@string/wifi_menu_wps_pin"
+            android:persistent="false" />
+
     <CheckBoxPreference
             android:key="suspend_optimizations"
             android:title="@string/wifi_suspend_optimizations"
             android:summary="@string/wifi_suspend_optimizations_summary"
             android:persistent="false" />
-    
-    <Preference android:key="mac_address" 
-        style="?android:attr/preferenceInformationStyle" 
-        android:title="@string/wifi_advanced_mac_address_title"
-        />
-    
-    <Preference android:key="current_ip_address"
-        style="?android:attr/preferenceInformationStyle"
-        android:title="@string/wifi_advanced_ip_address_title"
-        />
+
+    <Preference
+            android:key="mac_address"
+            android:title="@string/wifi_advanced_mac_address_title"
+            android:layout="@layout/wifi_advance_layout" />
+
+    <Preference
+            android:key="current_ip_address"
+            android:title="@string/wifi_advanced_ip_address_title"
+            android:layout="@layout/wifi_advance_layout" />
 
 </PreferenceScreen>   
diff --git a/res/xml/wifi_display_saved_access_points.xml b/res/xml/wifi_display_saved_access_points.xml
new file mode 100644
index 0000000..2be31d2
--- /dev/null
+++ b/res/xml/wifi_display_saved_access_points.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+    android:title="@string/wifi_display_settings_title">
+
+</PreferenceScreen>
diff --git a/res/xml/wifi_display_settings.xml b/res/xml/wifi_display_settings.xml
index 2b32106..81fb701 100644
--- a/res/xml/wifi_display_settings.xml
+++ b/res/xml/wifi_display_settings.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -14,8 +14,7 @@
      limitations under the License.
 -->
 
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/wifi_display_settings_title" >
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/wifi_saved_access_points_titlebar">
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index e9fed4f..151927d 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -209,6 +209,7 @@
                         final InputMethodManager imm = (InputMethodManager) getSystemService(
                                                   Context.INPUT_METHOD_SERVICE);
                         imm.showSoftInput(mPasswordEntry, 0);
+                        setBackFunctionality(true);
                     }
                     if (mLockPatternView != null) {
                         mLockPatternView.setEnabled(true);
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 33bdedf..ada1b0d 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -73,6 +73,7 @@
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
     public static class AdvancedWifiSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class SavedAccessPointsSettingsActivity extends SettingsActivity { /* empty */ }
     public static class TextToSpeechSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AndroidBeamSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiDisplaySettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 1b2a48c..b0d3241 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -107,6 +107,7 @@
 import com.android.settings.wfd.WifiDisplaySettings;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.wifi.AdvancedWifiSettings;
+import com.android.settings.wifi.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.WifiSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 
@@ -234,6 +235,7 @@
             WirelessSettings.class.getName(),
             WifiSettings.class.getName(),
             AdvancedWifiSettings.class.getName(),
+            SavedAccessPointsWifiSettings.class.getName(),
             BluetoothSettings.class.getName(),
             TetherSettings.class.getName(),
             WifiP2pSettings.class.getName(),
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index c2bf127..e527276 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -150,6 +150,10 @@
                 name = context.getResources().getString(R.string.power_screen);
                 iconId = R.drawable.ic_settings_display;
                 break;
+            case FLASHLIGHT:
+                name = context.getResources().getString(R.string.power_flashlight);
+                iconId = R.drawable.ic_settings_display;
+                break;
             case APP:
                 name = sipper.packageWithHighestDrain;
                 break;
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
index daff7ea..60e73f5 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import android.content.Intent;
+import android.graphics.Bitmap;
 import android.graphics.DashPathEffect;
 import android.os.BatteryManager;
 import android.provider.Settings;
@@ -219,6 +220,9 @@
     final ArrayList<TimeLabel> mTimeLabels = new ArrayList<TimeLabel>();
     final ArrayList<DateLabel> mDateLabels = new ArrayList<DateLabel>();
 
+    Bitmap mBitmap;
+    Canvas mCanvas;
+
     static class TextAttrs {
         ColorStateList textColor = null;
         int textSize = 15;
@@ -339,6 +343,8 @@
     public BatteryHistoryChart(Context context, AttributeSet attrs) {
         super(context, attrs);
 
+        if (DEBUG) Log.d(TAG, "New BatteryHistoryChart!");
+
         mBatteryWarnLevel = mContext.getResources().getInteger(
                 com.android.internal.R.integer.config_lowBatteryWarningLevel);
         mBatteryCriticalLevel = mContext.getResources().getInteger(
@@ -468,6 +474,8 @@
         mStats = stats;
         mBatteryBroadcast = broadcast;
 
+        if (DEBUG) Log.d(TAG, "Setting stats...");
+
         final long elapsedRealtimeUs = SystemClock.elapsedRealtime() * 1000;
 
         long uSecTime = mStats.computeBatteryRealtime(elapsedRealtimeUs,
@@ -687,8 +695,12 @@
             return;
         }
 
+        if (DEBUG) Log.d(TAG, "Rebuilding chart for: " + w + "x" + h);
+
         mLastWidth = w;
         mLastHeight = h;
+        mBitmap = null;
+        mCanvas = null;
 
         int textHeight = mTextDescent - mTextAscent;
         if (h > ((textHeight*10)+mChartMinHeight)) {
@@ -1025,6 +1037,13 @@
                 endRoundTime = calEnd.getTimeInMillis();
                 if (startRoundTime < endRoundTime) {
                     addDateLabel(calStart, mLevelLeft, mLevelRight, isDayFirst);
+                    Calendar calMid = Calendar.getInstance();
+                    calMid.setTimeInMillis(startRoundTime + ((endRoundTime - startRoundTime) / 2));
+                    calMid.set(Calendar.HOUR_OF_DAY, 0);
+                    long calMidMillis = calMid.getTimeInMillis();
+                    if (calMidMillis > startRoundTime && calMidMillis < endRoundTime) {
+                        addDateLabel(calMid, mLevelLeft, mLevelRight, isDayFirst);
+                    }
                 }
                 addDateLabel(calEnd, mLevelLeft, mLevelRight, isDayFirst);
             }
@@ -1067,8 +1086,27 @@
         final int width = getWidth();
         final int height = getHeight();
 
-        if (DEBUG) Log.d(TAG, "onDraw: " + width + "x" + height);
+        //buildBitmap(width, height);
 
+        if (DEBUG) Log.d(TAG, "onDraw: " + width + "x" + height);
+        //canvas.drawBitmap(mBitmap, 0, 0, null);
+        drawChart(canvas, width, height);
+    }
+
+    void buildBitmap(int width, int height) {
+        if (mBitmap != null && width == mBitmap.getWidth() && height == mBitmap.getHeight()) {
+            return;
+        }
+
+        if (DEBUG) Log.d(TAG, "buildBitmap: " + width + "x" + height);
+
+        mBitmap = Bitmap.createBitmap(getResources().getDisplayMetrics(), width, height,
+                Bitmap.Config.ARGB_8888);
+        mCanvas = new Canvas(mBitmap);
+        drawChart(mCanvas, width, height);
+    }
+
+    void drawChart(Canvas canvas, int width, int height) {
         final boolean layoutRtl = isLayoutRtl();
         final int textStartX = layoutRtl ? width : 0;
         final int textEndX = layoutRtl ? 0 : width;
diff --git a/src/com/android/settings/inputmethod/CheckBoxAndSettingsPreference.java b/src/com/android/settings/inputmethod/CheckBoxAndSettingsPreference.java
index 375bee7..c6208ed 100644
--- a/src/com/android/settings/inputmethod/CheckBoxAndSettingsPreference.java
+++ b/src/com/android/settings/inputmethod/CheckBoxAndSettingsPreference.java
@@ -29,7 +29,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-public class CheckBoxAndSettingsPreference extends CheckBoxPreference {
+// TODO: Make this non-persistent.
+class CheckBoxAndSettingsPreference extends CheckBoxPreference {
 
     private SettingsPreferenceFragment mFragment;
     private TextView mTitleText;
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 54a5698..0f9ae19 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -70,7 +70,6 @@
 public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
         implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener,
         KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable {
-
     private static final String KEY_PHONE_LANGUAGE = "phone_language";
     private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
     private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector";
@@ -92,10 +91,8 @@
     private PreferenceCategory mHardKeyboardCategory;
     private PreferenceCategory mGameControllerCategory;
     private Preference mLanguagePref;
-    private final ArrayList<InputMethodPreference> mInputMethodPreferenceList =
-            new ArrayList<InputMethodPreference>();
-    private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList =
-            new ArrayList<PreferenceScreen>();
+    private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
+    private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList = new ArrayList<>();
     private InputManager mIm;
     private InputMethodManager mImm;
     private boolean mIsOnlyImeSettings;
@@ -467,7 +464,7 @@
             final CharSequence curIme =
                     mInputMethodSettingValues.getCurrentInputMethodName(context);
             if (!TextUtils.isEmpty(curIme)) {
-                synchronized(this) {
+                synchronized (this) {
                     curPref.setSummary(curIme);
                 }
             }
@@ -488,8 +485,7 @@
         }
 
         // Add a check box for enabling/disabling IME
-        final InputMethodPreference pref =
-                new InputMethodPreference(this, intent, mImm, imi);
+        final InputMethodPreference pref = new InputMethodPreference(this, intent, mImm, imi);
         pref.setKey(imi.getId());
         pref.setTitle(label);
         return pref;
@@ -557,8 +553,8 @@
     }
 
     private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
-        KeyboardLayoutDialogFragment fragment =
-                new KeyboardLayoutDialogFragment(inputDeviceIdentifier);
+        KeyboardLayoutDialogFragment fragment = new KeyboardLayoutDialogFragment(
+                inputDeviceIdentifier);
         fragment.setTargetFragment(this, 0);
         fragment.show(getActivity().getFragmentManager(), "keyboardLayout");
     }
@@ -638,7 +634,7 @@
             new BaseSearchIndexProvider() {
         @Override
         public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
-            List<SearchIndexableRaw> indexables = new ArrayList<SearchIndexableRaw>();
+            List<SearchIndexableRaw> indexables = new ArrayList<>();
 
             Resources resources = context.getResources();
             String screenTitle = context.getString(R.string.language_keyboard_settings_title);
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index 3351e63..5a94e35 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -40,7 +40,6 @@
 import java.text.Collator;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -50,9 +49,8 @@
     private AlertDialog mDialog = null;
     private boolean mHaveHardKeyboard;
     final private HashMap<String, List<Preference>> mInputMethodAndSubtypePrefsMap =
-            new HashMap<String, List<Preference>>();
-    final private HashMap<String, CheckBoxPreference> mSubtypeAutoSelectionCBMap =
-            new HashMap<String, CheckBoxPreference>();
+            new HashMap<>();
+    final private HashMap<String, CheckBoxPreference> mSubtypeAutoSelectionCBMap = new HashMap<>();
     private InputMethodManager mImm;
     private List<InputMethodInfo> mInputMethodProperties;
     private String mInputMethodId;
@@ -256,7 +254,7 @@
 
             boolean isAutoSubtype = false;
             CharSequence autoSubtypeLabel = null;
-            final ArrayList<Preference> subtypePreferences = new ArrayList<Preference>();
+            final ArrayList<Preference> subtypePreferences = new ArrayList<>();
             if (subtypeCount > 0) {
                 for (int j = 0; j < subtypeCount; ++j) {
                     final InputMethodSubtype subtype = imi.getSubtypeAt(j);
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
index da95b47..b664540 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
@@ -20,19 +20,19 @@
 import com.android.settings.SettingsActivity;
 
 public class InputMethodAndSubtypeEnablerActivity extends SettingsActivity {
+    private static final String FRAGMENT_NAME = InputMethodAndSubtypeEnabler.class.getName();
+
     @Override
     public Intent getIntent() {
         final Intent modIntent = new Intent(super.getIntent());
         if (!modIntent.hasExtra(EXTRA_SHOW_FRAGMENT)) {
-            modIntent.putExtra(EXTRA_SHOW_FRAGMENT, InputMethodAndSubtypeEnabler.class.getName());
+            modIntent.putExtra(EXTRA_SHOW_FRAGMENT, FRAGMENT_NAME);
         }
         return modIntent;
     }
 
     @Override
     protected boolean isValidFragment(String fragmentName) {
-        if (InputMethodAndSubtypeEnabler.class.getName().equals(fragmentName)) return true;
-        return false;
+        return FRAGMENT_NAME.equals(fragmentName);
     }
-
 }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
index 561302a..bf3a601 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
@@ -35,7 +35,8 @@
 import java.util.List;
 import java.util.Map;
 
-public class InputMethodAndSubtypeUtil {
+// TODO: Consolidate this with {@link InputMethodSettingValuesWrapper}.
+class InputMethodAndSubtypeUtil {
 
     private static final boolean DEBUG = false;
     static final String TAG = "InputMethdAndSubtypeUtil";
@@ -50,8 +51,8 @@
     private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
             = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
 
-    private static void buildEnabledInputMethodsString(
-            StringBuilder builder, String imi, HashSet<String> subtypes) {
+    private static void buildEnabledInputMethodsString(StringBuilder builder, String imi,
+            HashSet<String> subtypes) {
         builder.append(imi);
         // Inputmethod and subtypes are saved in the settings as follows:
         // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
@@ -60,8 +61,8 @@
         }
     }
 
-    public static void buildInputMethodsAndSubtypesString(
-            StringBuilder builder, HashMap<String, HashSet<String>> imsList) {
+    private static void buildInputMethodsAndSubtypesString(StringBuilder builder,
+            HashMap<String, HashSet<String>> imsList) {
         boolean needsAppendSeparator = false;
         for (String imi: imsList.keySet()) {
             if (needsAppendSeparator) {
@@ -73,8 +74,8 @@
         }
     }
 
-    public static void buildDisabledSystemInputMethods(
-            StringBuilder builder, HashSet<String> imes) {
+    private static void buildDisabledSystemInputMethods(StringBuilder builder,
+            HashSet<String> imes) {
         boolean needsAppendSeparator = false;
         for (String ime: imes) {
             if (needsAppendSeparator) {
@@ -108,8 +109,7 @@
             ContentResolver resolver) {
         final String enabledInputMethodsStr = Settings.Secure.getString(
                 resolver, Settings.Secure.ENABLED_INPUT_METHODS);
-        HashMap<String, HashSet<String>> imsList
-                = new HashMap<String, HashSet<String>>();
+        HashMap<String, HashSet<String>> imsList = new HashMap<>();
         if (DEBUG) {
             Log.d(TAG, "--- Load enabled input methods: " + enabledInputMethodsStr);
         }
@@ -122,7 +122,7 @@
             String nextImsStr = sStringInputMethodSplitter.next();
             sStringInputMethodSubtypeSplitter.setString(nextImsStr);
             if (sStringInputMethodSubtypeSplitter.hasNext()) {
-                HashSet<String> subtypeHashes = new HashSet<String>();
+                HashSet<String> subtypeHashes = new HashSet<>();
                 // The first element is ime id.
                 String imeId = sStringInputMethodSubtypeSplitter.next();
                 while (sStringInputMethodSubtypeSplitter.hasNext()) {
@@ -135,7 +135,7 @@
     }
 
     private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
-        HashSet<String> set = new HashSet<String>();
+        HashSet<String> set = new HashSet<>();
         String disabledIMEsStr = Settings.Secure.getString(
                 resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
         if (TextUtils.isEmpty(disabledIMEsStr)) {
@@ -148,7 +148,7 @@
         return set;
     }
 
-    public static void saveInputMethodSubtypeList(SettingsPreferenceFragment context,
+    static void saveInputMethodSubtypeList(SettingsPreferenceFragment context,
             ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
             boolean hasHardKeyboard) {
         String currentInputMethodId = Settings.Secure.getString(resolver,
@@ -158,7 +158,6 @@
                 getEnabledInputMethodsAndSubtypeList(resolver);
         HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
 
-        final int imiCount = inputMethodInfos.size();
         boolean needsToResetSelectedSubtype = false;
         for (InputMethodInfo imi : inputMethodInfos) {
             final String imiId = imi.getId();
@@ -273,9 +272,8 @@
                 currentInputMethodId != null ? currentInputMethodId : "");
     }
 
-    public static void loadInputMethodSubtypeList(
-            SettingsPreferenceFragment context, ContentResolver resolver,
-            List<InputMethodInfo> inputMethodInfos,
+    static void loadInputMethodSubtypeList(SettingsPreferenceFragment context,
+            ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
             final Map<String, List<Preference>> inputMethodPrefsMap) {
         HashMap<String, HashSet<String>> enabledSubtypes =
                 getEnabledInputMethodsAndSubtypeList(resolver);
@@ -298,7 +296,7 @@
         updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
     }
 
-    public static void setSubtypesPreferenceEnabled(SettingsPreferenceFragment context,
+    static void setSubtypesPreferenceEnabled(SettingsPreferenceFragment context,
             List<InputMethodInfo> inputMethodProperties, String id, boolean enabled) {
         PreferenceScreen preferenceScreen = context.getPreferenceScreen();
         for (InputMethodInfo imi : inputMethodProperties) {
@@ -316,7 +314,7 @@
         }
     }
 
-    public static void updateSubtypesPreferenceChecked(SettingsPreferenceFragment context,
+    private static void updateSubtypesPreferenceChecked(SettingsPreferenceFragment context,
             List<InputMethodInfo> inputMethodProperties,
             HashMap<String, HashSet<String>> enabledSubtypes) {
         PreferenceScreen preferenceScreen = context.getPreferenceScreen();
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index e04f2c7..87a0a77 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -47,7 +47,8 @@
 import java.text.Collator;
 import java.util.List;
 
-public class InputMethodPreference extends CheckBoxPreference {
+// TODO: Make this non-persistent.
+class InputMethodPreference extends CheckBoxPreference {
     private static final String TAG = InputMethodPreference.class.getSimpleName();
     private final SettingsPreferenceFragment mFragment;
     private final InputMethodInfo mImi;
@@ -84,7 +85,7 @@
 
     public InputMethodPreference(SettingsPreferenceFragment fragment, Intent settingsIntent,
             InputMethodManager imm, InputMethodInfo imi) {
-        super(fragment.getActivity(), null, R.style.InputMethodPreferenceStyle);
+        super(fragment.getActivity());
         setLayoutResource(R.layout.preference_inputmethod);
         setWidgetLayoutResource(R.layout.preference_inputmethod_widget);
         mFragment = fragment;
diff --git a/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java b/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
index ccba143..bf63487 100644
--- a/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
+++ b/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
@@ -39,22 +39,20 @@
  * manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be
  * changed.
  */
-public class InputMethodSettingValuesWrapper {
+// TODO: Consolidate this with {@link InputMethodAndSubtypeUtil}.
+class InputMethodSettingValuesWrapper {
     private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName();
-    private static final Locale ENGLISH_LOCALE = new Locale("en");
 
     private static volatile InputMethodSettingValuesWrapper sInstance;
-    private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<InputMethodInfo>();
-    private final HashMap<String, InputMethodInfo> mMethodMap =
-            new HashMap<String, InputMethodInfo>();
+    private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>();
+    private final HashMap<String, InputMethodInfo> mMethodMap = new HashMap<>();
     private final InputMethodSettings mSettings;
     private final InputMethodManager mImm;
-    private final HashSet<InputMethodInfo> mAsciiCapableEnabledImis =
-            new HashSet<InputMethodInfo>();
+    private final HashSet<InputMethodInfo> mAsciiCapableEnabledImis = new HashSet<>();
 
-    public static InputMethodSettingValuesWrapper getInstance(Context context) {
+    static InputMethodSettingValuesWrapper getInstance(Context context) {
         if (sInstance == null) {
-            synchronized(TAG) {
+            synchronized (TAG) {
                 if (sInstance == null) {
                     sInstance = new InputMethodSettingValuesWrapper(context);
                 }
@@ -74,14 +72,13 @@
 
     // Ensure singleton
     private InputMethodSettingValuesWrapper(Context context) {
-        mSettings =
-                new InputMethodSettings(context.getResources(), context.getContentResolver(),
-                        mMethodMap, mMethodList, getDefaultCurrentUserId());
+        mSettings = new InputMethodSettings(context.getResources(), context.getContentResolver(),
+                mMethodMap, mMethodList, getDefaultCurrentUserId());
         mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
         refreshAllInputMethodAndSubtypes();
     }
 
-    public void refreshAllInputMethodAndSubtypes() {
+    void refreshAllInputMethodAndSubtypes() {
         synchronized (mMethodMap) {
             mMethodList.clear();
             mMethodMap.clear();
@@ -113,13 +110,13 @@
         }
     }
 
-    public List<InputMethodInfo> getInputMethodList() {
+    List<InputMethodInfo> getInputMethodList() {
         synchronized (mMethodMap) {
             return mMethodList;
         }
     }
 
-    public CharSequence getCurrentInputMethodName(Context context) {
+    CharSequence getCurrentInputMethodName(Context context) {
         synchronized (mMethodMap) {
             final InputMethodInfo imi = mMethodMap.get(mSettings.getSelectedInputMethod());
             if (imi == null) {
@@ -131,7 +128,7 @@
         }
     }
 
-    public boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) {
+    boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) {
         final boolean isEnabled = isEnabledImi(imi);
         synchronized (mMethodMap) {
             if (mSettings.getEnabledInputMethodListLocked().size() <= 1 && isEnabled) {
@@ -158,7 +155,7 @@
     private int getEnabledValidSystemNonAuxAsciiCapableImeCount(Context context) {
         int count = 0;
         final List<InputMethodInfo> enabledImis;
-        synchronized(mMethodMap) {
+        synchronized (mMethodMap) {
             enabledImis = mSettings.getEnabledInputMethodListLocked();
         }
         for (final InputMethodInfo imi : enabledImis) {
@@ -174,7 +171,7 @@
 
     private boolean isEnabledImi(InputMethodInfo imi) {
         final List<InputMethodInfo> enabledImis;
-        synchronized(mMethodMap) {
+        synchronized (mMethodMap) {
             enabledImis = mSettings.getEnabledInputMethodListLocked();
         }
         for (final InputMethodInfo tempImi : enabledImis) {
@@ -185,8 +182,7 @@
         return false;
     }
 
-    public boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi,
-            Context context) {
+    boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi, Context context) {
         if (imi.isAuxiliaryIme()) {
             return false;
         }
@@ -196,7 +192,7 @@
         if (mAsciiCapableEnabledImis.isEmpty()) {
             Log.w(TAG, "ascii capable subtype enabled imi not found. Fall back to English"
                     + " Keyboard subtype.");
-            return InputMethodUtils.containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage(),
+            return InputMethodUtils.containsSubtypeOf(imi, Locale.ENGLISH.getLanguage(),
                     InputMethodUtils.SUBTYPE_MODE_KEYBOARD);
         }
         return mAsciiCapableEnabledImis.contains(imi);
diff --git a/src/com/android/settings/inputmethod/SingleSpellCheckerPreference.java b/src/com/android/settings/inputmethod/SingleSpellCheckerPreference.java
index bc79b42..2dc90ec 100644
--- a/src/com/android/settings/inputmethod/SingleSpellCheckerPreference.java
+++ b/src/com/android/settings/inputmethod/SingleSpellCheckerPreference.java
@@ -34,10 +34,10 @@
 import android.view.textservice.TextServicesManager;
 import android.widget.ImageView;
 import android.widget.RadioButton;
-import android.widget.TextView;
 import android.widget.Toast;
 
-public class SingleSpellCheckerPreference extends Preference {
+// TODO: Make this non-persistent.
+class SingleSpellCheckerPreference extends Preference {
     private static final String TAG = SingleSpellCheckerPreference.class.getSimpleName();
     private static final boolean DBG = false;
 
@@ -47,8 +47,6 @@
     private final Resources mRes;
     private final TextServicesManager mTsm;
     private AlertDialog mDialog = null;
-    private TextView mTitleText;
-    private TextView mSummaryText;
     private View mPrefAll;
     private RadioButton mRadioButton;
     private View mPrefLeftButton;
@@ -88,8 +86,6 @@
                         onLeftButtonClicked(arg0);
                     }
                 });
-        mTitleText = (TextView)view.findViewById(android.R.id.title);
-        mSummaryText = (TextView)view.findViewById(android.R.id.summary);
         mSubtypeButton = (ImageView)view.findViewById(R.id.pref_right_button2);
         mSubtypeButton.setOnClickListener(
                 new OnClickListener() {
diff --git a/src/com/android/settings/inputmethod/SpellCheckersPreference.java b/src/com/android/settings/inputmethod/SpellCheckersPreference.java
index 9e68604..1482b6c 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersPreference.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersPreference.java
@@ -20,7 +20,8 @@
 import android.util.AttributeSet;
 import android.view.textservice.TextServicesManager;
 
-public class SpellCheckersPreference extends CheckBoxAndSettingsPreference {
+// TODO: Make this non-persistent.
+class SpellCheckersPreference extends CheckBoxAndSettingsPreference {
     private TextServicesManager mTsm;
 
     public SpellCheckersPreference(Context context) {
diff --git a/src/com/android/settings/search/Index.java b/src/com/android/settings/search/Index.java
index 9723fbf..ed06e31 100644
--- a/src/com/android/settings/search/Index.java
+++ b/src/com/android/settings/search/Index.java
@@ -28,6 +28,7 @@
 import android.content.res.XmlResourceParser;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
+import android.database.MergeCursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -123,9 +124,12 @@
             IndexColumns.DATA_KEY_REF             // 13
     };
 
-    private static final String[] MATCH_COLUMNS = {
+    private static final String[] MATCH_COLUMNS_PRIMARY = {
             IndexColumns.DATA_TITLE,
-            IndexColumns.DATA_TITLE_NORMALIZED,
+            IndexColumns.DATA_TITLE_NORMALIZED
+    };
+
+    private static final String[] MATCH_COLUMNS_SECONDARY = {
             IndexColumns.DATA_SUMMARY_ON,
             IndexColumns.DATA_SUMMARY_ON_NORMALIZED,
             IndexColumns.DATA_SUMMARY_OFF,
@@ -214,9 +218,24 @@
     }
 
     public Cursor search(String query) {
-        final String sql = buildSearchSQL(query);
-        Log.d(LOG_TAG, "Search query: " + sql);
-        return getReadableDatabase().rawQuery(sql, null);
+        final SQLiteDatabase database = getReadableDatabase();
+        final Cursor[] cursors = new Cursor[2];
+
+        final String primarySql = buildSearchSQL(query, MATCH_COLUMNS_PRIMARY, true);
+        Log.d(LOG_TAG, "Search primary query: " + primarySql);
+        cursors[0] = database.rawQuery(primarySql, null);
+
+        // We need to use an EXCEPT operator as negate MATCH queries do not work.
+        StringBuilder sql = new StringBuilder(
+                buildSearchSQL(query, MATCH_COLUMNS_SECONDARY, false));
+        sql.append(" EXCEPT ");
+        sql.append(primarySql);
+
+        final String secondarySql = sql.toString();
+        Log.d(LOG_TAG, "Search secondary query: " + secondarySql);
+        cursors[1] = database.rawQuery(secondarySql, null);
+
+        return new MergeCursor(cursors);
     }
 
     public Cursor getSuggestions(String query) {
@@ -422,7 +441,7 @@
         }
     }
 
-    public boolean updateFromRemoteProvider(String packageName, String authority) {
+    private boolean updateFromRemoteProvider(String packageName, String authority) {
         if (!addIndexablesFromRemoteProvider(packageName, authority)) {
             return false;
         }
@@ -615,11 +634,13 @@
         }
     }
 
-    private String buildSearchSQL(String query) {
+    private String buildSearchSQL(String query, String[] colums, boolean withOrderBy) {
         StringBuilder sb = new StringBuilder();
-        sb.append(buildSearchSQLForColumn(query, MATCH_COLUMNS));
-        sb.append(" ORDER BY ");
-        sb.append(IndexColumns.DATA_RANK);
+        sb.append(buildSearchSQLForColumn(query, colums));
+        if (withOrderBy) {
+            sb.append(" ORDER BY ");
+            sb.append(IndexColumns.DATA_RANK);
+        }
         return sb.toString();
     }
 
@@ -1215,7 +1236,7 @@
     }
 
     /**
-     * A basic AsynTask for saving a Search query into the database
+     * A basic AsyncTask for saving a Search query into the database
      */
     private class SaveSearchQueryTask extends AsyncTask<String, Void, Long> {
 
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index 8115cb5..0d53d85 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -42,6 +42,7 @@
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.users.UserSettings;
 import com.android.settings.wifi.AdvancedWifiSettings;
+import com.android.settings.wifi.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.WifiSettings;
 
 import java.util.HashMap;
@@ -85,6 +86,7 @@
         // Wi-Fi
         sRankMap.put(WifiSettings.class.getName(), RANK_WIFI);
         sRankMap.put(AdvancedWifiSettings.class.getName(), RANK_WIFI);
+        sRankMap.put(SavedAccessPointsWifiSettings.class.getName(), RANK_WIFI);
 
         // BT
         sRankMap.put(BluetoothSettings.class.getName(), RANK_BT);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index e78d9b8..287d78f 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -45,6 +45,7 @@
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.users.UserSettings;
 import com.android.settings.wifi.AdvancedWifiSettings;
+import com.android.settings.wifi.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.WifiSettings;
 
 import java.util.Collection;
@@ -72,6 +73,13 @@
                         AdvancedWifiSettings.class.getName(),
                         R.drawable.ic_settings_wireless));
 
+        sResMap.put(SavedAccessPointsWifiSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(SavedAccessPointsWifiSettings.class.getName()),
+                        R.xml.wifi_display_saved_access_points,
+                        SavedAccessPointsWifiSettings.class.getName(),
+                        R.drawable.ic_settings_wireless));
+
         sResMap.put(BluetoothSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(BluetoothSettings.class.getName()),
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index 0fe5f81..811371a 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -32,6 +32,7 @@
 import android.util.LruCache;
 import android.view.View;
 import android.widget.ImageView;
+import android.widget.TextView;
 
 import java.util.Map;
 
@@ -59,7 +60,8 @@
      */
     public static final int HIGHER_FREQ_5GHZ = 5900;
 
-    /** Experimental: we should be able to show the user the list of BSSIDs and bands
+    /**
+     * Experimental: we should be able to show the user the list of BSSIDs and bands
      *  for that SSID.
      *  For now this data is used only with Verbose Logging so as to show the band and number
      *  of BSSIDs on which that network is seen.
@@ -79,7 +81,9 @@
 
     private static int[] wifi_signal_attributes = { R.attr.wifi_signal };
 
-    /** These values are matched in string arrays -- changes must be kept in sync */
+    /**
+     * These values are matched in string arrays -- changes must be kept in sync
+     */
     static final int SECURITY_NONE = 0;
     static final int SECURITY_WEP = 1;
     static final int SECURITY_PSK = 2;
@@ -97,6 +101,7 @@
     int security;
     int networkId = -1;
     boolean wpsAvailable = false;
+    boolean showSummary = true;
 
     PskType pskType = PskType.UNKNOWN;
 
@@ -246,6 +251,11 @@
     protected void onBindView(View view) {
         super.onBindView(view);
         updateIcon(getLevel(), getContext());
+
+        final TextView summaryView = (TextView) view.findViewById(
+                com.android.internal.R.id.summary);
+        summaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE);
+
         notifyChanged();
     }
 
@@ -396,7 +406,18 @@
         return "\"" + string + "\"";
     }
 
-    /** visibility status of the WifiConfiguration
+    /**
+     * Shows or Hides the Summary of an AccessPoint.
+     *
+     * @param showSummary true will show the summary, false will hide the summary
+     */
+    public void setShowSummary(boolean showSummary){
+        this.showSummary = showSummary;
+    }
+
+    /**
+     * Returns the visibility status of the WifiConfiguration.
+     *
      * @return autojoin debugging information
      * TODO: use a string formatter
      * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"]
@@ -430,11 +451,15 @@
             int rssi24 = WifiConfiguration.INVALID_RSSI;
             int num5 = 0;
             int num24 = 0;
+            int numBlackListed = 0;
             Map<String, ScanResult> list = mScanResultCache.snapshot();
             for (ScanResult result : list.values()) {
                 if (result.seen == 0)
                     continue;
 
+                if (result.status != ScanResult.ENABLED)
+                    numBlackListed++;
+
                 if (result.frequency > LOWER_FREQ_5GHZ
                         && result.frequency < HIGHER_FREQ_5GHZ) {
                     //strictly speaking: [4915, 5825]
@@ -474,6 +499,8 @@
                 visibility.append(",");
                 visibility.append(Integer.toString(num5));
             }
+            if (numBlackListed > 0)
+                visibility.append("!");
             visibility.append("]");
         } else {
             if (mRssi != Integer.MAX_VALUE) {
@@ -489,7 +516,9 @@
         return visibility.toString();
     }
 
-    /** Updates the title and summary; may indirectly call notifyChanged()  */
+    /**
+     * Updates the title and summary; may indirectly call notifyChanged().
+     */
     private void refresh() {
         setTitle(ssid);
 
diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java
index aa4c185..b7316d0 100644
--- a/src/com/android/settings/wifi/AdvancedWifiSettings.java
+++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java
@@ -54,6 +54,7 @@
     private static final String KEY_INSTALL_CREDENTIALS = "install_credentials";
     private static final String KEY_WIFI_DIRECT = "wifi_direct";
     private static final String KEY_WPS_PUSH = "wps_push_button";
+    private static final String KEY_WPS_PIN = "wps_pin_entry";
     private static final String KEY_SUSPEND_OPTIMIZATIONS = "suspend_optimizations";
 
     private WifiManager mWifiManager;
@@ -147,6 +148,16 @@
                 }
         });
 
+        // WpsDialog: Create the dialog like WifiSettings does.
+        Preference wpsPinPref = findPreference(KEY_WPS_PIN);
+        wpsPinPref.setOnPreferenceClickListener(new OnPreferenceClickListener(){
+                public boolean onPreferenceClick(Preference arg0) {
+                    WpsDialog wpsDialog = new WpsDialog(getActivity(), WpsInfo.DISPLAY);
+                    wpsDialog.show();
+                    return true;
+                }
+        });
+
         CheckBoxPreference suspendOptimizations =
             (CheckBoxPreference) findPreference(KEY_SUSPEND_OPTIMIZATIONS);
         suspendOptimizations.setChecked(Global.getInt(getContentResolver(),
@@ -275,11 +286,13 @@
         String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
         wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
                 : getActivity().getString(R.string.status_unavailable));
+        wifiMacAddressPref.setSelectable(false);
 
         Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS);
         String ipAddress = Utils.getWifiIpAddresses(getActivity());
         wifiIpAddressPref.setSummary(ipAddress == null ?
                 getActivity().getString(R.string.status_unavailable) : ipAddress);
+        wifiIpAddressPref.setSelectable(false);
     }
 
 }
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
new file mode 100644
index 0000000..6e82c66
--- /dev/null
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2014 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.wifi;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceScreen;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * UI to manage saved networks/access points.
+ */
+public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
+        implements DialogInterface.OnClickListener, Indexable {
+    private static final String TAG = "SavedAccessPointsWifiSettings";
+
+    private WifiDialog mDialog;
+    private WifiManager mWifiManager;
+    private AccessPoint mDlgAccessPoint;
+    private Bundle mAccessPointSavedState;
+    private AccessPoint mSelectedAccessPoint;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.wifi_display_saved_access_points);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        initPreferences();
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+    }
+
+    private void initPreferences() {
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        final Context context = getActivity();
+
+        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        final List<AccessPoint> accessPoints = constructSavedAccessPoints(context, mWifiManager);
+
+        preferenceScreen.removeAll();
+
+        final int accessPointsSize = accessPoints.size();
+        for (int i = 0; i < accessPointsSize; ++i){
+            preferenceScreen.addPreference(accessPoints.get(i));
+        }
+
+        if(getPreferenceScreen().getPreferenceCount() < 1) {
+            Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
+        }
+    }
+
+    private static List<AccessPoint> constructSavedAccessPoints(Context context,
+            WifiManager wifiManager){
+        List<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
+        Map<String, List<ScanResult>> resultsMap = new HashMap<String, List<ScanResult>>();
+
+        final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
+        final List<ScanResult> scanResults = wifiManager.getScanResults();
+
+        if (configs != null) {
+            //Construct a Map for quick searching of a wifi network via ssid.
+            final int scanResultsSize = scanResults.size();
+            for (int i = 0; i < scanResultsSize; ++i){
+                final ScanResult result = scanResults.get(i);
+                List<ScanResult> res = resultsMap.get(result.SSID);
+
+                if(res == null){
+                    res = new ArrayList<ScanResult>();
+                    resultsMap.put(result.SSID, res);
+                }
+
+                res.add(result);
+            }
+
+            final int configsSize = configs.size();
+            for (int i = 0; i < configsSize; ++i){
+                AccessPoint accessPoint = new AccessPoint(context, configs.get(i));
+                final List<ScanResult> results = resultsMap.get(accessPoint.ssid);
+
+                accessPoint.setShowSummary(false);
+                if(results != null){
+                    final int resultsSize = results.size();
+                    for (int j = 0; j < resultsSize; ++j){
+                        accessPoint.update(results.get(j));
+                    }
+                }
+
+                accessPoints.add(accessPoint);
+            }
+        }
+
+        return accessPoints;
+    }
+
+    private void showDialog(AccessPoint accessPoint, boolean edit) {
+        if (mDialog != null) {
+            removeDialog(WifiSettings.WIFI_DIALOG_ID);
+            mDialog = null;
+        }
+
+        // Save the access point and edit mode
+        mDlgAccessPoint = accessPoint;
+
+        showDialog(WifiSettings.WIFI_DIALOG_ID);
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        switch (dialogId) {
+            case WifiSettings.WIFI_DIALOG_ID:
+                mSelectedAccessPoint = mDlgAccessPoint;
+                mDialog = new WifiDialog(getActivity(), this, mDlgAccessPoint, false);
+                return mDialog;
+
+        }
+        return super.onCreateDialog(dialogId);
+    }
+
+    @Override
+    public void onClick(DialogInterface dialogInterface, int button) {
+        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
+            mWifiManager.forget(mSelectedAccessPoint.networkId, null);
+            getPreferenceScreen().removePreference(mSelectedAccessPoint);
+            mSelectedAccessPoint = null;
+        }
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+        if (preference instanceof AccessPoint) {
+            showDialog((AccessPoint) preference, false);
+            return true;
+        } else{
+            return super.onPreferenceTreeClick(screen, preference);
+        }
+    }
+
+    /**
+     * For search.
+     */
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+        new BaseSearchIndexProvider() {
+            @Override
+            public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
+                final Resources res = context.getResources();
+                final String title = res.getString(R.string.wifi_saved_access_points_titlebar);
+
+                // Add fragment title
+                SearchIndexableRaw data = new SearchIndexableRaw(context);
+                data.title = title;
+                data.screenTitle = title;
+                data.enabled = enabled;
+                result.add(data);
+
+                // Add available Wi-Fi access points
+                WifiManager wifiManager =
+                        (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+                final List<AccessPoint> accessPoints =
+                        constructSavedAccessPoints(context, wifiManager);
+
+                final int accessPointsSize = accessPoints.size();
+                for (int i = 0; i < accessPointsSize; ++i){
+                    data = new SearchIndexableRaw(context);
+                    data.title = accessPoints.get(i).getTitle().toString();
+                    data.screenTitle = title;
+                    data.enabled = enabled;
+                    result.add(data);
+                }
+
+                return result;
+            }
+        };
+}
diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java
index eec9963..b306466 100644
--- a/src/com/android/settings/wifi/WifiPickerActivity.java
+++ b/src/com/android/settings/wifi/WifiPickerActivity.java
@@ -39,6 +39,7 @@
     protected boolean isValidFragment(String fragmentName) {
         if (WifiSettings.class.getName().equals(fragmentName)
                 || WifiP2pSettings.class.getName().equals(fragmentName)
+                || SavedAccessPointsWifiSettings.class.getName().equals(fragmentName)
                 || AdvancedWifiSettings.class.getName().equals(fragmentName)) return true;
         return false;
     }
@@ -46,4 +47,4 @@
     /* package */ Class<? extends PreferenceFragment> getWifiSettingsClass() {
         return WifiSettings.class;
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index a7f291d..0cb25c3 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -84,7 +84,7 @@
     private static final String TAG = "WifiSettings";
     /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
     private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
-    private static final int MENU_ID_P2P = Menu.FIRST + 2;
+    private static final int MENU_ID_SAVED_NETWORK = Menu.FIRST + 2;
     /* package */ static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
     private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
     private static final int MENU_ID_SCAN = Menu.FIRST + 5;
@@ -93,7 +93,7 @@
     private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
     private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
 
-    private static final int WIFI_DIALOG_ID = 1;
+    public static final int WIFI_DIALOG_ID = 1;
     /* package */ static final int WPS_PBC_DIALOG_ID = 2;
     private static final int WPS_PIN_DIALOG_ID = 3;
     private static final int WRITE_NFC_DIALOG_ID = 6;
@@ -105,6 +105,8 @@
     private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
     private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
 
+    private static boolean savedNetworksExist;
+
     private final IntentFilter mFilter;
     private final BroadcastReceiver mReceiver;
     private final Scanner mScanner;
@@ -320,15 +322,16 @@
                 .setIcon(ta.getDrawable(0))
                 .setEnabled(wifiIsEnabled)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
-                //.setIcon(R.drawable.ic_menu_scan_network)
-                .setEnabled(wifiIsEnabled)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
-                .setEnabled(wifiIsEnabled)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        if (savedNetworksExist){
+            menu.add(Menu.NONE, MENU_ID_SAVED_NETWORK, 0, R.string.wifi_saved_access_points_label)
+                    .setIcon(ta.getDrawable(0))
+                    .setEnabled(wifiIsEnabled)
+                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        }
+        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.menu_stats_refresh)
+               .setEnabled(wifiIsEnabled)
+               .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
-                //.setIcon(android.R.drawable.ic_menu_manage)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         ta.recycle();
     }
@@ -357,6 +360,7 @@
             case MENU_ID_WPS_PBC:
                 showDialog(WPS_PBC_DIALOG_ID);
                 return true;
+                /*
             case MENU_ID_P2P:
                 if (getActivity() instanceof SettingsActivity) {
                     ((SettingsActivity) getActivity()).startPreferencePanel(
@@ -369,6 +373,7 @@
                             R.string.wifi_p2p_settings_title, -1, null);
                 }
                 return true;
+                */
             case MENU_ID_WPS_PIN:
                 showDialog(WPS_PIN_DIALOG_ID);
                 return true;
@@ -382,16 +387,26 @@
                     onAddNetworkPressed();
                 }
                 return true;
+            case MENU_ID_SAVED_NETWORK:
+                if (getActivity() instanceof SettingsActivity) {
+                    ((SettingsActivity) getActivity()).startPreferencePanel(
+                            SavedAccessPointsWifiSettings.class.getCanonicalName(), null,
+                            R.string.wifi_saved_access_points_titlebar, null, this, 0);
+                } else {
+                    startFragment(this, SavedAccessPointsWifiSettings.class.getCanonicalName(),
+                            R.string.wifi_saved_access_points_titlebar,
+                            -1 /* Do not request a result */, null);
+                }
+                return true;
             case MENU_ID_ADVANCED:
                 if (getActivity() instanceof SettingsActivity) {
                     ((SettingsActivity) getActivity()).startPreferencePanel(
-                            AdvancedWifiSettings.class.getCanonicalName(),
-                            null,
-                            R.string.wifi_advanced_titlebar, null,
-                            this, 0);
+                            AdvancedWifiSettings.class.getCanonicalName(), null,
+                            R.string.wifi_advanced_titlebar, null, this, 0);
                 } else {
                     startFragment(this, AdvancedWifiSettings.class.getCanonicalName(),
-                            R.string.wifi_advanced_titlebar, -1, null);
+                            R.string.wifi_advanced_titlebar, -1 /* Do not request a results */,
+                            null);
                 }
                 return true;
         }
@@ -468,6 +483,10 @@
             if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
                     mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
                 mSelectedAccessPoint.generateOpenNetworkConfig();
+                if (!savedNetworksExist){
+                    savedNetworksExist = true;
+                    getActivity().invalidateOptionsMenu();
+                }
                 mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
             } else {
                 showDialog(mSelectedAccessPoint, false);
@@ -606,6 +625,7 @@
 
         final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
         if (configs != null) {
+            savedNetworksExist = (configs.size() > 0);
             for (WifiConfiguration config : configs) {
                 AccessPoint accessPoint = new AccessPoint(context, config);
                 if (lastInfo != null && lastState != null) {
