diff --git a/res/values/strings.xml b/res/values/strings.xml
index 14670a7..dbe61b9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5815,22 +5815,28 @@
     <string name="loading_notification_apps">Loading apps...</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Block option title -->
-    <string name="app_notification_block_title">Block</string>
+    <string name="app_notification_block_title">Block all</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Block option description-->
     <string name="app_notification_block_summary">Never show notifications from this app</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Priority option title -->
-    <string name="app_notification_priority_title">Priority</string>
+    <string name="app_notification_priority_title">Treat as priority</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Priority option description-->
-    <string name="app_notification_priority_summary">Show notifications at the top of the list and keep them coming when the device is set to priority interruptions only</string>
+    <string name="app_notification_priority_summary">Let this app\'s notifications be heard when Do not disturb is set to Priority only</string>
+
+    <!-- [CHAR LIMIT=NONE] App notification settings: Peekable option title -->
+    <string name="app_notification_peekable_title">Allow peeking</string>
+
+    <!-- [CHAR LIMIT=NONE] App notification settings: Peekable option description-->
+    <string name="app_notification_peekable_summary">Let this app emphasize certain notifications by sliding them briefly into view on the current screen</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Sensitive option title -->
-    <string name="app_notification_sensitive_title">Sensitive</string>
+    <string name="app_notification_sensitive_title">Hide sensitive content</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Sensitive option description-->
-    <string name="app_notification_sensitive_summary">When the device is locked, hide any sensitive content from this app\'s notifications</string>
+    <string name="app_notification_sensitive_summary">When the device is locked, hide content in this app\'s notifications that might reveal private information</string>
 
     <!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when banned -->
     <string name="app_notification_row_banned">Blocked</string>
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index a65b98d..9aebb39 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -23,7 +23,7 @@
             android:key="block"
             android:title="@string/app_notification_block_title"
             android:summary="@string/app_notification_block_summary"
-            android:disableDependentsState="true"
+            android:order="1"
             android:persistent="false" />
 
     <!-- Priority -->
@@ -31,7 +31,15 @@
             android:key="priority"
             android:title="@string/app_notification_priority_title"
             android:summary="@string/app_notification_priority_summary"
-            android:dependency="block"
+            android:order="2"
+            android:persistent="false" />
+
+    <!-- Peekable -->
+    <SwitchPreference
+            android:key="peekable"
+            android:title="@string/app_notification_peekable_title"
+            android:summary="@string/app_notification_peekable_summary"
+            android:order="3"
             android:persistent="false" />
 
     <!-- Sensitive -->
@@ -39,6 +47,7 @@
             android:key="sensitive"
             android:title="@string/app_notification_sensitive_title"
             android:summary="@string/app_notification_sensitive_summary"
+            android:order="4"
             android:persistent="false" />
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index bad43cc..c0fe802 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -46,6 +46,7 @@
 
     private static final String KEY_BLOCK = "block";
     private static final String KEY_PRIORITY = "priority";
+    private static final String KEY_PEEKABLE = "peekable";
     private static final String KEY_SENSITIVE = "sensitive";
 
     static final String EXTRA_HAS_SETTINGS_INTENT = "has_settings_intent";
@@ -56,9 +57,11 @@
     private Context mContext;
     private SwitchPreference mBlock;
     private SwitchPreference mPriority;
+    private SwitchPreference mPeekable;
     private SwitchPreference mSensitive;
     private AppRow mAppRow;
     private boolean mCreated;
+    private boolean mIsSystemPackage;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
@@ -104,19 +107,14 @@
             toastAndFinish();
             return;
         }
+        mIsSystemPackage = Utils.isSystemPackage(pm, info);
 
         addPreferencesFromResource(R.xml.app_notification_settings);
         mBlock = (SwitchPreference) findPreference(KEY_BLOCK);
         mPriority = (SwitchPreference) findPreference(KEY_PRIORITY);
+        mPeekable = (SwitchPreference) findPreference(KEY_PEEKABLE);
         mSensitive = (SwitchPreference) findPreference(KEY_SENSITIVE);
 
-        final boolean secure = new LockPatternUtils(getActivity()).isSecure();
-        final boolean enabled = getLockscreenNotificationsEnabled();
-        final boolean allowPrivate = getLockscreenAllowPrivateNotifications();
-        if (!secure || !enabled || !allowPrivate) {
-            getPreferenceScreen().removePreference(mSensitive);
-        }
-
         mAppRow = NotificationAppList.loadAppRow(pm, info.applicationInfo, mBackend);
         if (intent.hasExtra(EXTRA_HAS_SETTINGS_INTENT)) {
             // use settings intent from extra
@@ -131,16 +129,20 @@
         }
 
         mBlock.setChecked(mAppRow.banned);
