diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index cc9542b..a892b97 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -83,7 +83,8 @@
     }
 
     public static class VpnSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class DataSaverSummaryActivity extends SettingsActivity{ /* empty */ }
+    /** Activity for Data saver settings. */
+    public static class DataSaverSummaryActivity extends SettingsActivity { /* empty */ }
     public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PrivateVolumeForgetActivity extends SettingsActivity { /* empty */ }
     public static class PublicVolumeSettingsActivity extends SettingsActivity { /* empty */ }
@@ -121,13 +122,9 @@
     public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityContrastSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityDaltonizerSettingsActivity extends SettingsActivity { /* empty */ }
-    /**
-     * Activity for lockscreen settings.
-     */
+    /** Activity for lockscreen settings. */
     public static class LockScreenSettingsActivity extends SettingsActivity { /* empty */ }
-    /**
-     * Activity for Reduce Bright Colors.
-     */
+    /** Activity for Reduce Bright Colors. */
     public static class ReduceBrightColorsSettingsActivity extends SettingsActivity { /* empty */ }
     /** Activity for the security dashboard. */
     public static class SecurityDashboardActivity extends SettingsActivity {
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 634a646..c105238 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -149,9 +149,13 @@
     public static final String META_DATA_KEY_FRAGMENT_CLASS =
             "com.android.settings.FRAGMENT_CLASS";
 
+    public static final String META_DATA_KEY_HIGHLIGHT_MENU_KEY =
+            "com.android.settings.HIGHLIGHT_MENU_KEY";
+
     private static final String EXTRA_UI_OPTIONS = "settings:ui_options";
 
     private String mFragmentClass;
+    private String mHighlightMenuKey;
 
     private CharSequence mInitialTitle;
     private int mInitialTitleResId;
@@ -234,21 +238,19 @@
         super.onCreate(savedState);
         Log.d(LOG_TAG, "Starting onCreate");
 
-        if (launchHomepageForTwonPaneDeepLink()) {
+        long startTime = System.currentTimeMillis();
+
+        // Should happen before any call to getIntent()
+        getMetaData();
+        final Intent intent = getIntent();
+        if (launchHomepageForTwoPaneDeepLink(intent)) {
             finish();
             return;
         }
 
-        long startTime = System.currentTimeMillis();
-
         final FeatureFactory factory = FeatureFactory.getFactory(this);
-
         mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);
 
-        // Should happen before any call to getIntent()
-        getMetaData();
-
-        final Intent intent = getIntent();
         if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
             getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
         }
@@ -355,8 +357,7 @@
     }
 
     /** Returns true if the Activity is started by a deep link intent for large screen devices. */
-    private boolean launchHomepageForTwonPaneDeepLink() {
-        final Intent intent = getIntent();
+    private boolean launchHomepageForTwoPaneDeepLink(Intent intent) {
         if (!shouldShowTwoPaneDeepLink(intent)) {
             return false;
         }
@@ -368,6 +369,9 @@
         trampolineIntent.putExtra(
                 android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI,
                 intent.toUri(Intent.URI_INTENT_SCHEME));
+        trampolineIntent.putExtra(
+                android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY,
+                mHighlightMenuKey);
         trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
         startActivity(trampolineIntent);
 
@@ -776,6 +780,7 @@
                     PackageManager.GET_META_DATA);
             if (ai == null || ai.metaData == null) return;
             mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
+            mHighlightMenuKey = ai.metaData.getString(META_DATA_KEY_HIGHLIGHT_MENU_KEY);
         } catch (NameNotFoundException nnfe) {
             // No recovery
             Log.d(LOG_TAG, "Cannot get Metadata for: " + getComponentName().toString());
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index b8ff60c..1d6a48d 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -119,8 +119,7 @@
 
     @VisibleForTesting
     public HighlightablePreferenceGroupAdapter mAdapter;
-    @VisibleForTesting
-    public boolean mPreferenceHighlighted = false;
+    private boolean mPreferenceHighlighted = false;
 
     @Override
     public void onCreate(Bundle icicle) {
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 72bfa11..6886154 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1223,6 +1223,14 @@
         return getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
     }
 
+    /**
+     * Returns the highlight color of homepage preference icons.
+     */
+    @ColorInt
+    public static int getHomepageIconColorHighlight(Context context) {
+        return getColorAttrDefaultColor(context, android.R.attr.textColorSecondaryInverse);
+    }
+
     public static boolean isProviderModelEnabled(Context context) {
         return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
     }
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
index ab999ed..7ecacde 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -62,4 +62,12 @@
 
         return isFlagEnabled && isSplitSupported;
     }
