diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8518df9..5fd3dc8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7410,7 +7410,7 @@
     <!-- Do not disturb settings, messages, events and reminders title [CHAR LIMIT=100]-->
     <string name="zen_msg_event_reminder_title">Messages, events &amp; reminders</string>
     <!-- Do not disturb settings, messages, events and reminders footer [CHAR LIMIT=NONE]-->
-    <string name="zen_msg_event_reminder_footer">When Do Not Disturb is on, messages, reminders, and events will muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you.</string>
+    <string name="zen_msg_event_reminder_footer">When Do Not Disturb is on, messages, reminders, and events will be muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you.</string>
 
     <!-- Do not disturb onboarding dialog, accept new settings [CHAR LIMIT=30]-->
     <string name="zen_onboarding_ok">Done</string>
@@ -7975,9 +7975,15 @@
     <!-- [CHAR LIMIT=50] Zen mode settings: All messages summary -->
     <string name="zen_mode_all_messages">Messages</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Messages option (ie: text messages) -->
+    <string name="zen_mode_all_messages_list">messages</string>
+
     <!-- [CHAR LIMIT=50] Zen mode settings: Selected messages summary -->
     <string name="zen_mode_selected_messages">Some messages</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Selected messages (ie: some text messages are allowed to bypass dnd) -->
+    <string name="zen_mode_selected_messages_list">some messages</string>
+
     <!-- [CHAR LIMIT=40] Zen mode settings: Calls or messages option value: From anyone -->
     <string name="zen_mode_from_anyone">From anyone</string>
 
@@ -8002,21 +8008,36 @@
     <!-- [CHAR LIMIT=50] Zen mode settings: Alarms option -->
     <string name="zen_mode_alarms">Alarms</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Alarms option (ie: sound from alarm clock) -->
+    <string name="zen_mode_alarms_list">alarms</string>
+
     <!-- [CHAR LIMIT=50] Zen mode settings: Media option -->
     <string name="zen_mode_media">Media</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Media (ie: sound from video) -->
+    <string name="zen_mode_media_list">media</string>
+
     <!-- [CHAR LIMIT=50] Zen mode settings: System option which includes sounds such as touch sounds -->
     <string name="zen_mode_system">Touch sounds</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: System sounds (ie: touch sounds) -->
+    <string name="zen_mode_system_list">touch sounds</string>
+
     <!-- [CHAR LIMIT=50] Zen mode settings: Reminders option -->
     <string name="zen_mode_reminders">Reminders</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Reminders (ie: calendar reminders are allowed to bypass dnd) -->
+    <string name="zen_mode_reminders_list">reminders</string>
+
     <!-- [CHAR LIMIT=70] Zen mode settings: Allow reminders toggle title -->
     <string name="zen_mode_reminders_title">Allow reminders</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: Events option -->
     <string name="zen_mode_events">Events</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Events (ie: calendar events) -->
+    <string name="zen_mode_events_list">events</string>
+
     <!-- [CHAR LIMIT=70] Zen mode settings: Allow events toggle title -->
     <string name="zen_mode_events_title">Allow events</string>
 
@@ -8032,6 +8053,9 @@
     <!-- [CHAR LIMIT=50] Zen mode settings: Repeat callers option -->
     <string name="zen_mode_repeat_callers">Repeat callers</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: Repeat callers (ie: repeat callers are allowed to bypass dnd) -->
+    <string name="zen_mode_repeat_callers_list">repeat callers</string>
+
     <!-- [CHAR LIMIT=70] Zen mode settings: Allow repeat callers toggle title -->
     <string name="zen_mode_repeat_callers_title">Allow repeat callers</string>
 
