diff --git a/res/values/strings.xml b/res/values/strings.xml
index bc8dae1..f4d16dd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -493,6 +493,8 @@
     <string name="advanced_options_title">Advanced</string>
     <!-- Mobile network settings screen, name of the option to manage carrier profiles on devices which support embedded carrier profiles -->
     <string name="carrier_settings_euicc">Carrier</string>
+    <!-- Keywords used to search the carrier menu for managing carrier profiles on devices which support embedded carrier profiles. eSIM/eUICC is embedded SIM card used to store this data.  -->
+    <string name="keywords_carrier_settings_euicc">carrier, esim, sim, euicc</string>
     <!-- Mobile network settings screen, summary of the option to manage carrier profiles on devices which support embedded carrier profiles -->
     <string name="carrier_settings_euicc_summary"><xliff:g id="carrier_name">%1$s</xliff:g> &#8212; <xliff:g id="phone_number">%2$s</xliff:g></string>
     <!-- Mobile network settings screen, title of Mobile Data switch preference -->
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index f0f71a5..6c21a27 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -123,6 +123,26 @@
         return super.onOptionsItemSelected(item);
     }
 
+
+    /**
+     * Whether to show the entry point to eUICC settings.
+     *
+     * <p>We show the entry point on any device which supports eUICC as long as either the eUICC
+     * was ever provisioned (that is, at least one profile was ever downloaded onto it), or if
+     * the user has enabled development mode.
+     */
+    public static boolean showEuiccSettings(Context context) {
+        EuiccManager euiccManager =
+                (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
+        if (!euiccManager.isEnabled()) {
+            return false;
+        }
+        ContentResolver cr = context.getContentResolver();
+        return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0
+                || Settings.Global.getInt(
+                cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
+    }
+
     public static class MobileNetworkFragment extends PreferenceFragment implements
             Preference.OnPreferenceChangeListener, RoamingDialogFragment.RoamingDialogListener {
 
@@ -701,25 +721,6 @@
             return mActiveSubInfos.size() > 0;
         }
 
-        /**
-         * Whether to show the entry point to eUICC settings.
-         *
-         * <p>We show the entry point on any device which supports eUICC as long as either the eUICC
-         * was ever provisioned (that is, at least one profile was ever downloaded onto it), or if
-         * the user has enabled development mode.
-         */
-        private boolean showEuiccSettings() {
-            EuiccManager euiccManager =
-                    (EuiccManager) getActivity().getSystemService(Context.EUICC_SERVICE);
-            if (!euiccManager.isEnabled()) {
-                return false;
-            }
-            ContentResolver cr = getActivity().getContentResolver();
-            return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0
-                    || Settings.Global.getInt(
-                            cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
-        }
-
         private void updateBodyBasicFields(Activity activity, PreferenceScreen prefSet,
                 int phoneSubId, boolean hasActiveSubscriptions) {
             Context context = activity.getApplicationContext();
@@ -790,7 +791,7 @@
             prefSet.addPreference(mButtonEnabledNetworks);
             prefSet.addPreference(mButton4glte);
 
-            if (showEuiccSettings()) {
+            if (showEuiccSettings(getActivity())) {
                 prefSet.addPreference(mEuiccSettingsPref);
                 if (TextUtils.isEmpty(mTelephonyManager.getLine1Number())) {
                     mEuiccSettingsPref.setSummary(null);
diff --git a/src/com/android/phone/PhoneSearchIndexablesProvider.java b/src/com/android/phone/PhoneSearchIndexablesProvider.java
index fe9d214..209d100 100644
--- a/src/com/android/phone/PhoneSearchIndexablesProvider.java
+++ b/src/com/android/phone/PhoneSearchIndexablesProvider.java
@@ -33,10 +33,14 @@
 import android.database.MatrixCursor;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
+import android.provider.SearchIndexablesContract.RawData;
 import android.provider.SearchIndexablesProvider;
+import android.support.annotation.VisibleForTesting;
+import android.telephony.euicc.EuiccManager;
 
 public class PhoneSearchIndexablesProvider extends SearchIndexablesProvider {
     private static final String TAG = "PhoneSearchIndexablesProvider";
+    private UserManager mUserManager;
 
     private static SearchIndexableResource[] INDEXABLE_RES = new SearchIndexableResource[] {
             new SearchIndexableResource(1, R.xml.network_setting_fragment,
@@ -46,6 +50,7 @@
 
     @Override
     public boolean onCreate() {
+        mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
         return true;
     }
 
@@ -70,25 +75,50 @@
     @Override
     public Cursor queryRawData(String[] projection) {
         MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
+        Context context = getContext();
+        String title = context.getString(R.string.carrier_settings_euicc);
+        cursor.newRow()
+                .add(RawData.COLUMN_RANK, 0)
+                .add(RawData.COLUMN_TITLE, title)
+                .add(
+                        RawData.COLUMN_KEYWORDS,
+                        context.getString(R.string.keywords_carrier_settings_euicc))
+                .add(RawData.COLUMN_SCREEN_TITLE, title)
+                .add(RawData.COLUMN_KEY, "esim_list_profile")
+                .add(
+                        RawData.COLUMN_INTENT_ACTION,
+                        EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS)
+                .add(
+                        RawData.COLUMN_INTENT_TARGET_PACKAGE,
+                        context.getPackageName());
         return cursor;
     }
 
     @Override
     public Cursor queryNonIndexableKeys(String[] projection) {
         MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS);
-        final UserManager userManager = (UserManager) getContext().getSystemService(
-                Context.USER_SERVICE);
-        if (!userManager.isAdminUser()) {
+        if (!mUserManager.isAdminUser()) {
             final String[] values = new String[]{"preferred_network_mode_key", "button_roaming_key",
                     "cdma_lte_data_service_key", "enabled_networks_key", "enhanced_4g_lte",
-                    "button_apn_key", "button_network_select_key", "carrier_settings_key",
-                    "cdma_system_select_key", "carrier_settings_euicc_key"};
+                    "button_apn_key", "button_carrier_sel_key", "carrier_settings_key",
+                    "cdma_system_select_key", "esim_list_profile"};
             for (String nik : values) {
-                final Object[] ref = new Object[NON_INDEXABLES_KEYS_COLUMNS.length];
-                ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = nik;
-                cursor.addRow(ref);
+                cursor.addRow(createNonIndexableRow(nik));
             }
+        } else if (isEuiccSettingsHidden()) {
+            cursor.addRow(createNonIndexableRow("esim_list_profile" /* key */));
         }
+        cursor.addRow(createNonIndexableRow("carrier_settings_euicc_key" /* key */));
         return cursor;
     }
+
+    @VisibleForTesting boolean isEuiccSettingsHidden() {
+        return !MobileNetworkSettings.showEuiccSettings(getContext());
+    }
+
+    private Object[] createNonIndexableRow(String key) {
+        final Object[] ref = new Object[NON_INDEXABLES_KEYS_COLUMNS.length];
+        ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = key;
+        return ref;
+    }
 }
diff --git a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
new file mode 100644
index 0000000..2573780
--- /dev/null
+++ b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017 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.phone;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.os.UserManager;
+import android.provider.SearchIndexablesContract;
+import android.provider.Settings;
+import android.support.test.runner.AndroidJUnit4;
+import android.telephony.euicc.EuiccManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unit tests for {@link PhoneSearchIndexablesProvider}. */
+@RunWith(AndroidJUnit4.class)
+public final class PhoneSearchIndexablesProviderTest {
+    private PhoneSearchIndexablesTestProvider mProvider;
+    @Mock private ApplicationInfo mApplicationInfo;
+    @Mock private Context mContext;
+    @Mock private Resources mResources;
+    @Mock private UserManager mUserManager;
+    @Mock private EuiccManager mEuiccManager;
+    @Mock private ContentResolver mCr;
+
+    private class PhoneSearchIndexablesTestProvider extends PhoneSearchIndexablesProvider {
+        private boolean mIsEuiccSettingsHidden = false;
+
+        @Override boolean isEuiccSettingsHidden() {
+            return mIsEuiccSettingsHidden;
+        }
+
+        public void setIsEuiccSettingsHidden(boolean isEuiccSettingsHidden) {
+            mIsEuiccSettingsHidden = isEuiccSettingsHidden;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mResources.getString(com.android.phone.R.string.carrier_settings_euicc))
+                .thenReturn("");
+        when(mResources.getString(com.android.phone.R.string.keywords_carrier_settings_euicc))
+                .thenReturn("");
+
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getSystemService(Context.EUICC_SERVICE)).thenReturn(mEuiccManager);
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+        when(mContext.getPackageName()).thenReturn("PhoneSearchIndexablesProviderTest");
+        when(mContext.getContentResolver()).thenReturn(mCr);
+        when(mCr.getPackageName()).thenReturn("com.android.phone");
+
+        final ProviderInfo providerInfo = new ProviderInfo();
+        providerInfo.authority = Settings.AUTHORITY;
+        providerInfo.exported = true;
+        providerInfo.grantUriPermissions = true;
+        providerInfo.readPermission = android.Manifest.permission.READ_SEARCH_INDEXABLES;
+        mProvider = new PhoneSearchIndexablesTestProvider();
+        mProvider.attachInfo(mContext, providerInfo);
+    }
+
+    @Test
+    public void testQueryRawData() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        Settings.Global.putInt(mCr, Settings.Global.EUICC_PROVISIONED, 1);
+        Settings.Global.getInt(mCr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        Cursor cursor = mProvider.queryRawData(SearchIndexablesContract.INDEXABLES_RAW_COLUMNS);
+        assertThat(cursor.getColumnNames()).isEqualTo(
+                SearchIndexablesContract.INDEXABLES_RAW_COLUMNS);
+        assertThat(cursor.getCount()).isEqualTo(1);
+        cursor.moveToNext();
+        assertThat(cursor.getString(SearchIndexablesContract.COLUMN_INDEX_RAW_KEY))
+                .isEqualTo("esim_list_profile");
+    }
+
+    @Test
+    public void testQueryNonIndexableKeys() {
+        when(mUserManager.isAdminUser()).thenReturn(false);
+        mProvider.setIsEuiccSettingsHidden(false /* isEuiccSettingsHidden */);
+        Cursor cursor1 = mProvider.queryNonIndexableKeys(
+                SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
+        assertThat(cursor1.getColumnNames()).isEqualTo(
+                SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
+        assertThat(cursor1.getCount()).isEqualTo(11);
+
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        Cursor cursor2 = mProvider
+                .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
+        assertThat(cursor2.getCount()).isEqualTo(1);
+
+        mProvider.setIsEuiccSettingsHidden(true /* isEuiccSettingsHidden */);
+        Cursor cursor3 = mProvider
+                .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
+        assertThat(cursor3.getCount()).isEqualTo(2);
+    }
+}