+
+    /** Whether the screen meets two-pane resolution. */
+    public static boolean isTwoPaneResolution(Context context) {
+        final Context appContext = context.getApplicationContext();
+        final DisplayMetrics dm = appContext.getResources().getDisplayMetrics();
+        return dm.widthPixels >= getMinCurrentScreenSplitWidthPx(appContext)
+                && dm.heightPixels >= getMinSmallestScreenSplitWidthPx(appContext);
+    }
 }
diff --git a/src/com/android/settings/dashboard/CategoryManager.java b/src/com/android/settings/dashboard/CategoryManager.java
index 2a82abe..b6ec4ca 100644
--- a/src/com/android/settings/dashboard/CategoryManager.java
+++ b/src/com/android/settings/dashboard/CategoryManager.java
@@ -17,6 +17,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
@@ -24,6 +25,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.settings.homepage.HighlightableMenu;
 import com.android.settingslib.applications.InterestingConfigChanges;
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -153,6 +155,20 @@
             filterDuplicateTiles(mCategoryByKeyMap);
             if (firstLoading) {
                 logTiles(context);
+
+                final DashboardCategory homepageCategory = mCategoryByKeyMap.get(
+                        CategoryKey.CATEGORY_HOMEPAGE);
+                if (homepageCategory == null) {
+                    return;
+                }
+                for (Tile tile : homepageCategory.getTiles()) {
+                    final String key = tile.getKey(context);
+                    if (TextUtils.isEmpty(key)) {
+                        Log.w(TAG, "Key hint missing for homepage tile: " + tile.getTitle(context));
+                        continue;
+                    }
+                    HighlightableMenu.addMenuKey(key);
+                }
             }
         }
     }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
index 8c872f0..b88ecd4 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -47,9 +47,9 @@
      * Binds preference to data provided by tile and gets dynamic data observers.
      *
      * @param activity If tile contains intent to launch, it will be launched from this activity
+     * @param fragment The fragment that the preference will be bound to
      * @param forceRoundedIcon Whether or not injected tiles from other packages should be forced to
      * rounded icon.
-     * @param sourceMetricsCategory The context (source) from which an action is performed
      * @param pref The preference to bind data
      * @param tile The binding data
      * @param key They key for preference. If null, we will generate one from tile data