diff --git a/src/com/android/settings/notification/NotificationPreferenceController.java b/src/com/android/settings/notification/NotificationPreferenceController.java
index 49bb08e..1ce42c2 100644
--- a/src/com/android/settings/notification/NotificationPreferenceController.java
+++ b/src/com/android/settings/notification/NotificationPreferenceController.java
@@ -138,11 +138,11 @@
 
     protected boolean isChannelBlockable() {
         if (mChannel != null && mAppRow != null) {
-            if (!mAppRow.systemApp) {
-                return true;
+            if (!isChannelConfigurable()) {
+                return mChannel.getImportance() == IMPORTANCE_NONE;
             }
 
-            return mChannel.isBlockableSystem()
+            return mChannel.isBlockableSystem() || !mAppRow.systemApp
                     || mChannel.getImportance() == IMPORTANCE_NONE;
         }
         return false;
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 240ab68..e05dabe 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -119,22 +119,22 @@
             List<String> enabledCategories = getEnabledCategories(policy,
                     category -> PRIORITY_CATEGORY_ALARMS == category
                             || PRIORITY_CATEGORY_MEDIA == category
-                            || PRIORITY_CATEGORY_SYSTEM == category);
+                            || PRIORITY_CATEGORY_SYSTEM == category, false);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
                 return mContext.getString(R.string.zen_sound_all_muted);
             } else if (numCategories == 1) {
                 return mContext.getString(R.string.zen_sound_one_allowed,
-                        enabledCategories.get(0).toLowerCase());
+                        enabledCategories.get(0));
             } else if (numCategories == 2) {
                 return mContext.getString(R.string.zen_sound_two_allowed,
-                        enabledCategories.get(0).toLowerCase(),
-                        enabledCategories.get(1).toLowerCase());
+                        enabledCategories.get(0),
+                        enabledCategories.get(1));
             } else if (numCategories == 3) {
                 return mContext.getString(R.string.zen_sound_three_allowed,
-                        enabledCategories.get(0).toLowerCase(),
-                        enabledCategories.get(1).toLowerCase(),
-                        enabledCategories.get(2).toLowerCase());
+                        enabledCategories.get(0),
+                        enabledCategories.get(1),
+                        enabledCategories.get(2));
             } else {
                 return mContext.getString(R.string.zen_sound_none_muted);
             }
@@ -143,17 +143,17 @@
         String getCallsSettingSummary(Policy policy) {
             List<String> enabledCategories = getEnabledCategories(policy,
                     category -> PRIORITY_CATEGORY_CALLS == category
-                            || PRIORITY_CATEGORY_REPEAT_CALLERS == category);
+                            || PRIORITY_CATEGORY_REPEAT_CALLERS == category, false);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
                 return mContext.getString(R.string.zen_mode_no_exceptions);
             } else if (numCategories == 1) {
                 return mContext.getString(R.string.zen_mode_calls_summary_one,
-                        enabledCategories.get(0).toLowerCase());
+                        enabledCategories.get(0));
             } else {
                 return mContext.getString(R.string.zen_mode_calls_summary_two,
-                        enabledCategories.get(0).toLowerCase(),
-                        enabledCategories.get(1).toLowerCase());
+                        enabledCategories.get(0),
+                        enabledCategories.get(1));
             }
         }
 
@@ -161,7 +161,7 @@
             List<String> enabledCategories = getEnabledCategories(policy,
                     category -> PRIORITY_CATEGORY_EVENTS == category
                             || PRIORITY_CATEGORY_REMINDERS == category
-                            || PRIORITY_CATEGORY_MESSAGES == category);
+                            || PRIORITY_CATEGORY_MESSAGES == category, true);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
                 return mContext.getString(R.string.zen_mode_no_exceptions);
@@ -169,19 +169,19 @@
                 return enabledCategories.get(0);
             } else if (numCategories == 2) {
                 return mContext.getString(R.string.join_two_items, enabledCategories.get(0),
-                        enabledCategories.get(1).toLowerCase());
+                        enabledCategories.get(1));
             } else if (numCategories == 3){
                 final List<String> summaries = new ArrayList<>();
                 summaries.add(enabledCategories.get(0));
-                summaries.add(enabledCategories.get(1).toLowerCase());
-                summaries.add(enabledCategories.get(2).toLowerCase());
+                summaries.add(enabledCategories.get(1));
+                summaries.add(enabledCategories.get(2));
 
                 return ListFormatter.getInstance().format(summaries);
             } else {
                 final List<String> summaries = new ArrayList<>();
                 summaries.add(enabledCategories.get(0));
-                summaries.add(enabledCategories.get(1).toLowerCase());
-                summaries.add(enabledCategories.get(2).toLowerCase());
+                summaries.add(enabledCategories.get(1));
+                summaries.add(enabledCategories.get(2));
                 summaries.add(mContext.getString(R.string.zen_mode_other_options));
 
                 return ListFormatter.getInstance().format(summaries);
@@ -251,48 +251,18 @@
         }
 
         private List<String> getEnabledCategories(Policy policy,
-                Predicate<Integer> filteredCategories) {
+                Predicate<Integer> filteredCategories, boolean capitalizeFirstInList) {
             List<String> enabledCategories = new ArrayList<>();
             for (int category : ALL_PRIORITY_CATEGORIES) {
+                boolean isFirst = capitalizeFirstInList && enabledCategories.isEmpty();
                 if (filteredCategories.test(category) && isCategoryEnabled(policy, category)) {
-                    if (category == PRIORITY_CATEGORY_ALARMS) {
-                        enabledCategories.add(mContext.getString(R.string.zen_mode_alarms));
-                    } else if (category == PRIORITY_CATEGORY_MEDIA) {
-                        enabledCategories.add(mContext.getString(
-                                R.string.zen_mode_media));
-                    } else if (category == PRIORITY_CATEGORY_SYSTEM) {
-                        enabledCategories.add(mContext.getString(
-                                R.string.zen_mode_system));
-                    } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) {
-                        if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_all_messages));
-                        } else {
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_selected_messages));
-                        }
-                    } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) {
-                        enabledCategories.add(mContext.getString(R.string.zen_mode_events));
-                    } else if (category == Policy.PRIORITY_CATEGORY_REMINDERS) {
-                        enabledCategories.add(mContext.getString(R.string.zen_mode_reminders));
-                    } else if (category == Policy.PRIORITY_CATEGORY_CALLS) {
-                        if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_all_callers));
-                        } else if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_CONTACTS){
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_contacts_callers));
-                        } else {
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_starred_callers));
-                        }
-                    } else if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) {
-                        if (!enabledCategories.contains(mContext.getString(
-                                R.string.zen_mode_all_callers))) {
-                            enabledCategories.add(mContext.getString(
-                                    R.string.zen_mode_repeat_callers));
-                        }
+                    if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS
+                            && isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_CALLS)
+                            && policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
+                        continue;
                     }
