diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3b9e712..deb1cb3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5953,14 +5953,20 @@
     <string name="notification_importance_default">Normal: Silently show these notifications</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: high importance level description -->
-    <string name="notification_importance_high">High: Show at the top of the notifications list and make sound</string>
+    <string name="notification_importance_high">High: Show at the top of the notifications list and allow sound</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: max importance level description -->
-    <string name="notification_importance_max">Urgent: Peek onto the screen and make sound</string>
+    <string name="notification_importance_max">Urgent: Peek onto the screen and allow sound</string>
 
     <!-- [CHAR LIMIT=60] Notification importance reset button -->
     <string name="importance_reset">Reset</string>
 
+    <!-- [CHAR LIMIT=40] Notification importance title -->
+    <string name="show_silently">Show silently</string>
+
+    <!-- [CHAR LIMIT=180] Notification importance summary -->
+    <string name="show_silently_summary">Don\'t make sound, vibrate, or peek these notifications into view on the current screen.</string>
+
     <!-- Default Apps > Default notification assistant -->
     <string name="default_notification_assistant">Notification assistant</string>
 
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index 1a2584a..37c4426 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -19,31 +19,44 @@
         android:key="app_notification_settings">
 
     <!-- Importance -->
+    <!-- Block -->
+    <com.android.settingslib.RestrictedSwitchPreference
+            android:key="block"
+            android:title="@string/app_notification_block_title"
+            android:summary="@string/app_notification_block_summary"
+            android:order="2" />
+    <!-- Silent -->
+    <com.android.settingslib.RestrictedSwitchPreference
+            android:key="silent"
+            android:title="@string/show_silently"
+            android:summary="@string/show_silently_summary"
+            android:order="3" />
+    <!-- Slider -->
     <com.android.settingslib.RestrictedPreference
             android:key="importance_title"
             android:title="@string/notification_importance_title"
-            android:order="2" />
+            android:order="4"/>
     <com.android.settings.notification.ImportanceSeekBarPreference
             android:key="importance"
-            android:order="3"/>
+            android:order="5"/>
 
     <com.android.settings.applications.LayoutPreference
             android:key="importance_reset_button"
             android:layout="@layout/two_buttons_panel"
-            android:order="4" />
+            android:order="6" />
 
     <!-- Sensitive -->
     <com.android.settingslib.RestrictedSwitchPreference
             android:key="sensitive"
             android:title="@string/app_notification_sensitive_title"
             android:summary="@string/app_notification_sensitive_summary"
-            android:order="5" />
+            android:order="7" />
 
     <!-- Bypass DND -->
     <com.android.settingslib.RestrictedSwitchPreference
             android:key="bypass_dnd"
             android:title="@string/app_notification_override_dnd_title"
             android:summary="@string/app_notification_override_dnd_summary"
-            android:order="6" />
+            android:order="8" />
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 8f30f59..f04cf2f 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -26,23 +26,15 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService.Ranking;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.Preference.OnPreferenceClickListener;
-import android.support.v7.preference.PreferenceCategory;
 import android.util.ArrayMap;
 import android.util.Log;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.AppHeader;
 import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.applications.AppInfoBase;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.notification.NotificationBackend.AppRow;
-import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedSwitchPreference;
 import com.android.settingslib.RestrictedPreference;
 
@@ -86,6 +78,8 @@
                 (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BYPASS_DND);
         mSensitive =
                 (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SENSITIVE);
+        mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
+        mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT);
 
         mAppRow = mBackend.loadAppRow(mPm, mPkgInfo);
 
@@ -98,7 +92,7 @@
         rows.put(mAppRow.pkg, mAppRow);
         collectConfigActivities(rows);
 
-        setupImportancePrefs(mAppRow.systemApp, mAppRow.appImportance);
+        setupImportancePrefs(mAppRow.systemApp, mAppRow.appImportance, mAppRow.banned);
         setupPriorityPref(mAppRow.appBypassDnd);
         setupSensitivePref(mAppRow.appSensitive);
         updateDependents(mAppRow.appImportance);
@@ -111,9 +105,13 @@
         final boolean lockscreenNotificationsEnabled = getLockscreenNotificationsEnabled();
         final boolean allowPrivate = getLockscreenAllowPrivateNotifications();
 
