diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d96e505..ed00054 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -777,7 +777,7 @@
                 <category android:name="com.android.settings.suggested.category.SETTINGS_ONLY" />
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.notification.ZenModeAutomationSettings" />
+                android:value="com.android.settings.notification.ZenModeSettings" />
             <meta-data android:name="com.android.settings.dismiss"
                 android:value="30" />
             <meta-data android:name="com.android.settings.title"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 21a23ae..6578374 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4470,8 +4470,10 @@
     <!-- Title for the cellular network in power use UI(i.e. Mobile network scanning: 30% of battery usage) [CHAR_LIMIT=40] -->
     <string name="device_cellular_network">Mobile network scanning</string>
 
-    <!-- Label for list of apps using battery in power use UI [CHAR_LIMIT=60] -->
-    <string name="power_usage_list_summary">App usage since full charge</string>
+    <!-- Label for time since last full charge in power use UI, i.e. "7 h 20 min ago" [CHAR_LIMIT=60] -->
+    <string name="power_last_full_charge_summary"><xliff:g id="time">%1$s</xliff:g> ago</string>
+    <!-- Label for list of apps using battery in power use UI [CHAR_LIMIT=120] -->
+    <string name="power_usage_list_summary">App usage since full charge (<xliff:g id="time">%1$s</xliff:g> ago)</string>
     <!-- Description for the screen usage item [CHAR_LIMIT=120] -->
     <string name="screen_usage_summary">Amount of time screen has been on since full charge</string>
     <!-- Label for list of different types using battery in power use UI [CHAR_LIMIT=60] -->
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index dbbf0c3..09bcf86 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -34,40 +34,52 @@
 
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="signal_strength"
-                android:title="@string/wifi_signal" />
+                android:title="@string/wifi_signal"
+                android:selectable="false"/>
 
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="frequency"
                 android:icon="@drawable/ic_frequency_antenna"
-                android:title="@string/wifi_frequency" />
+                android:title="@string/wifi_frequency"
+                android:selectable="false"/>
 
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="security"
                 android:icon="@drawable/ic_security_lock_24dp"
-                android:title="@string/wifi_security" />
+                android:title="@string/wifi_security"
+                android:selectable="false"/>
     </PreferenceCategory>
 
-    <!-- IP Details -->
+    <!-- Network Details -->
     <PreferenceCategory
             android:key="ip_details_category"
-            android:title="@string/wifi_ip_address">
+            android:title="@string/wifi_setup_detail">
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="ip_address"
-                android:title="@string/wifi_ip_address" />
+                android:title="@string/wifi_ip_address"
+                android:selectable="false"/>
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="router"
-                android:title="@string/wifi_gateway" />
+                android:title="@string/wifi_gateway"
+                android:selectable="false"/>
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="subnet_mask"
-                android:title="@string/wifi_details_subnet_mask" />
+                android:title="@string/wifi_details_subnet_mask"
+                android:selectable="false"/>
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="dns"
-                android:title="@string/wifi_details_dns" />
+                android:title="@string/wifi_details_dns"
+                android:selectable="false"/>
+        <com.android.settings.wifi.WifiDetailPreference
+                android:key="link_speed"
+                android:title="@string/wifi_speed"
+                android:selectable="false"/>
     </PreferenceCategory>
 
     <!-- IPv6 Details -->
     <PreferenceCategory
             android:key="ipv6_details_category"
-            android:title="@string/wifi_details_ipv6_address_header" />
+            android:title="@string/wifi_details_ipv6_address_header"
+            android:selectable="false"/>
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 37022f0..b7d2a73 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -362,7 +362,8 @@
         // smarter in the future.
         final Activity activity = getActivity();
         FeatureFactory.getFactory(activity).getSearchFeatureProvider().getIndexingManager(activity)