+
+                    enabledCategories.add(getCategory(category, policy, isFirst));
                 }
             }
             return enabledCategories;
@@ -301,6 +271,70 @@
         private boolean isCategoryEnabled(Policy policy, int categoryType) {
             return (policy.priorityCategories & categoryType) != 0;
         }
+
+        private String getCategory(int category, Policy policy, boolean isFirst) {
+            if (category == PRIORITY_CATEGORY_ALARMS) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_alarms);
+                } else {
+                    return mContext.getString(R.string.zen_mode_alarms_list);
+                }
+            } else if (category == PRIORITY_CATEGORY_MEDIA) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_media);
+                } else {
+                    return mContext.getString(R.string.zen_mode_media_list);
+                }
+            } else if (category == PRIORITY_CATEGORY_SYSTEM) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_system);
+                } else {
+                    return mContext.getString(R.string.zen_mode_system_list);
+                }
+            } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) {
+                if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
+                    if (isFirst) {
+                        return mContext.getString(R.string.zen_mode_all_messages);
+                    } else {
+                        return mContext.getString(R.string.zen_mode_all_messages_list);
+                    }
+                } else {
+                    if (isFirst) {
+                        return mContext.getString(R.string.zen_mode_selected_messages);
+                    } else {
+                        return mContext.getString(R.string.zen_mode_selected_messages_list);
+                    }
+                }
+            } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_events);
+                } else {
+                    return mContext.getString(R.string.zen_mode_events_list);
+                }
+            } else if (category == Policy.PRIORITY_CATEGORY_REMINDERS) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_reminders);
+                } else {
+                    return mContext.getString(R.string.zen_mode_reminders_list);
+                }
+            } else if (category == Policy.PRIORITY_CATEGORY_CALLS) {
+                if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
+                    return mContext.getString(R.string.zen_mode_all_callers);
+                } else if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_CONTACTS){
+                    return mContext.getString(R.string.zen_mode_contacts_callers);
+                } else {
+                    return mContext.getString(R.string.zen_mode_starred_callers);
+                }
+            } else if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) {
+                if (isFirst) {
+                    return mContext.getString(R.string.zen_mode_repeat_callers);
+                } else {
+                    return mContext.getString(R.string.zen_mode_repeat_callers_list);
+                }
+            }
+
+            return "";
+        }
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
index a13946e..bdc7d69 100644
--- a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
@@ -138,6 +138,7 @@
     public void testIsAvailable_nonSystemApp() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = false;
+        appRow.lockedChannelId = "not this";
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
index 7eeee98..38790b3 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
@@ -262,6 +262,34 @@
     }
 
     @Test
+    public void testIsChannelBlockable_notConfigurable() {
+        String sameId = "apples";
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = false;
+        appRow.lockedChannelId = sameId;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.getId()).thenReturn(sameId);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_DEFAULT);
+
+        mController.onResume(appRow, channel, null, null);
+        assertFalse(mController.isChannelBlockable());
+    }
+
+    @Test
+    public void testIsChannelBlockable_notConfigurableButBlocked() {
+        String sameId = "apples";
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = false;
+        appRow.lockedChannelId = sameId;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.getId()).thenReturn(sameId);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_NONE);
+
+        mController.onResume(appRow, channel, null, null);
+        assertTrue(mController.isChannelBlockable());
+    }
+
+    @Test
     public void testIsChannelGroupBlockable_nonSystemBlockable() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = false;
