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/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/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();
     }
 