-                .updateFromClassNameResource(SecuritySettings.class.getName(), true, true);
+                .updateFromClassNameResource(SecuritySettings.class.getName(),
+                        true /* includeInSearchResults */);
 
         PreferenceGroup securityStatusPreferenceGroup =
                 (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 11190d5..09380e5 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -30,7 +30,6 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
@@ -86,7 +85,6 @@
     // Constants for state save/restore
     private static final String SAVE_KEY_CATEGORIES = ":settings:categories";
     private static final String SAVE_KEY_SHOW_HOME_AS_UP = ":settings:show_home_as_up";
-    private static final String SAVE_KEY_SHOW_SEARCH = ":settings:show_search";
 
     /**
      * When starting this activity, the invoking Intent can contain this extra
@@ -188,19 +186,6 @@
         }
     };
 
-    private final BroadcastReceiver mUserAddRemoveReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (mSearchFeatureProvider != null && !mSearchFeatureProvider.isEnabled(context)) {
-                String action = intent.getAction();
-                if (action.equals(Intent.ACTION_USER_ADDED)
-                        || action.equals(Intent.ACTION_USER_REMOVED)) {
-                    mSearchFeatureProvider.updateIndex(getApplicationContext());
-                }
-            }
-        }
-    };
-
     private DynamicIndexableContentMonitor mDynamicIndexableContentMonitor;
 
     private ActionBar mActionBar;
@@ -242,14 +227,6 @@
     }
 
     @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        if (!mSearchFeatureProvider.isEnabled(this)) {
-            mSearchFeatureProvider.updateIndex(getApplicationContext());
-        }
-    }
-
-    @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (!mDisplaySearch) {
             return false;
@@ -346,15 +323,6 @@
 
         getFragmentManager().addOnBackStackChangedListener(this);
 
-        if (mIsShowingDashboard && !mSearchFeatureProvider.isEnabled(this)) {
-            // Run the Index update only if we have some space
-            if (!Utils.isLowStorage(this)) {
-                mSearchFeatureProvider.updateIndex(getApplicationContext());
-            } else {
-                Log.w(LOG_TAG, "Cannot update the Indexer as we are running low on storage space!");
-            }
-        }
-
         if (savedState != null) {
             // We are restarting from a previous saved state; used that to initialize, instead
             // of starting fresh.
@@ -568,10 +536,6 @@
                 mDevelopmentPreferencesListener);
 
         registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-        if (!mSearchFeatureProvider.isEnabled(this)) {
-            registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_ADDED));
-            registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED));
-        }
         if (mDynamicIndexableContentMonitor == null) {
             mDynamicIndexableContentMonitor = new DynamicIndexableContentMonitor();
         }
@@ -587,9 +551,6 @@
                 mDevelopmentPreferencesListener);
         mDevelopmentPreferencesListener = null;
         unregisterReceiver(mBatteryInfoReceiver);
-        if (!mSearchFeatureProvider.isEnabled(this)) {
-            unregisterReceiver(mUserAddRemoveReceiver);
-        }
         if (mDynamicIndexableContentMonitor != null) {
             mDynamicIndexableContentMonitor.unregister(this, LOADER_ID_INDEXABLE_CONTENT_MONITOR);
         }
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 85e09d1..6d22620 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -318,7 +318,7 @@
         }
         mProfiles.put(userInfo.id, profileData);
         new SearchFeatureProviderImpl().getIndexingManager(mContext).updateFromClassNameResource(
-                UserAndAccountDashboardFragment.class.getName(), true, true);
+                UserAndAccountDashboardFragment.class.getName(), true /* includeInSearchResults */);
     }
 
     private DimmableIconPreference newAddAccountPreference(Context context) {
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index f174e10..bee1351 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -221,6 +221,7 @@
         mDevHitToast.show();
         // This is good time to index the Developer Options
         FeatureFactory.getFactory(mContext).getSearchFeatureProvider().getIndexingManager(mContext)
-                .updateFromClassNameResource(DevelopmentSettings.class.getName(), true, true);
+                .updateFromClassNameResource(DevelopmentSettings.class.getName(),
+                        true /* includeInSearchResults */);
     }
 }
diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
index b367202..bb9f5ad 100644
--- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java
+++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
@@ -176,7 +176,7 @@
     public void onLoadFinished(Loader<List<PrintServiceInfo>> loader,
             List<PrintServiceInfo> services) {
         mIndexManager.updateFromClassNameResource(PrintSettingsFragment.class.getName(),
-                false /* rebuild */, true /* includeInSearchResult */);
+                true /* includeInSearchResults */);
     }
 
     @Override
@@ -213,30 +213,30 @@
             if (mIndexManager != null) return;
             mIndexManager = indexManager;
             mInputManager = (InputManager) context.getSystemService(Context.INPUT_SERVICE);
-            buildIndex(true /* rebuild */);
+            buildIndex();
 
             // Watch for input device changes.
             mInputManager.registerInputDeviceListener(this /* listener */, null /* handler */);
         }
 
