diff --git a/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java b/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
index 89ee19b..bf95348 100644
--- a/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
+++ b/src/com/android/settings/shortcut/CreateShortcutPreferenceController.java
@@ -46,10 +46,12 @@
 import com.android.settings.R;
 import com.android.settings.Settings;
 import com.android.settings.Settings.TetherSettingsActivity;
+import com.android.settings.Settings.WifiTetherSettingsActivity;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.gestures.OneHandedSettingsUtils;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.wifi.WifiUtils;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import java.util.ArrayList;
@@ -192,6 +194,12 @@
                     continue;
                 }
             }
+            if (info.activityInfo.name.endsWith(WifiTetherSettingsActivity.class.getSimpleName())) {
+                if (!canShowWifiHotspot()) {
+                    Log.d(TAG, "Skipping Wi-Fi hotspot settings:" + info.activityInfo);
+                    continue;
+                }
+            }
             if (!info.activityInfo.applicationInfo.isSystemApp()) {
                 Log.d(TAG, "Skipping non-system app: " + info.activityInfo);
                 continue;
@@ -202,6 +210,11 @@
         return shortcuts;
     }
 
+    @VisibleForTesting
+    boolean canShowWifiHotspot() {
+        return WifiUtils.canShowWifiHotspot(mContext);
+    }
+
     private void logCreateShortcut(ResolveInfo info) {
         if (info == null || info.activityInfo == null) {
             return;
diff --git a/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
index 49c1551..df1fec3 100644
--- a/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/shortcut/CreateShortcutPreferenceControllerTest.java
@@ -84,7 +84,7 @@
         mShadowConnectivityManager = ShadowConnectivityManager.getShadow();
         mShadowConnectivityManager.setTetheringSupported(true);
 
-        mController = new CreateShortcutPreferenceController(mContext, "key");
+        mController = spy(new CreateShortcutPreferenceController(mContext, "key"));
         mController.setActivity(mHost);
     }
 
@@ -159,27 +159,39 @@
     @Test
     public void queryShortcuts_setSupportOneHandedMode_ShouldEnableShortcuts() {
         SystemProperties.set(SUPPORT_ONE_HANDED_MODE, "true");
+        setupActivityInfo(Settings.OneHandedSettingsActivity.class.getSimpleName());
 
-        setupOneHandedModeActivityInfo();
-        final List<ResolveInfo> info = mController.queryShortcuts();
-
-        assertThat(info).hasSize(1);
+        assertThat(mController.queryShortcuts()).hasSize(1);
     }
 
     @Test
     public void queryShortcuts_setUnsupportOneHandedMode_ShouldDisableShortcuts() {
         SystemProperties.set(SUPPORT_ONE_HANDED_MODE, "false");
+        setupActivityInfo(Settings.OneHandedSettingsActivity.class.getSimpleName());
 
-        setupOneHandedModeActivityInfo();
-        final List<ResolveInfo> info = mController.queryShortcuts();
-
-        assertThat(info).hasSize(0);
+        assertThat(mController.queryShortcuts()).hasSize(0);
     }
 
-    private void setupOneHandedModeActivityInfo() {
-        final ResolveInfo ri = new ResolveInfo();
+    @Test
+    public void queryShortcuts_configShowWifiHotspot_ShouldEnableShortcuts() {
+        when(mController.canShowWifiHotspot()).thenReturn(true);
+        setupActivityInfo(Settings.WifiTetherSettingsActivity.class.getSimpleName());
+
+        assertThat(mController.queryShortcuts()).hasSize(1);
+    }
+
+    @Test
+    public void queryShortcuts_configNotShowWifiHotspot_ShouldDisableShortcuts() {
+        when(mController.canShowWifiHotspot()).thenReturn(false);
+        setupActivityInfo(Settings.WifiTetherSettingsActivity.class.getSimpleName());
+
+        assertThat(mController.queryShortcuts()).hasSize(0);
+    }
+
+    private void setupActivityInfo(String name) {
+        ResolveInfo ri = new ResolveInfo();
         ri.activityInfo = new ActivityInfo();
-        ri.activityInfo.name = Settings.OneHandedSettingsActivity.class.getSimpleName();
+        ri.activityInfo.name = name;
         ri.activityInfo.applicationInfo = new ApplicationInfo();
         ri.activityInfo.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
 