-        setVisible(mPriority, checkCanBeVisible(Ranking.IMPORTANCE_DEFAULT, importance)
+        if (getPreferenceScreen().findPreference(mBlock.getKey()) != null) {
+            setVisible(mSilent, checkCanBeVisible(Ranking.IMPORTANCE_LOW, importance));
+            mSilent.setChecked(importance == Ranking.IMPORTANCE_DEFAULT);
+        }
+        setVisible(mPriority, checkCanBeVisible(Ranking.IMPORTANCE_LOW, importance)
                 && !mDndVisualEffectsSuppressed);
-        setVisible(mSensitive, checkCanBeVisible(Ranking.IMPORTANCE_LOW, importance)
+        setVisible(mSensitive, checkCanBeVisible(Ranking.IMPORTANCE_HIGH, importance)
                 && lockscreenSecure && lockscreenNotificationsEnabled && allowPrivate);
     }
 
@@ -121,7 +119,7 @@
         if (importance == Ranking.IMPORTANCE_UNSPECIFIED) {
             return true;
         }
-        return importance > minImportanceVisible;
+        return importance >= minImportanceVisible;
     }
 
     private boolean getLockscreenNotificationsEnabled() {
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index a58edf7..895d38d 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -46,12 +46,15 @@
 abstract public class NotificationSettingsBase extends SettingsPreferenceFragment {
     private static final String TAG = "NotifiSettingsBase";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final String TUNER_SETTING = "show_importance_slider";
 
     protected static final String KEY_BYPASS_DND = "bypass_dnd";
     protected static final String KEY_SENSITIVE = "sensitive";
     protected static final String KEY_IMPORTANCE = "importance";
     protected static final String KEY_IMPORTANCE_TITLE = "importance_title";
     protected static final String KEY_IMPORTANCE_RESET = "importance_reset_button";
+    protected static final String KEY_BLOCK = "block";
+    protected static final String KEY_SILENT = "silent";
 
     protected PackageManager mPm;
     protected final NotificationBackend mBackend = new NotificationBackend();
@@ -66,7 +69,10 @@
     protected LayoutPreference mImportanceReset;
     protected RestrictedSwitchPreference mPriority;
     protected RestrictedSwitchPreference mSensitive;
+    protected RestrictedSwitchPreference mBlock;
+    protected RestrictedSwitchPreference mSilent;
     protected EnforcedAdmin mSuspendedAppsAdmin;
+    protected boolean mShowSlider = false;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
@@ -119,6 +125,7 @@
 
         mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
                 mContext, mPkg, mUserId);
+        mShowSlider = Settings.Secure.getInt(getContentResolver(), TUNER_SETTING, 0) == 1;
     }
 
     @Override
@@ -143,54 +150,94 @@
         if (mImportanceTitle != null) {
             mImportanceTitle.setDisabledByAdmin(mSuspendedAppsAdmin);
         }
+        if (mBlock != null) {
+            mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        }
+        if (mSilent != null) {
+            mSilent.setDisabledByAdmin(mSuspendedAppsAdmin);
+        }
     }
 