+        updateDependents(mAppRow.banned);
         mPriority.setChecked(mAppRow.priority);
-        if (mSensitive != null) {
-            mSensitive.setChecked(mAppRow.sensitive);
-        }
+        mPeekable.setChecked(mAppRow.peekable);
+        mSensitive.setChecked(mAppRow.sensitive);
 
         mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
-                final boolean block = (Boolean) newValue;
-                return mBackend.setNotificationsBanned(pkg, uid, block);
+                final boolean banned = (Boolean) newValue;
+                final boolean success =  mBackend.setNotificationsBanned(pkg, uid, banned);
+                if (success) {
+                    updateDependents(banned);
+                }
+                return success;
             }
         });
 
@@ -152,20 +154,42 @@
             }
         });
 
-        if (mSensitive != null) {
-            mSensitive.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    final boolean sensitive = (Boolean) newValue;
-                    return mBackend.setSensitive(pkg, uid, sensitive);
-                }
-            });
-        }
+        mPeekable.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean peekable = (Boolean) newValue;
+                return mBackend.setPeekable(pkg, uid, peekable);
+            }
+        });
 
-        // Users cannot block notifications from system/signature packages
-        if (Utils.isSystemPackage(pm, info)) {
-            getPreferenceScreen().removePreference(mBlock);
-            mPriority.setDependency(null); // don't have it depend on a preference that's gone
+        mSensitive.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean sensitive = (Boolean) newValue;
+                return mBackend.setSensitive(pkg, uid, sensitive);
+            }
+        });
+    }
+
+    private void updateDependents(boolean banned) {
+        final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure();
+        final boolean lockscreenNotificationsEnabled = getLockscreenNotificationsEnabled();
+        final boolean allowPrivate = getLockscreenAllowPrivateNotifications();
+
+        setVisible(mBlock, !mIsSystemPackage);
+        setVisible(mPriority, mIsSystemPackage || !banned);
+        setVisible(mPeekable, mIsSystemPackage || !banned);
+        setVisible(mSensitive, mIsSystemPackage || !banned && lockscreenSecure
+                && lockscreenNotificationsEnabled && allowPrivate);
+    }
+
+    private void setVisible(Preference p, boolean visible) {
+        final boolean isVisible = getPreferenceScreen().findPreference(p.getKey()) != null;
+        if (isVisible == visible) return;
+        if (visible) {
+            getPreferenceScreen().addPreference(p);
+        } else {
+            getPreferenceScreen().removePreference(p);
         }
     }
 
diff --git a/src/com/android/settings/notification/NotificationAppList.java b/src/com/android/settings/notification/NotificationAppList.java
index 311ec59..27eb914 100644
--- a/src/com/android/settings/notification/NotificationAppList.java
+++ b/src/com/android/settings/notification/NotificationAppList.java
@@ -364,6 +364,7 @@
         public Intent settingsIntent;
         public boolean banned;
         public boolean priority;
+        public boolean peekable;
         public boolean sensitive;
         public boolean first;  // first app in section
     }
@@ -391,6 +392,7 @@
         row.icon = app.loadIcon(pm);
         row.banned = backend.getNotificationsBanned(row.pkg, row.uid);
         row.priority = backend.getHighPriority(row.pkg, row.uid);
+        row.peekable = backend.getPeekable(row.pkg, row.uid);
         row.sensitive = backend.getSensitive(row.pkg, row.uid);
         return row;
     }
@@ -578,6 +580,25 @@
             }
         }
 
+        public boolean getPeekable(String pkg, int uid) {
+            try {
+                return sINM.getPackagePeekable(pkg, uid);
+            } catch (Exception e) {
+                Log.w(TAG, "Error calling NoMan", e);
+                return false;
+            }
+        }
+
+        public boolean setPeekable(String pkg, int uid, boolean peekable) {
+            try {
+                sINM.setPackagePeekable(pkg, uid, peekable);
+                return true;
+            } catch (Exception e) {
+               Log.w(TAG, "Error calling NoMan", e);
+               return false;
+            }
+        }
+
         public boolean getSensitive(String pkg, int uid) {
             try {
                 return sINM.getPackageVisibilityOverride(pkg, uid) == Notification.VISIBILITY_PRIVATE;