-        private void buildIndex(boolean rebuild) {
+        private void buildIndex() {
             mIndexManager.updateFromClassNameResource(PhysicalKeyboardFragment.class.getName(),
-                    rebuild, true /* includeInSearchResult */);
+                    true /* includeInSearchResults */);
         }
 
         @Override
         public void onInputDeviceAdded(int deviceId) {
-            buildIndex(false /* rebuild */);
+            buildIndex();
         }
 
         @Override
         public void onInputDeviceRemoved(int deviceId) {
-            buildIndex(true /* rebuild */);
+            buildIndex();
         }
 
         @Override
         public void onInputDeviceChanged(int deviceId) {
-            buildIndex(true /* rebuild */);
+            buildIndex();
         }
     }
 
@@ -344,7 +344,7 @@
             mIndexManager = index;
             mPackageManager = context.getPackageManager();
             mAccessibilityServices.clear();
-            buildIndex(true /* rebuild */);
+            buildIndex();
 
             // Cache accessibility service packages to know when they go away.
             AccessibilityManager accessibilityManager = (AccessibilityManager) context
@@ -358,9 +358,9 @@
             }
         }
 
-        private void buildIndex(boolean rebuild) {
+        private void buildIndex() {
             mIndexManager.updateFromClassNameResource(AccessibilitySettings.class.getName(),
-                    rebuild, true /* includeInSearchResult */);
+                    true /* includeInSearchResults */);
         }
 
         synchronized void onPackageAvailable(String packageName) {
@@ -372,13 +372,13 @@
                     .queryIntentServices(intent, 0 /* flags */);
             if (services == null || services.isEmpty()) return;
             mAccessibilityServices.add(packageName);
-            buildIndex(false /* rebuild */);
+            buildIndex();
         }
 
         synchronized void onPackageUnavailable(String packageName) {
             if (mIndexManager == null) return;
             if (!mAccessibilityServices.remove(packageName)) return;
-            buildIndex(true /* rebuild */);
+            buildIndex();
         }
     }
 
@@ -428,10 +428,10 @@
             mContentResolver = context.getContentResolver();
             mInputMethodServices.clear();
             // Build index of {@link UserDictionary}.
-            buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
+            buildIndex(LanguageAndInputSettings.class);
             // Build index of IMEs.
-            buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
-            buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
+            buildIndex(VirtualKeyboardFragment.class);
+            buildIndex(AvailableVirtualKeyboardFragment.class);
 
             // Cache IME service packages to know when they go away.
             final InputMethodManager inputMethodManager = (InputMethodManager) context
@@ -452,9 +452,9 @@
                     false /* notifyForDescendants */, this /* observer */);
         }
 
-        private void buildIndex(Class<?> indexClass, boolean rebuild) {
-            mIndexManager.updateFromClassNameResource(indexClass.getName(), rebuild,
-                    true /* includeInSearchResult */);
+        private void buildIndex(Class<?> indexClass) {
+            mIndexManager.updateFromClassNameResource(indexClass.getName(),
+                    true /* includeInSearchResults */);
         }
 
         synchronized void onPackageAvailable(String packageName) {
@@ -466,24 +466,24 @@
                     .queryIntentServices(intent, 0 /* flags */);
             if (services == null || services.isEmpty()) return;
             mInputMethodServices.add(packageName);
-            buildIndex(VirtualKeyboardFragment.class, false /* rebuild */);
-            buildIndex(AvailableVirtualKeyboardFragment.class, false /* rebuild */);
+            buildIndex(VirtualKeyboardFragment.class);
+            buildIndex(AvailableVirtualKeyboardFragment.class);
         }
 
         synchronized void onPackageUnavailable(String packageName) {
             if (mIndexManager == null) return;
             if (!mInputMethodServices.remove(packageName)) return;
-            buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
-            buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
+            buildIndex(VirtualKeyboardFragment.class);
+            buildIndex(AvailableVirtualKeyboardFragment.class);
         }
 
         @Override
         public void onChange(boolean selfChange, Uri uri) {
             if (ENABLED_INPUT_METHODS_CONTENT_URI.equals(uri)) {
-                buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
-                buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
+                buildIndex(VirtualKeyboardFragment.class);
+                buildIndex(AvailableVirtualKeyboardFragment.class);
             } else if (UserDictionary.Words.CONTENT_URI.equals(uri)) {
-                buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
+                buildIndex(LanguageAndInputSettings.class);
             }
         }
     }