@@ -58,7 +58,7 @@
      * @return The list of dynamic data observers
      */
     List<DynamicDataObserver> bindPreferenceToTileAndGetObservers(FragmentActivity activity,
-            boolean forceRoundedIcon, int sourceMetricsCategory, Preference pref, Tile tile,
+            DashboardFragment fragment, boolean forceRoundedIcon, Preference pref, Tile tile,
             String key, int baseOrder);
 
     /**
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 27b20cf..f8185db 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -36,6 +36,7 @@
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.IContentProvider;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -60,6 +61,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
+import com.android.settings.homepage.TopLevelSettings;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.PrimarySwitchPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -123,7 +125,7 @@
 
     @Override
     public List<DynamicDataObserver> bindPreferenceToTileAndGetObservers(FragmentActivity activity,
-            boolean forceRoundedIcon, int sourceMetricsCategory, Preference pref, Tile tile,
+            DashboardFragment fragment, boolean forceRoundedIcon, Preference pref, Tile tile,
             String key, int baseOrder) {
         if (pref == null) {
             return null;
@@ -149,6 +151,7 @@
         bindIcon(pref, tile, forceRoundedIcon);
 
         if (tile instanceof ActivityTile) {
+            final int sourceMetricsCategory = fragment.getMetricsCategory();
             final Bundle metadata = tile.getMetaData();
             String clsName = null;
             String action = null;
@@ -166,7 +169,17 @@
                     intent.setAction(action);
                 }
                 pref.setOnPreferenceClickListener(preference -> {
-                    launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory);
+                    OnCancelListener listener = null;
+                    if (fragment instanceof TopLevelSettings) {
+                        final TopLevelSettings topLevelSettings = (TopLevelSettings) fragment;
+                        // Highlight the tile immediately whenever it's clicked
+                        topLevelSettings.setHighlightPreferenceKey(key);
+                        // If the tile allows users to select profile, the pop-op dialog may be
+                        // cancelled and then the previous highlight entry should be restored.
+                        listener = dialog -> topLevelSettings.restorePreviousHighlight();
+                    }
+                    launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory,
+                            listener);
                     return true;
                 });
             }
@@ -198,7 +211,8 @@
                 .putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
                         SettingsEnums.DASHBOARD_SUMMARY)
                 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-        launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY);
+        launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY,
+                /* listener= */ null);
     }
 
     private DynamicDataObserver createDynamicDataObserver(String method, Uri uri, Preference pref) {
@@ -413,7 +427,7 @@
     }
 
     private void launchIntentOrSelectProfile(FragmentActivity activity, Tile tile, Intent intent,
-            int sourceMetricCategory) {
+            int sourceMetricCategory, OnCancelListener listener) {
         if (!isIntentResolvable(intent)) {
             Log.w(TAG, "Cannot resolve intent, skipping. " + intent);
             return;
@@ -444,7 +458,7 @@
             }
 
             ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile,
-                    sourceMetricCategory);
+                    sourceMetricCategory, listener);
         }
     }
 
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index dfd931d..4317fc6 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -496,15 +496,15 @@
             if (mDashboardTilePrefKeys.containsKey(key)) {
                 // Have the key already, will rebind.
                 final Preference preference = screen.findPreference(key);
-                mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers(getActivity(),
-                        forceRoundedIcons, getMetricsCategory(), preference, tile, key,
+                mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers(getActivity(), this,
+                        forceRoundedIcons, preference, tile, key,
                         mPlaceholderPreferenceController.getOrder());
             } else {
                 // Don't have this key, add it.
                 final Preference pref = createPreference(tile);
                 final List<DynamicDataObserver> observers =
                         mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers(getActivity(),
-                                forceRoundedIcons, getMetricsCategory(), pref, tile, key,
+                                this, forceRoundedIcons, pref, tile, key,
                                 mPlaceholderPreferenceController.getOrder());
                 screen.addPreference(pref);
                 registerDynamicDataObservers(observers);
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
index 36cdd42..b05f23b 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
@@ -19,6 +19,7 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.os.Bundle;
@@ -44,19 +45,23 @@
 
     private int mSourceMetricCategory;
     private Tile mSelectedTile;
+    private OnCancelListener mOnCancelListener;
 
     /**
      * Display the profile select dialog, adding the fragment to the given FragmentManager.
      * @param manager The FragmentManager this fragment will be added to.
      * @param tile The tile for this fragment.
      * @param sourceMetricCategory The source metric category.
+     * @param listener The listener listens to the dialog cancelling event.
      */
-    public static void show(FragmentManager manager, Tile tile, int sourceMetricCategory) {
+    public static void show(FragmentManager manager, Tile tile, int sourceMetricCategory,
+            OnCancelListener listener) {
         final ProfileSelectDialog dialog = new ProfileSelectDialog();
         final Bundle args = new Bundle();
         args.putParcelable(ARG_SELECTED_TILE, tile);
         args.putInt(ARG_SOURCE_METRIC_CATEGORY, sourceMetricCategory);
         dialog.setArguments(args);
+        dialog.mOnCancelListener = listener;
         dialog.show(manager, "select_profile");
     }
 
@@ -91,6 +96,13 @@
         getActivity().startActivityAsUser(intent, user);
     }
 
+    @Override
+    public void onCancel(DialogInterface dialog) {
+        if (mOnCancelListener != null) {
+            mOnCancelListener.onCancel(dialog);
+        }
+    }
+
     public static void updateUserHandlesIfNeeded(Context context, Tile tile) {
         final List<UserHandle> userHandles = tile.userHandle;
         if (tile.userHandle == null || tile.userHandle.size() <= 1) {
diff --git a/src/com/android/settings/homepage/HighlightableMenu.java b/src/com/android/settings/homepage/HighlightableMenu.java
new file mode 100644
index 0000000..6a10e66
--- /dev/null
+++ b/src/com/android/settings/homepage/HighlightableMenu.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2021 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.settings.homepage;
+
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_HIGHLIGHTABLE_MENU_KEY;
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
+
+import android.annotation.XmlRes;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.settings.core.PreferenceXmlParserUtils;
+import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  Class for mapping highlightable menu keys and preference keys
+ */
+public class HighlightableMenu {
+    private static final String TAG = "HighlightableMenu";
+
+    /**
+     * Map from highlightable menu key to preference key.
+     */
+    private static final Map<String, String> MENU_TO_PREFERENCE_KEY_MAP;
+
+    /**
+     * Map from old menu key to current key string id.
+     */
+    private static final Map<String, Integer> MENU_KEY_COMPAT_MAP;
+
+    private static boolean sXmlParsed;
+
+    static {
+        MENU_TO_PREFERENCE_KEY_MAP = new ArrayMap<>();
+        MENU_KEY_COMPAT_MAP = new ArrayMap<>();
+
+        // Manual mapping for platform compatibility, e.g.
+        //  MENU_KEY_COMPAT_MAP.put("top_level_apps_and_notifs", R.string.menu_key_apps);
+    }
+
+    /** Parses the highlightable menu keys from xml */
+    public static synchronized void fromXml(Context context, @XmlRes int xmlResId) {
+        if (sXmlParsed) {
+            return;
+        }
+
+        Log.d(TAG, "parsing highlightable menu from xml");
+        final List<Bundle> preferenceMetadata;
+        try {
+            preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId,
+                    MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY);
+        } catch (IOException | XmlPullParserException e) {
+            Log.e(TAG, "Failed to parse preference xml for getting highlightable menu keys", e);
+            return;
+        }
+
+        for (Bundle metadata : preferenceMetadata) {
+            final String menuKey = metadata.getString(METADATA_HIGHLIGHTABLE_MENU_KEY);
+            if (TextUtils.isEmpty(menuKey)) {
+                continue;
+            }
+            final String prefKey = metadata.getString(METADATA_KEY);
+            if (TextUtils.isEmpty(prefKey)) {
+                Log.w(TAG, "Highlightable menu requires android:key but it's missing in xml: "
+                        + menuKey);
+                continue;
+            }
+            MENU_TO_PREFERENCE_KEY_MAP.put(menuKey, prefKey);
+        }
+
+        if (MENU_TO_PREFERENCE_KEY_MAP.isEmpty()) {
+            return;
+        }
+
+        sXmlParsed = true;
+        MENU_KEY_COMPAT_MAP.forEach((compatMenuKey, keyId) -> {
+            final String prefKey = lookupPreferenceKey(context.getString(keyId));
+            if (prefKey != null) {
+                MENU_TO_PREFERENCE_KEY_MAP.put(compatMenuKey, prefKey);
+            }
+        });
+    }
+
+    /** Manually adds a preference as the menu key for Injection */
+    public static synchronized void addMenuKey(String key) {
+        Log.d(TAG, "add menu key: " + key);
+        MENU_TO_PREFERENCE_KEY_MAP.put(key, key);
+    }
+
+    /** Looks up the preference key by a specified menu key */
+    public static String lookupPreferenceKey(String menuKey) {
+        return MENU_TO_PREFERENCE_KEY_MAP.get(menuKey);
+    }
+}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 3e9b9d0..471b1a4 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -16,13 +16,15 @@
 
 package com.android.settings.homepage;
 
+import static android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK;
+import static android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI;
+import static android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY;
+
 import android.animation.LayoutTransition;
 import android.app.ActivityManager;
-import android.app.PendingIntent;
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
@@ -36,16 +38,16 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
-import androidx.window.embedding.SplitController;
 
 import com.android.settings.R;
 import com.android.settings.Settings;
+import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.accounts.AvatarViewMixin;
-import com.android.settings.core.CategoryMixin;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.core.CategoryMixin;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
@@ -64,6 +66,7 @@
     // An alias class name of SettingsHomepageActivity.
     public static final String ALIAS_DEEP_LINK = "com.android.settings.DeepLinkHomepageActivity";
 
+    private static final int DEFAULT_HIGHLIGHT_MENU_KEY = R.string.menu_key_network;
     private static final long HOMEPAGE_LOADING_TIMEOUT_MS = 300;
 
     private View mHomepageView;
@@ -120,7 +123,11 @@
                 showFragment(new ContextualCardsFragment(), R.id.contextual_cards_content);
             }
         }
-        showFragment(new TopLevelSettings(), R.id.main_content);
+        final Fragment fragment = new TopLevelSettings();
+        fragment.getArguments().putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
+                getHighlightMenuKey());
+        showFragment(fragment, R.id.main_content);
+
         ((FrameLayout) findViewById(R.id.main_content))
                 .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
 
