diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index e8eb8ba..2391fe8 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -57,6 +57,7 @@
 import android.net.Network;
 import android.net.wifi.WifiManager;
 import android.os.BatteryManager;
+import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -1089,4 +1090,15 @@
         }
         return f;
     }
+
+    /**
+     * Returns true if current binder uid is Settings Intelligence.
+     */
+    public static boolean isSettingsIntelligence(Context context) {
+        final int callingUid = Binder.getCallingUid();
+        final String callingPackage = context.getPackageManager().getPackagesForUid(callingUid)[0];
+        final boolean isSettingsIntelligence = TextUtils.equals(callingPackage,
+                context.getString(R.string.config_settingsintelligence_package_name));
+        return isSettingsIntelligence;
+    }
 }
diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java
index b76eb38..c3b08d3 100644
--- a/src/com/android/settings/network/telephony/MobileDataSlice.java
+++ b/src/com/android/settings/network/telephony/MobileDataSlice.java
@@ -96,15 +96,18 @@
                 ListBuilder.ICON_IMAGE, title);
         final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
                 null /* actionTitle */, isMobileDataEnabled());
+        final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
+                .setTitle(title)
+                .addEndItem(toggleSliceAction)
+                .setPrimaryAction(primarySliceAction);
+        if (!Utils.isSettingsIntelligence(mContext)) {
+            rowBuilder.setSubtitle(summary);
+        }
 
         final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
                 ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new ListBuilder.RowBuilder()
-                        .setTitle(title)
-                        .setSubtitle(summary)
-                        .addEndItem(toggleSliceAction)
-                        .setPrimaryAction(primarySliceAction));
+                .addRow(rowBuilder);
         return listBuilder.build();
     }
 
diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
index fe1e204..c9a203e 100644
--- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
+++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
@@ -82,15 +82,18 @@
         final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
                 null /* actionTitle */,
                 isZenModeEnabled);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(title)
+                .addEndItem(toggleSliceAction)
+                .setPrimaryAction(primarySliceAction);
+        if (!Utils.isSettingsIntelligence(context)) {
+            rowBuilder.setSubtitle(subtitle);
+        }
 
         return new ListBuilder(context, CustomSliceRegistry.ZEN_MODE_SLICE_URI,
                 ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new RowBuilder()
-                        .setTitle(title)
-                        .setSubtitle(subtitle)
-                        .addEndItem(toggleSliceAction)
-                        .setPrimaryAction(primarySliceAction))
+                .addRow(rowBuilder)
                 .build();
     }
 
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 34c0f1b..2d5b4aa 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -241,16 +241,19 @@
         final SliceAction sliceAction = getToggleAction(context, sliceData,
                 toggleController.isChecked());
         final Set<String> keywords = buildSliceKeywords(sliceData);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(sliceData.getTitle())
+                .setPrimaryAction(
+                        SliceAction.createDeeplink(contentIntent, icon,
+                                ListBuilder.ICON_IMAGE, sliceData.getTitle()))
+                .addEndItem(sliceAction);
+        if (!Utils.isSettingsIntelligence(context)) {
+            rowBuilder.setSubtitle(subtitleText);
+        }
 
         return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new RowBuilder()
-                        .setTitle(sliceData.getTitle())
-                        .setSubtitle(subtitleText)
-                        .setPrimaryAction(
-                                SliceAction.createDeeplink(contentIntent, icon,
-                                        ListBuilder.ICON_IMAGE, sliceData.getTitle()))
-                        .addEndItem(sliceAction))
+                .addRow(rowBuilder)
                 .setKeywords(keywords)
                 .build();
     }
@@ -262,16 +265,19 @@
         final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
         final Set<String> keywords = buildSliceKeywords(sliceData);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(sliceData.getTitle())
+                .setPrimaryAction(
+                        SliceAction.createDeeplink(contentIntent, icon,
+                                ListBuilder.ICON_IMAGE,
+                                sliceData.getTitle()));
+        if (!Utils.isSettingsIntelligence(context)) {
+            rowBuilder.setSubtitle(subtitleText);
+        }
 
         return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new RowBuilder()
-                        .setTitle(sliceData.getTitle())
-                        .setSubtitle(subtitleText)
-                        .setPrimaryAction(
-                                SliceAction.createDeeplink(contentIntent, icon,
-                                        ListBuilder.ICON_IMAGE,
-                                        sliceData.getTitle())))
+                .addRow(rowBuilder)
                 .setKeywords(keywords)
                 .build();
     }
@@ -301,7 +307,6 @@
         }
         final InputRangeBuilder inputRangeBuilder = new InputRangeBuilder()
                 .setTitle(sliceData.getTitle())
-                .setSubtitle(subtitleText)
                 .setPrimaryAction(primaryAction)
                 .setMax(sliderController.getMax())
                 .setMin(sliderController.getMin())
@@ -311,6 +316,9 @@
             inputRangeBuilder.setTitleItem(icon, ListBuilder.ICON_IMAGE);
             color = CustomSliceable.COLOR_NOT_TINTED;
         }
+        if (!Utils.isSettingsIntelligence(context)) {
+            inputRangeBuilder.setSubtitle(subtitleText);
+        }
 
         return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
@@ -330,14 +338,17 @@
         final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
         final Set<String> keywords = buildSliceKeywords(sliceData);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(sliceData.getTitle())
+                .setPrimaryAction(primaryAction)
+                .addEndItem(copyableAction);
+        if (!Utils.isSettingsIntelligence(context)) {
+            rowBuilder.setSubtitle(subtitleText);
+        }
 
         return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new RowBuilder()