diff --git a/src/com/android/settings/search2/DatabaseIndexingManager.java b/src/com/android/settings/search2/DatabaseIndexingManager.java
index 0d61a66..1e664ff 100644
--- a/src/com/android/settings/search2/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search2/DatabaseIndexingManager.java
@@ -187,6 +187,8 @@
 
         final String localeStr = Locale.getDefault().toString();
         updateDatabase(isLocaleIndexed, localeStr);
+
+        IndexDatabaseHelper.setLocaleIndexed(mContext, localeStr);
     }
 
     @VisibleForTesting
@@ -242,8 +244,6 @@
         } finally {
             database.endTransaction();
         }
-        // TODO Refactor: move the locale out of the helper class
-        IndexDatabaseHelper.setLocaleIndexed(mContext, localeStr);
 
         mIsAvailable.set(true);
     }
@@ -432,12 +432,10 @@
      * Update the Index for a specific class name resources
      *
      * @param className              the class name (typically a fragment name).
-     * @param rebuild                true means that you want to delete the data from the Index first.
      * @param includeInSearchResults true means that you want the bit "enabled" set so that the
      *                               data will be seen included into the search results
      */
-    public void updateFromClassNameResource(String className, final boolean rebuild,
-            boolean includeInSearchResults) {
+    public void updateFromClassNameResource(String className, boolean includeInSearchResults) {
         if (className == null) {
             throw new IllegalArgumentException("class name cannot be null!");
         }
@@ -452,26 +450,12 @@
             @Override
             public void run() {
                 addIndexableData(res);
-                performIndexing();
+                updateDatabase(false, Locale.getDefault().toString());
                 res.enabled = false;
             }
         });
     }
 
-    public void updateFromSearchIndexableData(final SearchIndexableData data) {
-        AsyncTask.execute(new Runnable() {
-            @Override
-            public void run() {
-                addIndexableData(data);
-                performIndexing();
-            }
-        });
-    }
-
-    private SQLiteDatabase getReadableDatabase() {
-        return IndexDatabaseHelper.getInstance(mContext).getReadableDatabase();
-    }
-
     private SQLiteDatabase getWritableDatabase() {
         try {
             return IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java
index 7559512..9981b2f 100644
--- a/src/com/android/settings/vpn2/AppManagementFragment.java
+++ b/src/com/android/settings/vpn2/AppManagementFragment.java
@@ -197,9 +197,7 @@
 
     @Override
     public void onConfirmLockdown(Bundle options, boolean isEnabled, boolean isLockdown) {
-        if (setAlwaysOnVpnByUI(isEnabled, isLockdown)) {
-            updateUI();
-        }
+        setAlwaysOnVpnByUI(isEnabled, isLockdown);
     }
 
     private boolean setAlwaysOnVpnByUI(boolean isEnabled, boolean isLockdown) {
@@ -214,6 +212,8 @@
         final boolean success = setAlwaysOnVpn(isEnabled, isLockdown);
         if (isEnabled && (!success || !isVpnAlwaysOn())) {
             CannotConnectFragment.show(this, mVpnLabel);
+        } else {
+            updateUI();
         }
         return success;
     }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index ccd1700..20f723c 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -650,7 +650,6 @@
 
             case WifiManager.WIFI_STATE_DISABLING:
                 addMessagePreference(R.string.wifi_stopping);
-                setProgressBarVisible(true);
                 break;
 
             case WifiManager.WIFI_STATE_DISABLED:
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index d0e21e926..85c0929 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -59,6 +59,8 @@
     @VisibleForTesting
     static final String KEY_SIGNAL_STRENGTH_PREF = "signal_strength";
     @VisibleForTesting
+    static final String KEY_LINK_SPEED = "link_speed";
+    @VisibleForTesting
     static final String KEY_FREQUENCY_PREF = "frequency";
     @VisibleForTesting
     static final String KEY_SECURITY_PREF = "security";
@@ -85,6 +87,7 @@
     // Preferences - in order of appearance
     private Preference mConnectionDetailPref;
     private WifiDetailPreference mSignalStrengthPref;
+    private WifiDetailPreference mLinkSpeedPref;
     private WifiDetailPreference mFrequencyPref;
     private WifiDetailPreference mSecurityPref;
     private WifiDetailPreference mIpAddressPref;
@@ -128,6 +131,7 @@
 
         mSignalStrengthPref =
                 (WifiDetailPreference) screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
+        mLinkSpeedPref = (WifiDetailPreference) screen.findPreference(KEY_LINK_SPEED);
         mFrequencyPref = (WifiDetailPreference) screen.findPreference(KEY_FREQUENCY_PREF);
         mSecurityPref = (WifiDetailPreference) screen.findPreference(KEY_SECURITY_PREF);
 
@@ -178,6 +182,10 @@
         int summarySignalLevel = mAccessPoint.getLevel();
         mSignalStrengthPref.setDetailText(mSignalStr[summarySignalLevel]);
 
+        // Link Speed Pref
+        mLinkSpeedPref.setDetailText(mContext.getString(
+                R.string.link_speed, mWifiInfo.getLinkSpeed()));
+
         // Frequency Pref
         final int frequency = mWifiInfo.getFrequency();
         String band = null;
diff --git a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
index 5068349..79c0d63 100644
--- a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
+++ b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
@@ -63,6 +63,7 @@
 import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.search2.DatabaseIndexingManager;
+import com.android.settings.testutils.DatabaseTestUtils;
 import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager;
 import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver;
 import com.android.settings.testutils.shadow.ShadowInputManager;
@@ -162,6 +163,8 @@
 
         DynamicIndexableContentMonitor.resetForTesting();
         mRobolectricPackageManager.reset();
+
+        DatabaseTestUtils.clearDb();
     }
 
     @Test
@@ -173,7 +176,7 @@
                 anyInt(), any(Bundle.class), any(LoaderManager.LoaderCallbacks.class));
         // No indexing happens.
         verify(mIndexManager, never()).updateFromClassNameResource(
-                anyString(), anyBoolean(), anyBoolean());
+                anyString(), anyBoolean());
 
         mMonitor.unregister(mActivity, LOADER_ID);
 