@@ -132,9 +139,13 @@
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
 
-        // When it's large screen 2-pane and Settings app is in background. Receiving a Intent
-        // in this Activity will not finish nor onCreate. setIntent here for this case.
+        // When it's large screen 2-pane and Settings app is in the background, receiving an Intent
+        // will not recreate this activity. Update the intent for this case.
         setIntent(intent);
+        reloadHighlightMenuKey();
+        if (isFinishing()) {
+            return;
+        }
         // Launch the intent from deep link for large screen devices.
         launchDeepLinkIntentToRight();
     }
@@ -180,12 +191,12 @@
 
         final Intent intent = getIntent();
         if (intent == null || !TextUtils.equals(intent.getAction(),
-                android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK)) {
+                ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK)) {
             return;
         }
 
         final String intentUriString = intent.getStringExtra(
-                android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI);
+                EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI);
         if (TextUtils.isEmpty(intentUriString)) {
             Log.e(TAG, "No EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI to deep link");
             finish();
@@ -236,6 +247,29 @@
         startActivity(targetIntent);
     }
 
+    private String getHighlightMenuKey() {
+        final Intent intent = getIntent();
+        if (intent != null && TextUtils.equals(intent.getAction(),
+                ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK)) {
+            final String menuKey = intent.getStringExtra(
+                    EXTRA_SETTINGS_LARGE_SCREEN_HIGHLIGHT_MENU_KEY);
+            if (!TextUtils.isEmpty(menuKey)) {
+                return menuKey;
+            }
+        }
+        return getString(DEFAULT_HIGHLIGHT_MENU_KEY);
+    }
+
+    private void reloadHighlightMenuKey() {
+        final TopLevelSettings fragment =
+                (TopLevelSettings) getSupportFragmentManager().findFragmentById(R.id.main_content);
+        if (fragment != null) {
+            fragment.getArguments().putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
+                    getHighlightMenuKey());
+            fragment.reloadHighlightMenuKey();
+        }
+    }
+
     private void initHomepageContainer() {
         final View view = findViewById(R.id.homepage_container);
         // Prevent inner RecyclerView gets focus and invokes scrolling.
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 681ea51..a819b87 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -21,20 +21,27 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceFragmentCompat;
 import androidx.preference.PreferenceScreen;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.support.SupportPreferenceController;
+import com.android.settings.widget.HighlightableTopLevelPreferenceAdapter;
 import com.android.settingslib.core.instrumentation.Instrumentable;
 import com.android.settingslib.search.SearchIndexable;
 
@@ -43,6 +50,11 @@
         PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
 
     private static final String TAG = "TopLevelSettings";
+    private static final String SAVED_HIGHLIGHTED_PREF = "highlighted_pref";
+
+    private HighlightableTopLevelPreferenceAdapter mTopLevelAdapter;
+
+    private String mHighlightedPreferenceKey;
 
     public TopLevelSettings() {
         final Bundle args = new Bundle();
@@ -69,6 +81,7 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
+        HighlightableMenu.fromXml(context, getPreferenceScreenResId());
         use(SupportPreferenceController.class).setActivity(getActivity());
     }
 
@@ -84,6 +97,12 @@
     }
 
     @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        setHighlightPreferenceKey(preference.getKey());
