diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
index eb50b7c..6067b77 100644
--- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -44,6 +44,7 @@
 import com.android.settingslib.core.lifecycle.events.OnCreate;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.util.List;
 
@@ -134,34 +135,68 @@
         updateTrustAgents();
     }
 
+
+    @Override
+    public void updateDynamicRawDataToIndex(List<SearchIndexableRaw> rawData) {
+        if (!isAvailable()) {
+            return;
+        }
+
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = getActiveTrustAgents(
+                mContext);
+        if (agents == null) {
+            return;
+        }
+
+        for (int i = 0, size = agents.size(); i < size; i++) {
+            final SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
+            final TrustAgentManager.TrustAgentComponentInfo agent = agents.get(i);
+
+            raw.key = PREF_KEY_TRUST_AGENT + i;
+            raw.title = agent.title;
+            rawData.add(raw);
+        }
+    }
+
+    /**
+     * @return The active trust agents from TrustAgentManager.
+     */
+    private List<TrustAgentManager.TrustAgentComponentInfo> getActiveTrustAgents(Context context) {
+        return mTrustAgentManager.getActiveTrustAgents(context, mLockPatternUtils);
+    }
+
     private void updateTrustAgents() {
         if (mSecurityCategory == null) {
             return;
         }
+        // If for some reason the preference is no longer available, don't proceed to add.
+        if (!isAvailable()) {
+            return;
+        }
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = getActiveTrustAgents(
+                mContext);
+        if (agents == null) {
+            return;
+        }
+
         // First remove all old trust agents.
-        while (true) {
-            final Preference oldAgent = mSecurityCategory.findPreference(PREF_KEY_TRUST_AGENT);
+        for (int i = 0, size = agents.size(); i < size; i++) {
+            String key = PREF_KEY_TRUST_AGENT + i;
+            final Preference oldAgent = mSecurityCategory.findPreference(key);
             if (oldAgent == null) {
                 break;
             } else {
                 mSecurityCategory.removePreference(oldAgent);
             }
         }
-        // If for some reason the preference is no longer available, don't proceed to add.
-        if (!isAvailable()) {
-            return;
-        }
+
         // Then add new ones.
         final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
-        final List<TrustAgentManager.TrustAgentComponentInfo> agents =
-                mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils);
-        if (agents == null) {
-            return;
-        }
-        for (TrustAgentManager.TrustAgentComponentInfo agent : agents) {
+        for (int i = 0, size = agents.size(); i < size; i++) {
             final RestrictedPreference trustAgentPreference =
                     new RestrictedPreference(mSecurityCategory.getContext());
-            trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT);
+            TrustAgentManager.TrustAgentComponentInfo agent = agents.get(i);
+            trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT + i);
             trustAgentPreference.setTitle(agent.title);
             trustAgentPreference.setSummary(agent.summary);
             // Create intent for this preference.
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index d9202d4..c0fbff7 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -44,6 +44,7 @@
 import com.android.settings.security.SecuritySettings;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -111,10 +112,20 @@
     @Test
     public void onResume_shouldClearOldAgents() {
         final Preference oldAgent = new Preference(mActivity);
-        oldAgent.setKey(PREF_KEY_TRUST_AGENT);
-        when(mCategory.findPreference(PREF_KEY_TRUST_AGENT))
+        oldAgent.setKey(PREF_KEY_TRUST_AGENT + 0);
+        when(mCategory.findPreference(PREF_KEY_TRUST_AGENT + 0))
                 .thenReturn(oldAgent)
                 .thenReturn(null);
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = new ArrayList<>();
+        final TrustAgentManager.TrustAgentComponentInfo agent =
+                mock(TrustAgentManager.TrustAgentComponentInfo.class);
+        agent.title = "Test_title";
+        agent.summary = "test summary";
+        agent.componentName = new ComponentName("pkg", "agent");
+        agent.admin = null;
+        agents.add(agent);
+        when(mTrustAgentManager.getActiveTrustAgents(mActivity, mLockPatternUtils))
+                .thenReturn(agents);
 
         mController.displayPreference(mScreen);
         mController.onResume();
@@ -160,4 +171,24 @@
 
         verify(mCategory, never()).addPreference(any(Preference.class));
     }
+
+    @Test
+    public void updateDynamicRawDataToIndex_shouldIndexAgents() {
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = new ArrayList<>();
+        final TrustAgentManager.TrustAgentComponentInfo agent =
+                mock(TrustAgentManager.TrustAgentComponentInfo.class);
+        agent.title = "Test_title";
+        agent.summary = "test summary";
+        agent.componentName = new ComponentName("pkg", "agent");
+        agent.admin = null;
+        agents.add(agent);
+        when(mTrustAgentManager.getActiveTrustAgents(mActivity, mLockPatternUtils))
+                .thenReturn(agents);
+        final List<SearchIndexableRaw> indexRaws = new ArrayList<>();
+
+        mController.updateDynamicRawDataToIndex(indexRaws);
+
+        assertThat(indexRaws).hasSize(1);
+    }
+
 }
