diff --git a/res/values/strings.xml b/res/values/strings.xml
index 71fd094..821c7fe 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6068,6 +6068,7 @@
     <string name="keywords_unification">work profile, managed profile, unify, unification, work, profile</string>
     <string name="keywords_gesture">gesture</string>
     <string name="keywords_payment_settings">pay, tap, payments</string>
+    <string name="keywords_backup">backup, back up</string>
 
     <!-- NFC Wi-Fi pairing/setup strings-->
 
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index e9d810a..a44e182 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -50,7 +50,7 @@
 /**
  * Gesture lock pattern settings.
  */
-public class PrivacySettings extends SettingsPreferenceFragment implements Indexable {
+public class PrivacySettings extends SettingsPreferenceFragment {
 
     // Vendor specific
     private static final String GSETTINGS_PROVIDER = "com.google.settings";
@@ -225,49 +225,6 @@
         return R.string.help_url_backup_reset;
     }
 
-    /**
-     * For Search.
-     */
-    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new PrivacySearchIndexProvider();
-
-    private static class PrivacySearchIndexProvider extends BaseSearchIndexProvider {
-
-        boolean mIsPrimary;
-
-        public PrivacySearchIndexProvider() {
-            super();
-
-            mIsPrimary = UserHandle.myUserId() == UserHandle.USER_SYSTEM;
-        }
-
-        @Override
-        public List<SearchIndexableResource> getXmlResourcesToIndex(
-                Context context, boolean enabled) {
-
-            List<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>();
-
-            // For non-primary user, no backup or reset is available
-            // TODO: http://b/22388012
-            if (!mIsPrimary) {
-                return result;
-            }
-
-            SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.privacy_settings;
-            result.add(sir);
-
-            return result;
-        }
-
-        @Override
-        public List<String> getNonIndexableKeys(Context context) {
-            final List<String> nonVisibleKeys = new ArrayList<>();
-            getNonVisibleKeys(context, nonVisibleKeys);
-            return nonVisibleKeys;
-        }
-    }
-
     private static void getNonVisibleKeys(Context context, Collection<String> nonVisibleKeys) {
         final IBackupManager backupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
diff --git a/src/com/android/settings/backup/BackupSettingsActivity.java b/src/com/android/settings/backup/BackupSettingsActivity.java
index f5c7ff8..f8bab3d 100644
--- a/src/com/android/settings/backup/BackupSettingsActivity.java
+++ b/src/com/android/settings/backup/BackupSettingsActivity.java
@@ -18,18 +18,29 @@
 
 import android.app.Activity;
 import android.app.FragmentManager;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.support.annotation.VisibleForTesting;
 import android.util.Log;
 
+import com.android.settings.R;
+
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+
+import java.util.ArrayList;
+import java.util.List;
+
 
 /**
  * The activity used to launch the configured Backup activity or the preference screen
  * if the manufacturer provided their backup settings.
  */
-public class BackupSettingsActivity extends Activity {
+public class BackupSettingsActivity extends Activity implements Indexable {
     private static final String TAG = "BackupSettingsActivity";
     private FragmentManager mFragmentManager;
 
@@ -68,6 +79,52 @@
         }
     }
 
+    /**
+     * For Search.
+     */
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                private static final String BACKUP_SEARCH_INDEX_KEY = "backup";
+
+                @Override
+                public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+                        boolean enabled) {
+
+                    final List<SearchIndexableRaw> result = new ArrayList<>();
+
+                    // Add the activity title
+                    SearchIndexableRaw data = new SearchIndexableRaw(context);
+                    data.title = context.getResources().getString(R.string.privacy_settings_title);
+                    data.screenTitle = context.getResources().getString(
+                            R.string.privacy_settings_title);
+                    data.keywords = context.getResources().getString(
+                            R.string.keywords_backup);
+                    data.intentTargetPackage = context.getPackageName();
+                    data.intentTargetClass = BackupSettingsActivity.class.getName();
+                    data.intentAction = "android.intent.action.MAIN";
+                    data.key = BACKUP_SEARCH_INDEX_KEY;
+                    result.add(data);
+
+                    return result;
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> keys = new ArrayList<String>();
+
+                    // For non-primary user, no backup is available, so don't show it in search
+                    // TODO: http://b/22388012
+                    if (UserHandle.myUserId() != UserHandle.USER_SYSTEM) {
+                        if (Log.isLoggable(TAG, Log.DEBUG)) {
+                            Log.d(TAG, "Not a system user, not indexing the screen");
+                        }
+                        keys.add(BACKUP_SEARCH_INDEX_KEY);
+                    }
+
+                    return keys;
+                }
+            };
+
     @VisibleForTesting
     void setFragmentManager(FragmentManager fragmentManager) {
         mFragmentManager = fragmentManager;
diff --git a/src/com/android/settings/backup/BackupSettingsFragment.java b/src/com/android/settings/backup/BackupSettingsFragment.java
index dcc1608..a451272 100644
--- a/src/com/android/settings/backup/BackupSettingsFragment.java
+++ b/src/com/android/settings/backup/BackupSettingsFragment.java
@@ -18,11 +18,6 @@
 
 import android.content.Context;
 import android.os.Bundle;
-import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.util.Log;
-
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
@@ -32,7 +27,6 @@
 import com.android.settings.search.Indexable;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -72,15 +66,10 @@
         return controllers;
     }
 