+        return super.onPreferenceTreeClick(preference);
+    }
+
+    @Override
     public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
         new SubSettingLauncher(getActivity())
                 .setDestination(pref.getFragment())
@@ -97,6 +116,20 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        if (icicle != null) {
+            mHighlightedPreferenceKey = icicle.getString(SAVED_HIGHLIGHTED_PREF);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(SAVED_HIGHLIGHTED_PREF, mHighlightedPreferenceKey);
+    }
+
+    @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
         final PreferenceScreen screen = getPreferenceScreen();
@@ -119,11 +152,77 @@
     }
 
     @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        highlightPreferenceIfNeeded();
+    }
+
+    @Override
+    public void highlightPreferenceIfNeeded() {
+        if (mTopLevelAdapter != null) {
+            mTopLevelAdapter.requestHighlight();
+        }
+    }
+
+    /** Highlight a preference with specified key */
+    public void setHighlightPreferenceKey(String prefKey) {
+        if (mTopLevelAdapter != null) {
+            mHighlightedPreferenceKey = prefKey;
+            mTopLevelAdapter.highlightPreference(prefKey, /* scrollNeeded= */ false);
+        }
+    }
+
+    /** Highlight the previous preference */
+    public void restorePreviousHighlight() {
+        if (mTopLevelAdapter != null) {
+            mTopLevelAdapter.restorePreviousHighlight();
+        }
+    }
+
+    @Override
     protected boolean shouldForceRoundedIcon() {
         return getContext().getResources()
                 .getBoolean(R.bool.config_force_rounded_icon_TopLevelSettings);
     }
 