-    protected void setupImportancePrefs(boolean isSystemApp, int importance) {
-        mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
-        mImportanceTitle.setDisabledByAdmin(mSuspendedAppsAdmin);
-        if (importance == Ranking.IMPORTANCE_UNSPECIFIED) {
-            mImportance.setVisible(false);
-            mImportanceReset.setVisible(false);
-            mImportanceTitle.setOnPreferenceClickListener(showEditableImportance);
-        } else {
-            mImportanceTitle.setOnPreferenceClickListener(null);
-        }
-
-        mImportanceTitle.setSummary(getProgressSummary(importance));
-        mImportance.setSystemApp(isSystemApp);
-        mImportance.setMinimumProgress(
-                isSystemApp ? Ranking.IMPORTANCE_LOW : Ranking.IMPORTANCE_NONE);
-        mImportance.setMax(Ranking.IMPORTANCE_MAX);
-        mImportance.setProgress(importance);
-        mImportance.setCallback(new ImportanceSeekBarPreference.Callback() {
-            @Override
-            public void onImportanceChanged(int progress) {
-                mBackend.setImportance(mPkg, mUid, progress);
-                mImportanceTitle.setSummary(getProgressSummary(progress));
-                updateDependents(progress);
-            }
-        });
-
-        Button button = (Button) mImportanceReset.findViewById(R.id.left_button);
-        button.setText(R.string.importance_reset);
-        button.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mSuspendedAppsAdmin != null) {
-                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
-                            getActivity(), mSuspendedAppsAdmin);
-                    return;
-                }
-
-                mBackend.setImportance(mPkg, mUid, Ranking.IMPORTANCE_UNSPECIFIED);
-                mImportanceReset.setVisible(false);
+    protected void setupImportancePrefs(boolean isSystemApp, int importance, boolean banned) {
+        if (mShowSlider) {
+            setVisible(mBlock, false);
+            setVisible(mSilent, false);
+            mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
+            mImportanceTitle.setDisabledByAdmin(mSuspendedAppsAdmin);
+            if (importance == Ranking.IMPORTANCE_UNSPECIFIED) {
                 mImportance.setVisible(false);
+                mImportanceReset.setVisible(false);
                 mImportanceTitle.setOnPreferenceClickListener(showEditableImportance);
-                mImportanceTitle.setSummary(getProgressSummary(Ranking.IMPORTANCE_UNSPECIFIED));
-                updateDependents(Ranking.IMPORTANCE_UNSPECIFIED);
+            } else {
+                mImportanceTitle.setOnPreferenceClickListener(null);
             }
-        });
-        mImportanceReset.findViewById(R.id.right_button).setVisibility(View.INVISIBLE);
+
+            mImportanceTitle.setSummary(getProgressSummary(importance));
+            mImportance.setSystemApp(isSystemApp);
+            mImportance.setMinimumProgress(
+                    isSystemApp ? Ranking.IMPORTANCE_LOW : Ranking.IMPORTANCE_NONE);
+            mImportance.setMax(Ranking.IMPORTANCE_MAX);
+            mImportance.setProgress(importance);
+            mImportance.setCallback(new ImportanceSeekBarPreference.Callback() {
+                @Override
+                public void onImportanceChanged(int progress) {
+                    mBackend.setImportance(mPkg, mUid, progress);
+                    mImportanceTitle.setSummary(getProgressSummary(progress));
+                    updateDependents(progress);
+                }
+            });
+
+            Button button = (Button) mImportanceReset.findViewById(R.id.left_button);
+            button.setText(R.string.importance_reset);
+            button.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (mSuspendedAppsAdmin != null) {
+                        RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
+                                getActivity(), mSuspendedAppsAdmin);
+                        return;
+                    }
+
+                    mBackend.setImportance(mPkg, mUid, Ranking.IMPORTANCE_UNSPECIFIED);
+                    mImportanceReset.setVisible(false);
+                    mImportance.setVisible(false);
+                    mImportanceTitle.setOnPreferenceClickListener(showEditableImportance);
+                    mImportanceTitle.setSummary(getProgressSummary(Ranking.IMPORTANCE_UNSPECIFIED));
+                    updateDependents(Ranking.IMPORTANCE_UNSPECIFIED);
+                }
+            });
+            mImportanceReset.findViewById(R.id.right_button).setVisibility(View.INVISIBLE);
+        } else {
+            setVisible(mImportance, false);
+            setVisible(mImportanceReset, false);
+            setVisible(mImportanceTitle, false);
+            boolean blocked = importance == Ranking.IMPORTANCE_NONE || banned;
+            mBlock.setChecked(blocked);
+            mBlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    final boolean blocked = (Boolean) newValue;
+                    final int importance =
+                            blocked ? Ranking.IMPORTANCE_NONE :Ranking.IMPORTANCE_UNSPECIFIED;
+                    mBackend.setImportance(mPkgInfo.packageName, mUid, importance);
+                    updateDependents(importance);
+                    return true;
+                }
+            });
+
+            mSilent.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    final boolean silenced = (Boolean) newValue;
+                    final int importance =
+                            silenced ? Ranking.IMPORTANCE_DEFAULT : Ranking.IMPORTANCE_UNSPECIFIED;
+                    mBackend.setImportance(mPkgInfo.packageName, mUid, importance);
+                    updateDependents(importance);
+                    return true;
+                }
+            });
+            updateDependents(banned ? Ranking.IMPORTANCE_NONE : importance);
+        }
     }
 
     private String getProgressSummary(int progress) {