-                        .setTitle(sliceData.getTitle())
-                        .setSubtitle(subtitleText)
-                        .setPrimaryAction(primaryAction)
-                        .addEndItem(copyableAction))
+                .addRow(rowBuilder)
                 .setKeywords(keywords)
                 .build();
     }
@@ -418,14 +429,17 @@
         final SliceAction primaryAction = SliceAction.createDeeplink(
                 getContentPendingIntent(context, data),
                 icon, ListBuilder.ICON_IMAGE, title);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(title)
+                .setTitleItem(icon, ListBuilder.ICON_IMAGE)
+                .setPrimaryAction(primaryAction);
+        if (!Utils.isSettingsIntelligence(context)) {
+            rowBuilder.setSubtitle(subtitle);
+        }
 
         return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
-                .addRow(new RowBuilder()
-                        .setTitle(title)
-                        .setTitleItem(icon, ListBuilder.ICON_IMAGE)
-                        .setSubtitle(subtitle)
-                        .setPrimaryAction(primaryAction))
+                .addRow(rowBuilder)
                 .setKeywords(keywords)
                 .build();
     }
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
index 69adf55..958db7e 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
@@ -269,14 +269,17 @@
         // Top row shows information on current preference state
         final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
                 .setAccentColor(Utils.getColorAccentDefaultColor(mContext));
-        listBuilder.setHeader(new ListBuilder.HeaderBuilder()
+        final ListBuilder.HeaderBuilder headerBuilder = new ListBuilder.HeaderBuilder()
                 .setTitle(res.getText(R.string.wifi_calling_mode_title))
-                .setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref, subId))
                 .setPrimaryAction(SliceAction.createDeeplink(
                         getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY),
                         icon,
                         ListBuilder.ICON_IMAGE,
-                        res.getText(R.string.wifi_calling_mode_title))));
+                        res.getText(R.string.wifi_calling_mode_title)));
+        if (!Utils.isSettingsIntelligence(mContext)) {
+            headerBuilder.setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref, subId));
+        }
+        listBuilder.setHeader(headerBuilder);
 
         if (isWifiOnlySupported) {
             listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder,
@@ -458,14 +461,17 @@
     private Slice getNonActionableWifiCallingSlice(CharSequence title, CharSequence subtitle,
             Uri sliceUri, PendingIntent primaryActionIntent) {
         final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
+        final RowBuilder rowBuilder = new RowBuilder()
+                .setTitle(title)
+                .setPrimaryAction(SliceAction.createDeeplink(
+                        primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
+                        title));
+        if (!Utils.isSettingsIntelligence(mContext)) {
+            rowBuilder.setSubtitle(subtitle);
+        }
         return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
                 .setAccentColor(Utils.getColorAccentDefaultColor(mContext))
-                .addRow(new RowBuilder()
-                        .setTitle(title)
-                        .setSubtitle(subtitle)
-                        .setPrimaryAction(SliceAction.createDeeplink(
-                                primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
-                                title)))
+                .addRow(rowBuilder)
                 .build();
     }
 
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index 3d3aff4..2aa8418 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -29,7 +29,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.ActionBar;
-import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -67,6 +66,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowBinder;
 
 import java.net.InetAddress;
 import java.util.ArrayList;
@@ -281,4 +281,22 @@
 
         assertThat(actionBar.getElevation()).isEqualTo(0.f);
     }
+
+    @Test
+    public void isSettingsIntelligence_IsSI_returnTrue() {
+        final String siPackageName = mContext.getString(
+                R.string.config_settingsintelligence_package_name);
+        ShadowBinder.setCallingUid(USER_ID);
+        when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{siPackageName});
+
+        assertThat(Utils.isSettingsIntelligence(mContext)).isTrue();
+    }
+
+    @Test
+    public void isSettingsIntelligence_IsNotSI_returnFalse() {
+        ShadowBinder.setCallingUid(USER_ID);
+        when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{PACKAGE_NAME});
+
+        assertThat(Utils.isSettingsIntelligence(mContext)).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index fc82abb..33bdc61 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -23,7 +23,6 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.settings.SettingsEnums;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
@@ -455,37 +454,6 @@
         assertThat(actualIconResource).isEqualTo(settingsIcon);
     }
 
-    @Test
-    public void buildUnavailableSlice_customizeSubtitle_returnsSliceWithCustomizedSubtitle() {
-        final String subtitleOfUnavailableSlice = "subtitleOfUnavailableSlice";
-        final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
-                SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, 0 /* icon */,
-                subtitleOfUnavailableSlice);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                FakeUnavailablePreferenceController.AVAILABILITY_KEY,
-                BasePreferenceController.DISABLED_DEPENDENT_SETTING);
-
-        final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
-
-        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
-        assertThat(metadata.getSubtitle()).isEqualTo(subtitleOfUnavailableSlice);
-    }
-
-    @Test
-    public void buildUnavailableSlice_notCustomizeSubtitle_returnsSliceWithDefaultSubtitle() {
-        final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
-                SliceData.SliceType.SWITCH);
-        Settings.Global.putInt(mContext.getContentResolver(),
-                FakeUnavailablePreferenceController.AVAILABILITY_KEY,
-                BasePreferenceController.DISABLED_DEPENDENT_SETTING);
-
-        final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
-
-        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
-        assertThat(metadata.getSubtitle()).isEqualTo(
-                mContext.getString(R.string.disabled_dependent_setting_summary));
-    }
-
     private SliceData getDummyData() {
         return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
                 ICON, null /* unavailableSliceSubtitle */);