+    @Override
+    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext())) {
+            return super.onCreateAdapter(preferenceScreen);
+        }
+
+        if (TextUtils.isEmpty(mHighlightedPreferenceKey)) {
+            mHighlightedPreferenceKey = getHighlightPrefKeyFromArguments();
+        }
+
+        Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
+        mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(preferenceScreen,
+                getListView(), mHighlightedPreferenceKey);
+        return mTopLevelAdapter;
+    }
+
+    void reloadHighlightMenuKey() {
+        if (mTopLevelAdapter == null) {
+            return;
+        }
+
+        mHighlightedPreferenceKey = getHighlightPrefKeyFromArguments();
+        Log.d(TAG, "reloadHighlightMenuKey, pref key: " + mHighlightedPreferenceKey);
+        mTopLevelAdapter.highlightPreference(mHighlightedPreferenceKey, /* scrollNeeded= */ true);
+    }
+
+    private String getHighlightPrefKeyFromArguments() {
+        final Bundle arguments = getArguments();
+        final String menuKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+        final String prefKey = HighlightableMenu.lookupPreferenceKey(menuKey);
+        if (TextUtils.isEmpty(prefKey)) {
+            Log.e(TAG, "Invalid highlight menu key: " + menuKey);
+        } else {
+            Log.d(TAG, "Menu key: " + menuKey);
+        }
+        return prefKey;
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.top_level_settings) {
 
diff --git a/src/com/android/settings/search/SearchFeatureProviderImpl.java b/src/com/android/settings/search/SearchFeatureProviderImpl.java
index 508d37d..6f90970 100644
--- a/src/com/android/settings/search/SearchFeatureProviderImpl.java
+++ b/src/com/android/settings/search/SearchFeatureProviderImpl.java
@@ -50,7 +50,7 @@
         if (isSettingsPackage || isAllowlistedPackage) {
             return;
         }
-        throw new SecurityException("Search result intents must be called with from a "
+        throw new SecurityException("Search result intents must be called with from an "
                 + "allowlisted package.");
     }
 
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
new file mode 100644
index 0000000..eeaad21
--- /dev/null
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2021 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.settings.widget;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceGroupAdapter;
+import androidx.preference.PreferenceViewHolder;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+
+/**
+ *  Adapter for highlighting top level preferences
+ */
+public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapter {
+
+    private static final String TAG = "HighlightableTopLevelAdapter";
+
+    static final long DELAY_HIGHLIGHT_DURATION_MILLIS = 100L;
+
+    @VisibleForTesting
+    final int mHighlightColor;
+    final int mTitleColorNormal;
+    final int mTitleColorHighlight;
+    final int mSummaryColorNormal;
+    final int mSummaryColorHighlight;
+    final int mIconColorNormal;
+    final int mIconColorHighlight;
+
+    private final Context mContext;
+    private final RecyclerView mRecyclerView;
+    private final int mNormalBackgroundRes;
+    private String mHighlightKey;
+    private String mPreviousHighlightKey;
+    private int mHighlightPosition = RecyclerView.NO_POSITION;
+    private boolean mHighlightNeeded;
+    private boolean mScrolled;
+
+    public HighlightableTopLevelPreferenceAdapter(PreferenceGroup preferenceGroup,
+            RecyclerView recyclerView, String key) {
+        super(preferenceGroup);
+        mRecyclerView = recyclerView;
+        mHighlightKey = key;
+        mContext = preferenceGroup.getContext();
+        final TypedValue outValue = new TypedValue();
+        mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
+                outValue, true /* resolveRefs */);
+        mNormalBackgroundRes = outValue.resourceId;
+        mHighlightColor = Utils.getColorAttrDefaultColor(mContext,
+                com.android.internal.R.attr.colorAccentSecondaryVariant);
+        mTitleColorNormal = Utils.getColorAttrDefaultColor(mContext,
+                android.R.attr.textColorPrimary);
+        mTitleColorHighlight = Utils.getColorAttrDefaultColor(mContext,
+                android.R.attr.textColorPrimaryInverse);
+        mSummaryColorNormal = Utils.getColorAttrDefaultColor(mContext,
+                android.R.attr.textColorSecondary);
+        mSummaryColorHighlight = Utils.getColorAttrDefaultColor(mContext,
+                android.R.attr.textColorSecondaryInverse);
+        mIconColorNormal = Utils.getHomepageIconColor(mContext);
+        mIconColorHighlight = Utils.getHomepageIconColorHighlight(mContext);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder, int position) {
+        super.onBindViewHolder(holder, position);
+        updateBackground(holder, position);
+    }
+
+    @VisibleForTesting
+    void updateBackground(PreferenceViewHolder holder, int position) {
+        if (!isHighlightNeeded()) {
+            removeHighlightBackground(holder);
+            return;
+        }
+
+        if (position == mHighlightPosition
+                && mHighlightKey != null
+                && TextUtils.equals(mHighlightKey, getItem(position).getKey())) {
+            // This position should be highlighted.
+            addHighlightBackground(holder);
+        } else {
+            removeHighlightBackground(holder);
+        }
+    }
+
+    /**
+     * A function can highlight a specific setting in recycler view.
+     */
+    public void requestHighlight() {
+        if (mRecyclerView == null || TextUtils.isEmpty(mHighlightKey)) {
+            return;
+        }
+
+        if (TextUtils.isEmpty(mHighlightKey)) {
+            // De-highlight previous preference.
+            final int previousPosition = mHighlightPosition;
+            mHighlightPosition = RecyclerView.NO_POSITION;
+            mScrolled = true;
+            if (previousPosition >= 0) {
+                notifyItemChanged(previousPosition);
+            }
+            return;
+        }
+
+        final int position = getPreferenceAdapterPosition(mHighlightKey);
+        if (position < 0) {
+            return;
+        }
+
+        final boolean highlightNeeded = isHighlightNeeded();
+        if (highlightNeeded) {
+            scrollToPositionIfNeeded(position);
+        }
+
+        // Turn on/off highlight when screen split mode is changed.
+        if (highlightNeeded != mHighlightNeeded) {
+            Log.d(TAG, "Highlight change needed: " + highlightNeeded);
+            mHighlightNeeded = highlightNeeded;
+            mHighlightPosition = position;
+            notifyItemChanged(position);
+            return;
+        }
+
+        if (position == mHighlightPosition) {
+            return;
+        }
+
+        final int previousPosition = mHighlightPosition;
+        mHighlightPosition = position;
+        Log.d(TAG, "Request highlight position " + position);
+        Log.d(TAG, "Is highlight needed: " + highlightNeeded);
+        if (!highlightNeeded) {
+            return;
+        }
+
+        // Highlight preference.
+        notifyItemChanged(position);
+
+        // De-highlight previous preference.
+        if (previousPosition >= 0) {
+            notifyItemChanged(previousPosition);
+        }
+    }
+
+    /**
+     * A function that highlights a setting by specifying a preference key. Usually used whenever a
+     * preference is clicked.
+     */
+    public void highlightPreference(String key, boolean scrollNeeded) {
+        mPreviousHighlightKey = mHighlightKey;
+        mHighlightKey = key;
+        mScrolled = !scrollNeeded;
+        requestHighlight();
+    }
+
+    /**
+     * A function that restores the previous highlighted setting.
+     */
+    public void restorePreviousHighlight() {
+        mHighlightKey = mPreviousHighlightKey;
+        requestHighlight();
+    }
+
+    private void scrollToPositionIfNeeded(int position) {
+        if (mScrolled || position < 0) {
+            return;
+        }
+
+        // Only when the recyclerView is loaded, it can be scrolled
+        final View view = mRecyclerView.getChildAt(position);
+        if (view == null) {
+            mRecyclerView.postDelayed(() -> scrollToPositionIfNeeded(position),
+                    DELAY_HIGHLIGHT_DURATION_MILLIS);
+            return;
+        }
+
+        mScrolled = true;
+        Log.d(TAG, "Scroll to position " + position);
+        // Scroll to the top to reset the position.
+        mRecyclerView.nestedScrollBy(0, -mRecyclerView.getHeight());
+
+        final int scrollY = view.getTop();
+        if (scrollY > 0) {
+            mRecyclerView.nestedScrollBy(0, scrollY);
+        }
+    }
+
+    private void addHighlightBackground(PreferenceViewHolder holder) {
+        final View v = holder.itemView;
+        v.setBackgroundColor(mHighlightColor);
+        ((TextView) v.findViewById(android.R.id.title)).setTextColor(mTitleColorHighlight);
+        ((TextView) v.findViewById(android.R.id.summary)).setTextColor(mSummaryColorHighlight);
+        final Drawable drawable = ((ImageView) v.findViewById(android.R.id.icon)).getDrawable();
+        if (drawable != null) {
+            drawable.setTint(mIconColorHighlight);
+        }
+    }
+
+    private void removeHighlightBackground(PreferenceViewHolder holder) {
+        final View v = holder.itemView;
+        v.setBackgroundResource(mNormalBackgroundRes);
+        ((TextView) v.findViewById(android.R.id.title)).setTextColor(mTitleColorNormal);
+        ((TextView) v.findViewById(android.R.id.summary)).setTextColor(mSummaryColorNormal);
+        final Drawable drawable = ((ImageView) v.findViewById(android.R.id.icon)).getDrawable();
+        if (drawable != null) {
+            drawable.setTint(mIconColorNormal);
+        }
+    }
+
+    private boolean isHighlightNeeded() {
+        return ActivityEmbeddingUtils.isTwoPaneResolution(mContext);
+    }
+}