@@ -226,7 +229,7 @@
         mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
 
         // Rebuild indexing should happen.
-        verifyRebuildIndexing(PhysicalKeyboardFragment.class);
+        verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
         // Input monitor should be registered to InputManager.
         final InputManager.InputDeviceListener listener = extactInputDeviceListener();
         assertThat(listener).isNotNull();
@@ -258,7 +261,7 @@
 
         listener.onInputDeviceRemoved(2 /* deviceId */);
 
-        verifyRebuildIndexing(PhysicalKeyboardFragment.class);
+        verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
 
         /*
          * A device is changed.
@@ -267,14 +270,14 @@
 
         listener.onInputDeviceChanged(3 /* deviceId */);
 
-        verifyRebuildIndexing(PhysicalKeyboardFragment.class);
+        verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
     }
 
     @Test
     public void testAccessibilityServicesMonitor() throws Exception {
         mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
 
-        verifyRebuildIndexing(AccessibilitySettings.class);
+        verifyIncrementalIndexing(AccessibilitySettings.class);
 
         /*
          * When an accessibility service package is installed, incremental indexing happen.
@@ -301,7 +304,7 @@
 
         disableInstalledPackage(A11Y_PACKAGE_1);
 
-        verifyRebuildIndexing(AccessibilitySettings.class);
+        verifyIncrementalIndexing(AccessibilitySettings.class);
 
         /*
          * When an accessibility service is enabled, incremental indexing happens.
@@ -319,7 +322,7 @@
 
         uninstallAccessibilityService(A11Y_PACKAGE_1);
 
-        verifyRebuildIndexing(AccessibilitySettings.class);
+        verifyIncrementalIndexing(AccessibilitySettings.class);
 
         /*
          * When an input method service package is installed, nothing happens.
@@ -335,8 +338,8 @@
     public void testInputMethodServicesMonitor() throws Exception {
         mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
 
-        verifyRebuildIndexing(VirtualKeyboardFragment.class);
-        verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(VirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
 
         final Uri enabledInputMethodsContentUri = Settings.Secure.getUriFor(
                 Settings.Secure.ENABLED_INPUT_METHODS);
@@ -371,8 +374,8 @@
 
         disableInstalledPackage(IME_PACKAGE_1);
 
-        verifyRebuildIndexing(VirtualKeyboardFragment.class);
-        verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(VirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
 
         /*
          * When an input method service is enabled, incremental indexing happens.
@@ -391,8 +394,8 @@
 
         uninstallInputMethodService(IME_PACKAGE_1);
 
-        verifyRebuildIndexing(VirtualKeyboardFragment.class);
-        verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(VirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
 
         /*
          * When an accessibility service package is installed, nothing happens.
@@ -411,8 +414,8 @@
 
         observer.onChange(false /* selfChange */, enabledInputMethodsContentUri);
 
