diff --git a/res/xml/data_usage_cellular.xml b/res/xml/data_usage_cellular.xml
index b50eaba..fe1a072 100644
--- a/res/xml/data_usage_cellular.xml
+++ b/res/xml/data_usage_cellular.xml
@@ -16,6 +16,7 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:key="data_usage_cellular_screen">
 
     <com.android.settings.datausage.TemplatePreferenceCategory
@@ -24,7 +25,8 @@
 
         <com.android.settings.datausage.CellDataPreference
             android:key="data_usage_enable"
-            android:title="@string/data_usage_enable_mobile" />
+            android:title="@string/data_usage_enable_mobile"
+            settings:searchable="false" />
 
         <com.android.settings.datausage.DataUsagePreference
             android:key="cellular_data_usage"
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index 0a39bfd..2df16f5 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -64,7 +64,7 @@
     public int getAvailabilityStatus(int subId) {
         return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
                 ? AVAILABLE
-                : CONDITIONALLY_UNAVAILABLE;
+                : DISABLED_DEPENDENT_SETTING;
     }
 
     @Override
diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java
index bf9fc04..e497a9e 100644
--- a/src/com/android/settings/network/telephony/MobileDataSlice.java
+++ b/src/com/android/settings/network/telephony/MobileDataSlice.java
@@ -73,11 +73,6 @@
 
     @Override
     public Slice getSlice() {
-        // Mobile data not available, thus return no Slice.
-        if (!isMobileDataAvailable()) {
-            return null;
-        }
-
         final IconCompat icon = IconCompat.createWithResource(mContext,
                 R.drawable.ic_network_cell);
         final String title = mContext.getText(R.string.mobile_data_settings_title).toString();
@@ -85,20 +80,14 @@
 
         // Return a Slice without the mobile data toggle when airplane mode is on.
         if (isAirplaneModeEnabled()) {
-            final CharSequence summary = mContext.getText(R.string.mobile_data_ap_mode_disabled);
-            // Intent does nothing, but we have to pass an intent to the Row.
-            final PendingIntent intent = PendingIntent.getActivity(mContext, 0 /* requestCode */,
-                    new Intent(), 0 /* flags */);
-            final SliceAction deadAction =
-                    SliceAction.create(intent, icon, ListBuilder.ICON_IMAGE, title);
-            final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
-                    ListBuilder.INFINITY)
-                    .setAccentColor(color)
-                    .addRow(new ListBuilder.RowBuilder()
-                            .setTitle(title)
-                            .setSubtitle(summary)
-                            .setPrimaryAction(deadAction));
-            return listBuilder.build();
+            return buildUnavailableMobileDataSlice(title,
+                    mContext.getText(R.string.mobile_data_ap_mode_disabled), icon, color);
+        }
+
+        // Return a Slice without the mobile data toggle when mobile data disabled.
+        if (!isMobileDataAvailable()) {
+            return buildUnavailableMobileDataSlice(title,
+                    mContext.getText(R.string.sim_cellular_data_unavailable), icon, color);
         }
 
         final CharSequence summary = getSummary();
@@ -128,7 +117,7 @@
     @Override
     public void onNotifyChange(Intent intent) {
         final boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
-                    isMobileDataEnabled());
+                isMobileDataEnabled());
 
         final int defaultSubId = getDefaultSubscriptionId(mSubscriptionManager);
         if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
@@ -212,6 +201,22 @@
         return mTelephonyManager.isDataEnabled();
     }
 
+    private Slice buildUnavailableMobileDataSlice(String title, CharSequence summary,
+            IconCompat icon, int color) {
+        final PendingIntent intent = PendingIntent.getActivity(mContext, 0 /* requestCode */,
+                new Intent(), 0 /* flags */);
+        final SliceAction deadAction =
+                SliceAction.create(intent, icon, ListBuilder.ICON_IMAGE, title);
+        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
+                ListBuilder.INFINITY)
+                .setAccentColor(color)
+                .addRow(new ListBuilder.RowBuilder()
+                        .setTitle(title)
+                        .setSubtitle(summary)
+                        .setPrimaryAction(deadAction));
+        return listBuilder.build();
+    }
+
     /**
      * Listener for mobile data state changes.
      *
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
index e853c47..30b5408 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
@@ -16,7 +16,7 @@
 
 package com.android.settings.network.telephony;
 
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -86,10 +86,10 @@
     }
 
     @Test
-    public void getAvailabilityStatus_invalidSubscription_returnUnavailable() {
+    public void getAvailabilityStatus_invalidSubscription_returnDisabledDependentSetting() {
         mController.init(mFragmentManager, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
 
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java
index e59fbaf..ae6f568 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java
@@ -170,21 +170,47 @@
     }
 
     @Test
-    public void isMobileDataAvailable_noSubscriptions_returnsNull() {
+    public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() {
         doReturn(new ArrayList<>()).when(mSubscriptionManager).getSelectableSubscriptionInfoList();
+        final Slice mobileData = mMobileDataSlice.getSlice();
 
-        final Slice slice = mMobileDataSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mobileData);
+        assertThat(metadata.getTitle())
+                .isEqualTo(mContext.getString(R.string.mobile_data_settings_title));
 
-        assertThat(slice).isNull();
+        assertThat(metadata.getSubtitle())
+                .isEqualTo(mContext.getString(R.string.sim_cellular_data_unavailable));
+
+        final List<SliceAction> toggles = metadata.getToggles();
+        assertThat(toggles).hasSize(0);
+
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        final PendingIntent pendingIntent = primaryAction.getAction();
+        final Intent actionIntent = pendingIntent.getIntent();
+
+        assertThat(actionIntent).isNull();
     }
 
     @Test
-    public void isMobileDataAvailable_nullSubscriptions_returnsNull() {
+    public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() {
         doReturn(null).when(mSubscriptionManager).getSelectableSubscriptionInfoList();
+        final Slice mobileData = mMobileDataSlice.getSlice();
 
-        final Slice slice = mMobileDataSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mobileData);
+        assertThat(metadata.getTitle())
+                .isEqualTo(mContext.getString(R.string.mobile_data_settings_title));
 
-        assertThat(slice).isNull();
+        assertThat(metadata.getSubtitle())
+                .isEqualTo(mContext.getString(R.string.sim_cellular_data_unavailable));
+
+        final List<SliceAction> toggles = metadata.getToggles();
+        assertThat(toggles).hasSize(0);
+
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        final PendingIntent pendingIntent = primaryAction.getAction();
+        final Intent actionIntent = pendingIntent.getIntent();
+
+        assertThat(actionIntent).isNull();
     }
 
     @Test