+    // The intention is to index {@link BackupSettingsActivity} instead of the fragments,
+    // therefore leaving this index provider empty.
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                        boolean enabled) {
-                    final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.backup_settings;
-                    return Arrays.asList(sir);
-                }
             };
 
     @Override
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 1968c7a..076e6c0 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -38,6 +38,7 @@
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
 import com.android.settings.applications.SpecialAccessSettings;
 import com.android.settings.applications.assist.ManageAssist;
+import com.android.settings.backup.BackupSettingsActivity;
 import com.android.settings.backup.BackupSettingsFragment;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
@@ -162,7 +163,7 @@
         addIndex(AvailableVirtualKeyboardFragment.class,
                 NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(PhysicalKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
-        addIndex(PrivacySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
+        addIndex(BackupSettingsActivity.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
         addIndex(BackupSettingsFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
         addIndex(DateTimeSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_date_time);
         addIndex(AccessibilitySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_accessibility);
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
index d6dab55..ae67b04 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
@@ -20,8 +20,6 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.robolectric.Shadows.shadowOf;
 
@@ -29,16 +27,16 @@
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
-import android.app.backup.IBackupManager;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.os.IBinder;
+import android.os.UserHandle;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.search.SearchIndexableRaw;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,16 +47,20 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
 import org.robolectric.res.builder.RobolectricPackageManager;
 import org.robolectric.util.ActivityController;
 import org.robolectric.shadows.ShadowActivity;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.util.List;
+
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
-        shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class})
+        shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
+                BackupSettingsActivityTest.ShadowUserHandle.class})
 public class BackupSettingsActivityTest {
     private ActivityController<BackupSettingsActivity> mActivityController;
     private BackupSettingsActivity mActivity;
@@ -85,7 +87,6 @@
         mActivity = mActivityController.get();
         mPackageManager = (RobolectricPackageManager) mApplication.getPackageManager();
         doReturn(mComponent).when(mIntent).getComponent();
-
     }
 
     @Test
@@ -124,6 +125,41 @@
 
     }
 
+    @Test
+    public void getNonIndexableKeys_SystemUser() {
+        final List<SearchIndexableRaw> indexableRaws =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
+                        mApplication.getApplicationContext(), true);
+        final List<String> nonIndexableKeys =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                        mApplication.getApplicationContext());
+
+        assertThat(indexableRaws).isNotNull();
+        assertThat(indexableRaws).isNotEmpty();
+        assertThat(nonIndexableKeys).isEmpty();
+    }
+
+    @Test
+    public void getNonIndexableKeys_NonSystemUser() {
+        ShadowUserHandle.setUid(1); // Non-SYSTEM user.
+
+        final List<SearchIndexableRaw> indexableRaws =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
+                        mApplication.getApplicationContext(), true);
+        final List<String> nonIndexableKeys =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                        mApplication.getApplicationContext());
+
+        assertThat(indexableRaws).isNotNull();
+        assertThat(indexableRaws).isNotEmpty();
+        assertThat(nonIndexableKeys).isNotEmpty();
+    }
+
+    @After
+    public void resetShadows() {
+        ShadowUserHandle.reset();
+    }
+
     @Implements(BackupSettingsHelper.class)
     public static class ShadowBackupSettingsHelper {
         @Implementation
@@ -136,4 +172,23 @@
             return mIsBackupProvidedByOEM;
         }
     }
+
+    @Implements(UserHandle.class)
+    public static class ShadowUserHandle {
+        private static int sUid = 0; // SYSTEM by default
+
+        public static void setUid(int uid) {
+            sUid = uid;
+        }
+
+        @Implementation
+        public static int myUserId() {
+            return sUid;
+        }
+
+        @Resetter
+        public static void reset() {
+            sUid = 0;
+        }
+    }
 }