-        verifyRebuildIndexing(VirtualKeyboardFragment.class);
-        verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(VirtualKeyboardFragment.class);
+        verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
     }
 
     @Test
@@ -423,7 +426,7 @@
         final ContentObserver observer = extractContentObserver(UserDictionary.Words.CONTENT_URI);
         assertThat(observer).isNotNull();
 
-        verifyRebuildIndexing(LanguageAndInputSettings.class);
+        verifyIncrementalIndexing(LanguageAndInputSettings.class);
 
         /*
          * When user dictionary content is changed, rebuild indexing happens.
@@ -432,7 +435,7 @@
 
         observer.onChange(false /* selfChange */, UserDictionary.Words.CONTENT_URI);
 
-        verifyRebuildIndexing(LanguageAndInputSettings.class);
+        verifyIncrementalIndexing(LanguageAndInputSettings.class);
     }
 
     /*
@@ -441,21 +444,14 @@
 
     private void verifyNoIndexing(Class<?> indexingClass) {
         verify(mIndexManager, never()).updateFromClassNameResource(eq(indexingClass.getName()),
-                anyBoolean(), anyBoolean());
-    }
-
-    private void verifyRebuildIndexing(Class<?> indexingClass) {
-        verify(mIndexManager, times(1)).updateFromClassNameResource(indexingClass.getName(),
-                true /* rebuild */, true /* includeInSearchResults */);
-        verify(mIndexManager, never()).updateFromClassNameResource(indexingClass.getName(),
-                false /* rebuild */, true /* includeInSearchResults */);
+                anyBoolean());
     }
 
     private void verifyIncrementalIndexing(Class<?> indexingClass) {
         verify(mIndexManager, times(1)).updateFromClassNameResource(indexingClass.getName(),
-                false /* rebuild */, true /* includeInSearchResults */);
+                true /* includeInSearchResults */);
         verify(mIndexManager, never()).updateFromClassNameResource(indexingClass.getName(),
-                true /* rebuild */, true /* includeInSearchResults */);
+                false /* includeInSearchResults */);
     }
 
     /*
diff --git a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
index 29cbe64..327b910 100644
--- a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
+++ b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
@@ -741,9 +741,16 @@
     }
 
     @Test
-    public void testLocaleUpdated_afterIndexing_localeAdded() {
+    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
         mManager.updateDatabase(false, localeStr);
         assertThat(IndexDatabaseHelper.getInstance(mContext)
+                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
+    }
+
+    @Test
+    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
+        mManager.performIndexing();
+        assertThat(IndexDatabaseHelper.getInstance(mContext)
                 .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 88a63b3..0a12ebf 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -54,6 +54,7 @@
 
     private static final int LEVEL = 1;
     private static final int RSSI = -55;
+    private static final int LINK_SPEED = 123;
     private static final String SECURITY = "None";
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -67,6 +68,7 @@
 
     @Mock private Preference mockConnectionDetailPref;
     @Mock private WifiDetailPreference mockSignalStrengthPref;
+    @Mock private WifiDetailPreference mockLinkSpeedPref;
     @Mock private WifiDetailPreference mockFrequencyPref;
     @Mock private WifiDetailPreference mockSecurityPref;
     @Mock private WifiDetailPreference mockIpAddressPref;
@@ -97,6 +99,7 @@
         setupMockedPreferenceScreen();
 
         when(mockWifiInfo.getRssi()).thenReturn(RSSI);
+        when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
         when(mockWifiManager.getConnectionInfo()).thenReturn(mockWifiInfo);
     }
 
@@ -106,6 +109,8 @@
                 .thenReturn(mockConnectionDetailPref);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SIGNAL_STRENGTH_PREF))
                 .thenReturn(mockSignalStrengthPref);
+        when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_LINK_SPEED))
+                .thenReturn(mockLinkSpeedPref);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_FREQUENCY_PREF))
                 .thenReturn(mockFrequencyPref);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SECURITY_PREF))
@@ -179,6 +184,15 @@
     }
 
     @Test
+    public void linkSpeedPref_shouldHaveDetailTextSet() {
+        String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED);
+
+        mController.onResume();
+
+        verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed);
+    }
+
+    @Test
     public void forgetNetwork_ephemeral() {
         WifiConfiguration wifiConfiguration = new WifiConfiguration();
         wifiConfiguration.SSID = "ssid";
