diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9beec69..e8e45e3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -727,6 +727,10 @@
                 <action android:name="android.settings.ZEN_MODE_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.ZEN_MODE_PRIORITY_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -753,23 +757,6 @@
         </activity>
 
         <activity
-            android:name="Settings$ZenModeBehaviorSettingsActivity"
-            android:label="@string/zen_mode_behavior_settings_title"
-            android:icon="@drawable/ic_settings_notifications"
-            android:exported="true"
-            android:taskAffinity="com.android.settings"
-            android:parentActivityName="Settings">
-            <intent-filter android:priority="1">
-                <action android:name="android.settings.ZEN_MODE_PRIORITY_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.notification.ZenModeBehaviorSettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
-        </activity>
-
-        <activity
             android:name="Settings$ZenModeAutomationSettingsActivity"
             android:label="@string/zen_mode_automation_settings_title"
             android:icon="@drawable/ic_settings_notifications"
diff --git a/res/drawable/ic_chevron_right_24dp.xml b/res/drawable/ic_chevron_right_24dp.xml
index ba62187..17e2b92 100644
--- a/res/drawable/ic_chevron_right_24dp.xml
+++ b/res/drawable/ic_chevron_right_24dp.xml
@@ -23,6 +23,5 @@
     android:viewportWidth="24.0"
     android:tint="?android:attr/colorControlNormal">
     <path android:fillColor="#FF000000"
-          android:pathData="M9.29,15.63l3.88-3.88L9.29,7.87c-0.39-0.39-0.39-1.02,0-1.41l0,0c0.39-0.39,1.02-0.39,1.41,0l4.59,4.59
-c0.39,0.39,0.39,1.02,0,1.41l-4.59,4.59c-0.39,0.39-1.02,0.39-1.41,0l0,0C8.91,16.66,8.9,16.02,9.29,15.63z" />
+          android:pathData="M9.71,18.71l-1.42,-1.42l5.3,-5.29l-5.3,-5.29l1.42,-1.42l6.7,6.71z"/>
 </vector>
diff --git a/res/layout/night_display_activation_button.xml b/res/layout/night_display_activation_button.xml
new file mode 100644
index 0000000..b0bfe86
--- /dev/null
+++ b/res/layout/night_display_activation_button.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <Button
+        android:id="@+id/night_display_turn_on_button"
+        style="@style/ActionPrimaryButton"
+        android:layout_marginStart="@dimen/screen_margin_sides"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start" />
+
+    <Button
+        android:id="@+id/night_display_turn_off_button"
+        style="@style/ActionSecondaryButton"
+        android:layout_marginStart="@dimen/screen_margin_sides"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7496b2f..b061e61 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4995,9 +4995,13 @@
     <string name="battery_abnormal_apps_summary"><xliff:g id="number">%1$d</xliff:g> apps misbehaving</string>
 
     <!-- Title for the battery summary tip [CHAR LIMIT=NONE] -->
-    <string name="battery_tip_summary_title">Battery is in good shape</string>
+    <string name="battery_tip_summary_title">Apps are running normally</string>
     <!-- Summary for the battery summary tip [CHAR LIMIT=NONE] -->
-    <string name="battery_tip_summary_summary">Apps are running normally</string>
+    <string name="battery_tip_summary_summary" product="default">Phone has typical background battery usage</string>
+    <!-- Summary for the battery summary tip [CHAR LIMIT=NONE] -->
+    <string name="battery_tip_summary_summary" product="tablet">Tablet has typical background battery usage</string>
+    <!-- Summary for the battery summary tip [CHAR LIMIT=NONE] -->
+    <string name="battery_tip_summary_summary" product="device">Device has typical background battery usage</string>
     <!-- Title for the low battery tip [CHAR LIMIT=NONE] -->
     <string name="battery_tip_low_battery_title">Low battery capacity</string>
     <!-- Summary for the low battery tip [CHAR LIMIT=NONE] -->
@@ -5076,9 +5080,11 @@
     <string name="battery_tip_unrestrict_app_dialog_cancel">Cancel</string>
 
     <!-- Message for battery tip dialog to show the battery summary -->
-    <string name="battery_tip_dialog_summary_message">Based on your usage, your battery usually lasts about <xliff:g id="time_duration">%1$s</xliff:g> when fully charged.\n\nIf you need to extend your battery life, turn on Battery Saver.</string>
+    <string name="battery_tip_dialog_summary_message" product="default">Your apps are using a normal amount of battery. If apps use too much battery, your phone will suggest actions you can take.\n\nYou can always turn on Battery Saver if you\u2019re running low on battery.</string>
     <!-- Message for battery tip dialog to show the battery summary -->
-    <string name="battery_tip_dialog_summary_message_no_estimation">If you need to extend your battery life, turn on Battery Saver</string>
+    <string name="battery_tip_dialog_summary_message" product="tablet">Your apps are using a normal amount of battery. If apps use too much battery, your tablet will suggest actions you can take.\n\nYou can always turn on Battery Saver if you\u2019re running low on battery.</string>
+    <!-- Message for battery tip dialog to show the battery summary -->
+    <string name="battery_tip_dialog_summary_message" product="device">Your apps are using a normal amount of battery. If apps use too much battery, your device will suggest actions you can take.\n\nYou can always turn on Battery Saver if you\u2019re running low on battery.</string>
 
     <!-- Title for the smart battery manager preference [CHAR LIMIT=NONE] -->
     <string name="smart_battery_manager_title">Battery Manager</string>
@@ -7223,24 +7229,23 @@
     <!--  Do not disturb: Subtitle for the Visual signals option to toggle on/off visual signals/alerts when the screen is on/when screen is off. [CHAR LIMIT=30] -->
     <string name="zen_mode_visual_signals_settings_subtitle">Allow visual signals</string>
 
-    <!-- Do not disturb: restrict notifications title [CHAR LIMIT=60] -->
-    <string name="zen_mode_restrict_notifications_screen_title">Restrict notifications</string>
+    <!-- Do not disturb: zen settings screens category title [CHAR LIMIT=100] -->
+    <string name="zen_mode_settings_category">When Do Not Disturb is turned on</string>
+
     <!-- Do not disturb: restrict notifications title [CHAR LIMIT=60] -->
     <string name="zen_mode_restrict_notifications_title">Notifications</string>
-    <!-- Do not disturb: restrict notifications category title [CHAR LIMIT=100] -->
-    <string name="zen_mode_restrict_notifications_category">When Do Not Disturb is turned on</string>
     <!-- Do not disturb: Mute notifications option [CHAR LIMIT=60] -->
-    <string name="zen_mode_restrict_notifications_mute">Mute notifications</string>
+    <string name="zen_mode_restrict_notifications_mute">Show notifications silently</string>
     <!-- Do not disturb:Mute notifications summary [CHAR LIMIT=NONE] -->
-    <string name="zen_mode_restrict_notifications_mute_summary">Show notifications but mute sounds &amp; vibrations</string>
+    <string name="zen_mode_restrict_notifications_mute_summary">Notifications will be muted</string>
     <!-- Do not disturb:Mute notifications footer [CHAR LIMIT=NONE] -->
-    <string name="zen_mode_restrict_notifications_mute_footer">When new notifications arrive your phone won\u2019t make a sound or vibration</string>
+    <string name="zen_mode_restrict_notifications_mute_footer">When notifications arrive, your phone won\u2019t make a sound or vibrate.</string>
     <!-- Do not disturb: Hide notifications option [CHAR LIMIT=60] -->
-    <string name="zen_mode_restrict_notifications_hide">Hide &amp; mute notifications</string>
+    <string name="zen_mode_restrict_notifications_hide">Hide notifications</string>
     <!-- Do not disturb: Hide notifications summary [CHAR LIMIT=NONE] -->
-    <string name="zen_mode_restrict_notifications_hide_summary">Notifications will not appear at all</string>
+    <string name="zen_mode_restrict_notifications_hide_summary">You won\u2019t see new or existing notifications</string>
     <!-- Do not disturb: Hide notifications footer [CHAR LIMIT=NONE] -->
-    <string name="zen_mode_restrict_notifications_hide_footer">You won\u2019t see new or existing notifications when Do Not Disturb is on. However, notifications needed for basic phone activity and status will still appear.</string>
+    <string name="zen_mode_restrict_notifications_hide_footer">Your phone won\u2019t show new or existing notifications, and won\u2019t make a sound or vibrate. Notifications won\u2019t appear when you swipe down from the top of your screen.\n\nKeep in mind, critical notifications for phone activity and status will still appear.</string>
     <!-- Do not disturb: Custom settings option [CHAR LIMIT=60] -->
     <string name="zen_mode_restrict_notifications_custom">Custom</string>
     <!-- Do not disturb: restrict notifications page, menu option [CHAR LIMIT=60] -->
@@ -7360,6 +7365,35 @@
         <item quantity="other"><xliff:g id="on_count" example="3">%d</xliff:g> rules can turn on automatically</item>
     </plurals>
 
+    <!-- Do not disturb settings, category header [CHAR LIMIT=100]-->
+    <string name="zen_category_behavior">Behavior</string>
+    <!-- Do not disturb settings, category header [CHAR LIMIT=100]-->
+    <string name="zen_category_exceptions">Exceptions</string>
+    <!-- Do not disturb settings, category header [CHAR LIMIT=100]-->
+    <string name="zen_category_schedule">Schedule</string>
+
+    <!-- Do not disturb settings, sound and vibrations title [CHAR LIMIT=100]-->
+    <string name="zen_sound_title">Sound &amp; vibration</string>
+    <!-- Do not disturb settings, sound and vibrations screen footer [CHAR LIMIT=NONE]-->
+    <string name="zen_sound_footer">When Do Not Disturb is on, sound and vibration will be muted, except for the items you allow above.</string>
+    <!-- Do not disturb settings, sound and vibrations screen category [CHAR LIMIT=100]-->
+    <string name="zen_sound_category_title">Mute all except</string>
+    <!-- Do not disturb settings, sound and vibrations summary [CHAR LIMIT=100]-->
+    <string name="zen_sound_all_muted">Muted</string>
+    <!-- Do not disturb settings, sound and vibrations summary [CHAR LIMIT=100]-->
+    <string name="zen_sound_none_muted">Not muted</string>
+    <!-- Do not disturb settings, sound and vibrations summary [CHAR LIMIT=100]-->
+    <string name="zen_sound_one_allowed">Muted, but allow <xliff:g id="sound_type" example="alarms">%1$s</xliff:g></string>
+    <!-- Do not disturb settings, sound and vibrations summary [CHAR LIMIT=100]-->
+    <string name="zen_sound_two_allowed">Muted, but allow <xliff:g id="sound_type" example="alarms">%1$s</xliff:g> and <xliff:g id="sound_type" example="media">%2$s</xliff:g></string>
+    <!-- Do not disturb settings, sound and vibrations summary [CHAR LIMIT=100]-->
+    <string name="zen_sound_three_allowed">Muted, but allow <xliff:g id="sound_type" example="alarms">%1$s</xliff:g>, <xliff:g id="sound_type" example="alarms">%2$s</xliff:g>, and <xliff:g id="sound_type" example="media">%3$s</xliff:g></string>
+
+    <!-- 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>
+
     <!-- Do not disturb onboarding dialog, accept new settings [CHAR LIMIT=30]-->
     <string name="zen_onboarding_ok">Update</string>
     <!-- Do not disturb onboarding dialog, do not accept new settings [CHAR LIMIT=30]-->
@@ -7891,14 +7925,17 @@
     <!-- [CHAR LIMIT=20] Zen mode settings: Calls option -->
     <string name="zen_mode_calls">Calls</string>
 
+    <!-- [CHAR LIMIT=20] Zen mode settings: Calls screen footer -->
+    <string name="zen_mode_calls_footer">When Do Not Disturb is on, incoming calls are blocked. You can adjust settings to allow your friends, family, or other contacts to reach you.</string>
+
     <!-- [CHAR LIMIT=20] Zen mode settings: Messages option -->
     <string name="zen_mode_messages">Messages</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: All messages summary -->
-    <string name="zen_mode_all_messages">All messages</string>
+    <string name="zen_mode_all_messages">Messages</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: Selected messages summary -->
-    <string name="zen_mode_selected_messages">Selected messages</string>
+    <string name="zen_mode_selected_messages">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>
@@ -7909,6 +7946,15 @@
     <!-- [CHAR LIMIT=40] Zen mode settings: Calls or messages option value: From starred contacts only -->
     <string name="zen_mode_from_starred">From starred contacts only</string>
 
+    <!-- Do not disturb settings, calls summary [CHAR LIMIT=100]-->
+    <string name="zen_calls_summary_starred_repeat">From starred contacts and repeat callers</string>
+
+    <!-- Do not disturb settings, calls summary [CHAR LIMIT=100]-->
+    <string name="zen_calls_summary_contacts_repeat">From contacts and repeat callers</string>
+
+    <!-- Do not disturb settings, calls summary [CHAR LIMIT=100]-->
+    <string name="zen_calls_summary_repeat_only">From repeat callers only</string>
+
     <!-- [CHAR LIMIT=40] Zen mode settings: Calls or messages option value: None -->
     <string name="zen_mode_from_none">None</string>
 
@@ -7928,14 +7974,23 @@
     <string name="zen_mode_events">Events</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: All callers summary -->
-    <string name="zen_mode_all_callers">All callers</string>
+    <string name="zen_mode_all_callers">anyone</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: Selected callers summary -->
-    <string name="zen_mode_selected_callers">Selected callers</string>
+    <string name="zen_mode_contacts_callers">contacts</string>
+
+    <!-- [CHAR LIMIT=50] Zen mode settings: Selected callers summary -->
+    <string name="zen_mode_starred_callers">starred contacts</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: Repeat callers option -->
     <string name="zen_mode_repeat_callers">Repeat callers</string>
 
+    <!-- [CHAR LIMIT=50] Zen mode settings: calls summary -->
+    <string name="zen_mode_calls_summary_one">From <xliff:g id="caller type" example="contacts">%1$s</xliff:g> only</string>
+
+    <!-- [CHAR LIMIT=50] Zen mode settings: calls summary -->
+    <string name="zen_mode_calls_summary_two">From <xliff:g id="caller type" example="starred contacts">%1$s</xliff:g> and <xliff:g id="callert tpye" example="repeat callers">%2$s</xliff:g></string>
+
     <!-- [CHAR LIMIT=200] Zen mode settings: Repeat callers option summary -->
     <string name="zen_mode_repeat_callers_summary">If the same person calls a second time within a <xliff:g id="minutes">%d</xliff:g> minute period</string>
 
@@ -8837,7 +8892,7 @@
     <!-- Summary of Android version info (when there is a pending upgrade available) [CHAR LIMIT=NONE] -->
     <string name="android_version_pending_update_summary">Update available</string>
 
-    <!-- Title for dialog displayed when user selects on a setting locked by an admin [CHAR LIMIT=30] -->
+    <!-- Title for dialog displayed when user selects on a setting locked by an admin [CHAR LIMIT=30 BACKUP_MESSAGE_ID:4867639270211833535] -->
     <string name="disabled_by_policy_title">Action not allowed</string>
     <!-- Title for dialog displayed to tell user that changing volume was disallowed by an admin [CHAR LIMIT=50] -->
     <string name="disabled_by_policy_title_adjust_volume">Can’t change volume</string>
@@ -9346,7 +9401,7 @@
     <!-- Setting tab title for all setting options. [CHAR LIMIT=20] -->
     <string name="page_tab_title_summary">All</string>
     <!-- Setting tab title for support setting options. [CHAR LIMIT=25] -->
-    <string name="page_tab_title_support">Support &amp; tips</string>
+    <string name="page_tab_title_support">Tips &amp; support</string>
 
     <!-- Summary of developer options to set the smallest width of the screen [CHAR LIMIT=60]-->
     <string name="density_pixel_summary" translatable="false"><xliff:g name="count" example="320">%1$s</xliff:g> dp</string>
diff --git a/res/xml/night_display_settings.xml b/res/xml/night_display_settings.xml
index 9442a0d..7b00ea0 100644
--- a/res/xml/night_display_settings.xml
+++ b/res/xml/night_display_settings.xml
@@ -15,31 +15,44 @@
 -->
 
 <PreferenceScreen
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:settings="http://schemas.android.com/apk/res-auto"
-        android:title="@string/night_display_title"
-        android:key="night_display_title"
-        settings:keywords="@string/keywords_display_night_display">
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/night_display_title"
+    android:key="night_display_title"
+    settings:keywords="@string/keywords_display_night_display">
 
     <DropDownPreference
-            android:key="night_display_auto_mode"
-            android:title="@string/night_display_auto_mode_title"
-            android:summary="%s" />
+        android:key="night_display_auto_mode"
+        android:title="@string/night_display_auto_mode_title"
+        android:summary="%s"
+        settings:controller="com.android.settings.display.NightDisplayAutoModePreferenceController" />
 
     <Preference
-            android:key="night_display_start_time"
-            android:title="@string/night_display_start_time_title" />
+        android:key="night_display_start_time"
+        android:title="@string/night_display_start_time_title"
+        settings:controller="com.android.settings.display.NightDisplayCustomStartTimePreferenceController" />
 
     <Preference
-            android:key="night_display_end_time"
-            android:title="@string/night_display_end_time_title" />
-
-    <com.android.settings.display.NightDisplayPreference
-            android:key="night_display_activated"
-            android:title="@string/night_display_status_title" />
+        android:key="night_display_end_time"
+        android:title="@string/night_display_end_time_title"
+        settings:controller="com.android.settings.display.NightDisplayCustomEndTimePreferenceController" />
 
     <com.android.settings.widget.SeekBarPreference
-            android:key="night_display_temperature"
-            android:title="@string/night_display_temperature_title"/>
+        android:key="night_display_temperature"
+        android:title="@string/night_display_temperature_title"
+        settings:keywords="@string/keywords_display_night_display"
+        settings:controller="com.android.settings.display.NightDisplayIntensityPreferenceController" />
+
+    <com.android.settings.applications.LayoutPreference
+        android:key="night_display_activated"
+        android:title="@string/night_display_status_title"
+        android:selectable="false"
+        android:layout="@layout/night_display_activation_button"
+        settings:keywords="@string/keywords_display_night_display"
+        settings:controller="com.android.settings.display.NightDisplayActivationPreferenceController" />
+
+    <PreferenceCategory android:key="night_display_footer_category">
+        <com.android.settingslib.widget.FooterPreference />
+    </PreferenceCategory>
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/wifi_tether_settings.xml b/res/xml/wifi_tether_settings.xml
index f9d9596..bf11698 100644
--- a/res/xml/wifi_tether_settings.xml
+++ b/res/xml/wifi_tether_settings.xml
@@ -28,6 +28,7 @@
 
     <com.android.settings.widget.ValidatedEditTextPreference
         android:key="wifi_tether_network_password"
+        android:persistent="false"
         android:title="@string/wifi_hotspot_password_title" />
 
     <SwitchPreference
diff --git a/res/xml/zen_mode_behavior_settings.xml b/res/xml/zen_mode_behavior_settings.xml
deleted file mode 100644
index 8426d91..0000000
--- a/res/xml/zen_mode_behavior_settings.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:key="zen_mode_behavior_settings_page"
-    android:title="@string/zen_mode_behavior_settings_title" >
-
-   <!-- Alarms -->
-   <SwitchPreference
-       android:key="zen_mode_alarms"
-       android:title="@string/zen_mode_alarms"/>
-
-   <!-- Media -->
-   <SwitchPreference
-       android:key="zen_mode_media"
-       android:title="@string/zen_mode_media"/>
-
-   <!-- System -->
-   <SwitchPreference
-       android:key="zen_mode_system"
-       android:title="@string/zen_mode_system"/>
-
-   <!-- Reminders -->
-   <SwitchPreference
-       android:key="zen_mode_reminders"
-       android:title="@string/zen_mode_reminders"/>
-
-   <!-- Events -->
-   <SwitchPreference
-       android:key="zen_mode_events"
-       android:title="@string/zen_mode_events"/>
-
-   <!-- Messages -->
-   <ListPreference
-       android:key="zen_mode_messages"
-       android:title="@string/zen_mode_messages"
-       android:entries="@array/zen_mode_contacts_entries"
-       android:entryValues="@array/zen_mode_contacts_values"/>
-
-   <!-- Calls -->
-   <ListPreference
-       android:key="zen_mode_calls"
-       android:title="@string/zen_mode_calls"
-       android:entries="@array/zen_mode_contacts_entries"
-       android:entryValues="@array/zen_mode_contacts_values"/>
-
-   <!-- Repeat callers -->
-   <SwitchPreference
-       android:key="zen_mode_repeat_callers"
-       android:title="@string/zen_mode_repeat_callers" />
-
-    <com.android.settingslib.widget.FooterPreference />
-
-</PreferenceScreen>
diff --git a/res/xml/zen_mode_calls_settings.xml b/res/xml/zen_mode_calls_settings.xml
new file mode 100644
index 0000000..d9e47f3
--- /dev/null
+++ b/res/xml/zen_mode_calls_settings.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:key="zen_mode_calls_settings_page"
+    android:title="@string/zen_mode_calls" >
+
+   <PreferenceCategory
+       android:title="@string/zen_mode_settings_category">
+      <!-- Calls -->
+      <ListPreference
+          android:key="zen_mode_calls"
+          android:title="@string/zen_mode_calls"
+          android:entries="@array/zen_mode_contacts_entries"
+          android:entryValues="@array/zen_mode_contacts_values"/>
+
+      <!-- TODO: setting that links to contacts or placeholder for external app -->
+
+      <!-- Repeat callers -->
+      <SwitchPreference
+          android:key="zen_mode_repeat_callers"
+          android:title="@string/zen_mode_repeat_callers" />
+   </PreferenceCategory>
+
+   <com.android.settingslib.widget.FooterPreference/>
+
+</PreferenceScreen>
diff --git a/res/xml/zen_mode_msg_event_reminder_settings.xml b/res/xml/zen_mode_msg_event_reminder_settings.xml
new file mode 100644
index 0000000..866f333
--- /dev/null
+++ b/res/xml/zen_mode_msg_event_reminder_settings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:key="zen_mode_msg_event_reminder_settings_page"
+    android:title="@string/zen_msg_event_reminder_title" >
+
+   <PreferenceCategory
+      android:title="@string/zen_mode_settings_category">
+      <!-- Messages -->
+      <ListPreference
+          android:key="zen_mode_messages"
+          android:title="@string/zen_mode_messages"
+          android:entries="@array/zen_mode_contacts_entries"
+          android:entryValues="@array/zen_mode_contacts_values"/>
+
+      <!-- Reminders -->
+      <SwitchPreference
+          android:key="zen_mode_reminders"
+          android:title="@string/zen_mode_reminders"/>
+
+      <!-- Events -->
+      <SwitchPreference
+          android:key="zen_mode_events"
+          android:title="@string/zen_mode_events"/>
+   </PreferenceCategory>
+
+   <com.android.settingslib.widget.FooterPreference />
+
+</PreferenceScreen>
diff --git a/res/xml/zen_mode_restrict_notifications_settings.xml b/res/xml/zen_mode_restrict_notifications_settings.xml
index d5243f6..e024ab9 100644
--- a/res/xml/zen_mode_restrict_notifications_settings.xml
+++ b/res/xml/zen_mode_restrict_notifications_settings.xml
@@ -18,11 +18,11 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:key="zen_mode_restrict_settings_page"
-    android:title="@string/zen_mode_restrict_notifications_screen_title">
+    android:title="@string/zen_mode_restrict_notifications_title">
 
     <PreferenceCategory
         android:key="restrict_category"
-        android:title="@string/zen_mode_restrict_notifications_category">
+        android:title="@string/zen_mode_settings_category">
         <com.android.settings.notification.ZenCustomRadioButtonPreference
             android:key="zen_mute_notifications"
             android:title="@string/zen_mode_restrict_notifications_mute"
diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml
index 0f93968..2cd4f35 100644
--- a/res/xml/zen_mode_settings.xml
+++ b/res/xml/zen_mode_settings.xml
@@ -22,39 +22,47 @@
     android:title="@string/zen_mode_settings_title"
     settings:keywords="@string/keywords_zen_mode_settings">
 
-    <!-- sound vibration -->
-    <com.android.settings.widget.DisabledCheckBoxPreference
-        android:key="zen_effect_sound"
-        android:title="@string/zen_mode_block_effect_sound"
-        android:enabled="false"/>
-
-    <!-- What to block (effects) -->
-    <Preference
-        android:key="zen_mode_block_effects_settings"
-        android:title="@string/zen_mode_restrict_notifications_title"
-        android:fragment="com.android.settings.notification.ZenModeRestrictNotificationsSettings" />
-
-    <!-- Behavior settings (exceptions) -->
-    <Preference
-            android:key="zen_mode_behavior_settings"
-            android:title="@string/zen_mode_behavior_settings_title"
-            android:fragment="com.android.settings.notification.ZenModeBehaviorSettings" />
-
-    <!-- DND duration settings -->
-    <Preference
-        android:key="zen_mode_duration_settings"
-        android:title="@string/zen_mode_duration_settings_title" />
-
-    <!-- Automatic rules -->
-    <Preference
-        android:key="zen_mode_automation_settings"
-        android:title="@string/zen_mode_automation_settings_title"
-        android:fragment="com.android.settings.notification.ZenModeAutomationSettings" />
-
-    <!-- placeholder -->
     <PreferenceCategory
-        android:key="dashboard_tile_placeholder"
-        android:order="5" />
+        android:title="@string/zen_category_behavior">
+        <!-- sound vibration -->
+        <Preference
+            android:key="zen_sound_vibration_settings"
+            android:title="@string/zen_sound_title"
+            android:fragment="com.android.settings.notification.ZenModeSoundVibrationSettings"/>
+
+        <!-- What to block (effects) -->
+        <Preference
+            android:key="zen_mode_block_effects_settings"
+            android:title="@string/zen_mode_restrict_notifications_title"
+            android:fragment="com.android.settings.notification.ZenModeRestrictNotificationsSettings" />
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/zen_category_exceptions">
+        <Preference
+            android:key="zen_mode_calls_settings"
+            android:title="@string/zen_mode_calls"
+            android:fragment="com.android.settings.notification.ZenModeCallsSettings" />
+        <Preference
+            android:key="zen_mode_msg_event_reminder_settings"
+            android:title="@string/zen_msg_event_reminder_title"
+            android:fragment="com.android.settings.notification.ZenModeMsgEventReminderSettings" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/zen_category_schedule">
+        <!-- DND duration settings -->
+        <Preference
+            android:key="zen_mode_duration_settings"
+            android:title="@string/zen_mode_duration_settings_title" />
+
+        <!-- Automatic rules -->
+        <Preference
+            android:key="zen_mode_automation_settings"
+            android:title="@string/zen_mode_automation_settings_title"
+            android:fragment="com.android.settings.notification.ZenModeAutomationSettings" />
+    </PreferenceCategory>
 
     <!-- Turn on DND button -->
     <!-- Layout preference doesn't obey allowDividerAbove, so put it in a PreferenceCategory -->
diff --git a/res/xml/zen_mode_sound_vibration_settings.xml b/res/xml/zen_mode_sound_vibration_settings.xml
new file mode 100644
index 0000000..50128b9
--- /dev/null
+++ b/res/xml/zen_mode_sound_vibration_settings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:key="zen_mode_sound_vibration_settings_page"
+    android:title="@string/zen_sound_title" >
+
+   <PreferenceCategory
+       android:title="@string/zen_mode_settings_category">
+      <!-- Alarms -->
+      <SwitchPreference
+          android:key="zen_mode_alarms"
+          android:title="@string/zen_mode_alarms"/>
+
+      <!-- Media -->
+      <SwitchPreference
+          android:key="zen_mode_media"
+          android:title="@string/zen_mode_media"/>
+
+      <!-- System -->
+      <SwitchPreference
+          android:key="zen_mode_system"
+          android:title="@string/zen_mode_system"/>
+   </PreferenceCategory>
+
+   <com.android.settingslib.widget.FooterPreference/>
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/core/SliderPreferenceController.java b/src/com/android/settings/core/SliderPreferenceController.java
index 0baa868..a6e3a5b 100644
--- a/src/com/android/settings/core/SliderPreferenceController.java
+++ b/src/com/android/settings/core/SliderPreferenceController.java
@@ -16,7 +16,6 @@
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.SeekBarPreference;
 
 import com.android.settings.slices.SliceData;
 
@@ -34,7 +33,13 @@
 
     @Override
     public void updateState(Preference preference) {
-        ((SeekBarPreference) preference).setValue(getSliderPosition());
+        if (preference instanceof com.android.settings.widget.SeekBarPreference) {
+            ((com.android.settings.widget.SeekBarPreference) preference)
+                .setProgress(getSliderPosition());
+        } else if (preference instanceof android.support.v7.preference.SeekBarPreference) {
+            ((android.support.v7.preference.SeekBarPreference) preference)
+                .setValue(getSliderPosition());
+        }
     }
 
     /**
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index 16cb18b..ffe7fd3 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -42,8 +42,8 @@
     /**
      * Set the Setting to {@param isChecked}
      *
-     * @param isChecked Is {@true} when the setting should be enabled.
-     * @return {@true} if the underlying setting is updated.
+     * @param isChecked Is {@code true} when the setting should be enabled.
+     * @return {@code true} if the underlying setting is updated.
      */
     public abstract boolean setChecked(boolean isChecked);
 
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index aa9d7b5..a8cb61c 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -106,9 +106,10 @@
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.notification.ZenAccessSettings;
 import com.android.settings.notification.ZenModeAutomationSettings;
-import com.android.settings.notification.ZenModeBehaviorSettings;
+import com.android.settings.notification.ZenModeMsgEventReminderSettings;
 import com.android.settings.notification.ZenModeBlockedEffectsSettings;
 import com.android.settings.notification.ZenModeEventRuleSettings;
+import com.android.settings.notification.ZenModeRestrictNotificationsSettings;
 import com.android.settings.notification.ZenModeScheduleRuleSettings;
 import com.android.settings.notification.ZenModeSettings;
 import com.android.settings.password.ChooseLockPassword;
@@ -220,7 +221,6 @@
             ApnSettings.class.getName(),
             ApnEditor.class.getName(),
             WifiCallingSettings.class.getName(),
-            ZenModeBehaviorSettings.class.getName(),
             ZenModeScheduleRuleSettings.class.getName(),
             ZenModeEventRuleSettings.class.getName(),
             ZenModeBlockedEffectsSettings.class.getName(),
diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java
new file mode 100644
index 0000000..9634739
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+import com.android.settings.applications.LayoutPreference;
+import com.android.settings.core.TogglePreferenceController;
+
+public class NightDisplayActivationPreferenceController extends TogglePreferenceController {
+
+    private ColorDisplayController mController;
+    private NightDisplayTimeFormatter mTimeFormatter;
+    private Button mTurnOffButton;
+    private Button mTurnOnButton;
+
+    private final OnClickListener mListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            mController.setActivated(!mController.isActivated());
+            updateStateInternal();
+        }
+    };
+
+    public NightDisplayActivationPreferenceController(Context context, String key) {
+        super(context, key);
+        mController = new ColorDisplayController(context);
+        mTimeFormatter = new NightDisplayTimeFormatter(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : DISABLED_UNSUPPORTED;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        final LayoutPreference preference = (LayoutPreference) screen.findPreference(
+                getPreferenceKey());
+        mTurnOnButton = preference.findViewById(R.id.night_display_turn_on_button);
+        mTurnOnButton.setOnClickListener(mListener);
+        mTurnOffButton = preference.findViewById(R.id.night_display_turn_off_button);
+        mTurnOffButton.setOnClickListener(mListener);
+    }
+
+    @Override
+    public final void updateState(Preference preference) {
+        updateStateInternal();
+    }
+
+    /** FOR SLICES */
+
+    @Override
+    public boolean isChecked() {
+        return mController.isActivated();
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        return mController.setActivated(isChecked);
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        return mTimeFormatter.getAutoModeTimeSummary(mContext, mController);
+    }
+
+    private void updateStateInternal() {
+        if (mTurnOnButton == null || mTurnOffButton == null) {
+            return;
+        }
+
+        final boolean isActivated = mController.isActivated();
+        final int autoMode = mController.getAutoMode();
+
+        String buttonText;
+        if (autoMode == ColorDisplayController.AUTO_MODE_CUSTOM) {
+            buttonText = mContext.getString(isActivated
+                            ? R.string.night_display_activation_off_custom
+                            : R.string.night_display_activation_on_custom,
+                    mTimeFormatter.getFormattedTimeString(isActivated
+                            ? mController.getCustomStartTime()
+                            : mController.getCustomEndTime()));
+        } else if (autoMode == ColorDisplayController.AUTO_MODE_TWILIGHT) {
+            buttonText = mContext.getString(isActivated
+                    ? R.string.night_display_activation_off_twilight
+                    : R.string.night_display_activation_on_twilight);
+        } else {
+            buttonText = mContext.getString(isActivated
+                    ? R.string.night_display_activation_off_manual
+                    : R.string.night_display_activation_on_manual);
+        }
+
+        if (isActivated) {
+            mTurnOnButton.setVisibility(View.GONE);
+            mTurnOffButton.setVisibility(View.VISIBLE);
+            mTurnOffButton.setText(buttonText);
+        } else {
+            mTurnOnButton.setVisibility(View.VISIBLE);
+            mTurnOffButton.setVisibility(View.GONE);
+            mTurnOnButton.setText(buttonText);
+        }
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java
new file mode 100644
index 0000000..e7b7de2
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.DropDownPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+public class NightDisplayAutoModePreferenceController extends BasePreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private DropDownPreference mPreference;
+    private ColorDisplayController mController;
+
+    public NightDisplayAutoModePreferenceController(Context context, String key) {
+        super(context, key);
+        mController = new ColorDisplayController(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : DISABLED_UNSUPPORTED;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (DropDownPreference) screen.findPreference(getPreferenceKey());
+
+        mPreference.setEntries(new CharSequence[]{
+                mContext.getString(R.string.night_display_auto_mode_never),
+                mContext.getString(R.string.night_display_auto_mode_custom),
+                mContext.getString(R.string.night_display_auto_mode_twilight)
+        });
+        mPreference.setEntryValues(new CharSequence[]{
+                String.valueOf(ColorDisplayController.AUTO_MODE_DISABLED),
+                String.valueOf(ColorDisplayController.AUTO_MODE_CUSTOM),
+                String.valueOf(ColorDisplayController.AUTO_MODE_TWILIGHT)
+        });
+    }
+
+    @Override
+    public final void updateState(Preference preference) {
+        mPreference.setValue(String.valueOf(mController.getAutoMode()));
+    }
+
+    @Override
+    public final boolean onPreferenceChange(Preference preference, Object newValue) {
+        return mController.setAutoMode(Integer.parseInt((String) newValue));
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java
new file mode 100644
index 0000000..524e7db
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.core.BasePreferenceController;
+
+public class NightDisplayCustomEndTimePreferenceController extends BasePreferenceController {
+
+    private ColorDisplayController mController;
+    private NightDisplayTimeFormatter mTimeFormatter;
+
+    public NightDisplayCustomEndTimePreferenceController(Context context, String key) {
+        super(context, key);
+
+        mController = new ColorDisplayController(context);
+        mTimeFormatter = new NightDisplayTimeFormatter(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : DISABLED_UNSUPPORTED;
+    }
+
+    @Override
+    public final void updateState(Preference preference) {
+        preference.setVisible(mController.getAutoMode() == ColorDisplayController.AUTO_MODE_CUSTOM);
+        preference.setSummary(mTimeFormatter.getFormattedTimeString(
+                mController.getCustomEndTime()));
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java
new file mode 100644
index 0000000..4dda8f4
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.core.BasePreferenceController;
+
+public class NightDisplayCustomStartTimePreferenceController extends BasePreferenceController {
+
+    private ColorDisplayController mController;
+    private NightDisplayTimeFormatter mTimeFormatter;
+
+    public NightDisplayCustomStartTimePreferenceController(Context context, String key) {
+        super(context, key);
+
+        mController = new ColorDisplayController(context);
+        mTimeFormatter = new NightDisplayTimeFormatter(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : DISABLED_UNSUPPORTED;
+    }
+
+    @Override
+    public final void updateState(Preference preference) {
+        preference.setVisible(mController.getAutoMode() == ColorDisplayController.AUTO_MODE_CUSTOM);
+        preference.setSummary(mTimeFormatter.getFormattedTimeString(
+                mController.getCustomStartTime()));
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java
new file mode 100644
index 0000000..228d271
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.FooterPreference;
+
+public class NightDisplayFooterPreferenceController extends BasePreferenceController {
+
+    public NightDisplayFooterPreferenceController(Context context) {
+        super(context, FooterPreference.KEY_FOOTER);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : DISABLED_UNSUPPORTED;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        preference.setTitle(R.string.night_display_text);
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
new file mode 100644
index 0000000..b039644
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.core.SliderPreferenceController;
+import com.android.settings.widget.SeekBarPreference;
+
+public class NightDisplayIntensityPreferenceController extends SliderPreferenceController {
+
+    private ColorDisplayController mController;
+
+    public NightDisplayIntensityPreferenceController(Context context, String key) {
+        super(context, key);
+        mController = new ColorDisplayController(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (!ColorDisplayController.isAvailable(mContext)) {
+            return DISABLED_UNSUPPORTED;
+        } else if (!mController.isActivated()) {
+            return DISABLED_DEPENDENT_SETTING;
+        }
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final SeekBarPreference preference = (SeekBarPreference) screen.findPreference(
+            getPreferenceKey());
+        preference.setContinuousUpdates(true);
+        preference.setMax(getMaxSteps());
+    }
+
+    @Override
+    public final void updateState(Preference preference) {
+        super.updateState(preference);
+        preference.setEnabled(mController.isActivated());
+    }
+
+    @Override
+    public int getSliderPosition() {
+        return convertTemperature(mController.getColorTemperature());
+    }
+
+    @Override
+    public boolean setSliderPosition(int position) {
+        return mController.setColorTemperature(convertTemperature(position));
+    }
+
+    @Override
+    public int getMaxSteps() {
+        return convertTemperature(mController.getMinimumColorTemperature());
+    }
+
+    /**
+     * Inverts and range-adjusts a raw value from the SeekBar (i.e. [0, maxTemp-minTemp]), or
+     * converts an inverted and range-adjusted value to the raw SeekBar value, depending on the
+     * adjustment status of the input.
+     */
+    private int convertTemperature(int temperature) {
+        return mController.getMaximumColorTemperature() - temperature;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/display/NightDisplayPreference.java b/src/com/android/settings/display/NightDisplayPreference.java
index ea39f75..e463292 100644
--- a/src/com/android/settings/display/NightDisplayPreference.java
+++ b/src/com/android/settings/display/NightDisplayPreference.java
@@ -19,25 +19,20 @@
 import android.util.AttributeSet;
 
 import com.android.internal.app.ColorDisplayController;
-import com.android.settings.R;
 
-import java.text.DateFormat;
 import java.time.LocalTime;
-import java.util.Calendar;
-import java.util.TimeZone;
 
 public class NightDisplayPreference extends SwitchPreference
         implements ColorDisplayController.Callback {
 
     private ColorDisplayController mController;
-    private DateFormat mTimeFormatter;
+    private NightDisplayTimeFormatter mTimeFormatter;
 
     public NightDisplayPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         mController = new ColorDisplayController(context);
-        mTimeFormatter = android.text.format.DateFormat.getTimeFormat(context);
-        mTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+        mTimeFormatter = new NightDisplayTimeFormatter(context);
     }
 
     @Override
@@ -59,53 +54,6 @@
         mController.setListener(null);
     }
 
-    private String getFormattedTimeString(LocalTime localTime) {
-        final Calendar c = Calendar.getInstance();
-        c.setTimeZone(mTimeFormatter.getTimeZone());
-        c.set(Calendar.HOUR_OF_DAY, localTime.getHour());
-        c.set(Calendar.MINUTE, localTime.getMinute());
-        c.set(Calendar.SECOND, 0);
-        c.set(Calendar.MILLISECOND, 0);
-        return mTimeFormatter.format(c.getTime());
-    }
-
-    private void updateSummary() {
-        final Context context = getContext();
-
-        final boolean isActivated = mController.isActivated();
-        final int autoMode = mController.getAutoMode();
-
-        final String autoModeSummary;
-        switch (autoMode) {
-            default:
-            case ColorDisplayController.AUTO_MODE_DISABLED:
-                autoModeSummary = context.getString(isActivated
-                        ? R.string.night_display_summary_on_auto_mode_never
-                        : R.string.night_display_summary_off_auto_mode_never);
-                break;
-            case ColorDisplayController.AUTO_MODE_CUSTOM:
-                if (isActivated) {
-                    autoModeSummary = context.getString(
-                            R.string.night_display_summary_on_auto_mode_custom,
-                            getFormattedTimeString(mController.getCustomEndTime()));
-                } else {
-                    autoModeSummary = context.getString(
-                            R.string.night_display_summary_off_auto_mode_custom,
-                            getFormattedTimeString(mController.getCustomStartTime()));
-                }
-                break;
-            case ColorDisplayController.AUTO_MODE_TWILIGHT:
-                autoModeSummary = context.getString(isActivated
-                        ? R.string.night_display_summary_on_auto_mode_twilight
-                        : R.string.night_display_summary_off_auto_mode_twilight);
-                break;
-        }
-
-        final int summaryFormatResId = isActivated ? R.string.night_display_summary_on
-                : R.string.night_display_summary_off;
-        setSummary(context.getString(summaryFormatResId, autoModeSummary));
-    }
-
     @Override
     public void onActivated(boolean activated) {
         updateSummary();
@@ -125,4 +73,8 @@
     public void onCustomEndTimeChanged(LocalTime endTime) {
         updateSummary();
     }
+
+    private void updateSummary() {
+        setSummary(mTimeFormatter.getAutoModeTimeSummary(getContext(), mController));
+    }
 }
diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java
index 4e0ebcd..e9bcde5 100644
--- a/src/com/android/settings/display/NightDisplaySettings.java
+++ b/src/com/android/settings/display/NightDisplaySettings.java
@@ -21,51 +21,32 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.SearchIndexableResource;
-import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.TwoStatePreference;
 
 import com.android.internal.app.ColorDisplayController;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settings.widget.SeekBarPreference;
-import com.android.settings.SettingsPreferenceFragment;
 import com.android.settingslib.core.AbstractPreferenceController;
 
-import java.text.DateFormat;
 import java.time.LocalTime;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.List;
-import java.util.TimeZone;
 
 /**
  * Settings screen for Night display.
- * TODO (b/69912911) Upgrade to Dashboard fragment
  */
-public class NightDisplaySettings extends SettingsPreferenceFragment
-        implements ColorDisplayController.Callback, Preference.OnPreferenceChangeListener,
-        Indexable {
+public class NightDisplaySettings extends DashboardFragment
+        implements ColorDisplayController.Callback, Indexable {
 
-    private static final String KEY_NIGHT_DISPLAY_AUTO_MODE = "night_display_auto_mode";
-    private static final String KEY_NIGHT_DISPLAY_START_TIME = "night_display_start_time";
-    private static final String KEY_NIGHT_DISPLAY_END_TIME = "night_display_end_time";
-    private static final String KEY_NIGHT_DISPLAY_ACTIVATED = "night_display_activated";
-    private static final String KEY_NIGHT_DISPLAY_TEMPERATURE = "night_display_temperature";
+    private static final String TAG = "NightDisplaySettings";
 
     private static final int DIALOG_START_TIME = 0;
     private static final int DIALOG_END_TIME = 1;
 
     private ColorDisplayController mController;
-    private DateFormat mTimeFormatter;
-
-    private DropDownPreference mAutoModePreference;
-    private Preference mStartTimePreference;
-    private Preference mEndTimePreference;
-    private TwoStatePreference mActivatedPreference;
-    private SeekBarPreference mTemperaturePreference;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -73,45 +54,6 @@
 
         final Context context = getContext();
         mController = new ColorDisplayController(context);
-
-        mTimeFormatter = android.text.format.DateFormat.getTimeFormat(context);
-        mTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
-
-        mTemperaturePreference.setMax(convertTemperature(mController.getMinimumColorTemperature()));
-        mTemperaturePreference.setContinuousUpdates(true);
-    }
-
-    @Override
-    public int getHelpResource() {
-        return R.string.help_url_night_display;
-    }
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        super.onCreatePreferences(savedInstanceState, rootKey);
-
-        // Load the preferences from xml.
-        addPreferencesFromResource(R.xml.night_display_settings);
-        mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.night_display_text);
-        mAutoModePreference = (DropDownPreference) findPreference(KEY_NIGHT_DISPLAY_AUTO_MODE);
-        mStartTimePreference = findPreference(KEY_NIGHT_DISPLAY_START_TIME);
-        mEndTimePreference = findPreference(KEY_NIGHT_DISPLAY_END_TIME);
-        mActivatedPreference = (TwoStatePreference) findPreference(KEY_NIGHT_DISPLAY_ACTIVATED);
-        mTemperaturePreference = (SeekBarPreference) findPreference(KEY_NIGHT_DISPLAY_TEMPERATURE);
-
-        mAutoModePreference.setEntries(new CharSequence[]{
-                getString(R.string.night_display_auto_mode_never),
-                getString(R.string.night_display_auto_mode_custom),
-                getString(R.string.night_display_auto_mode_twilight)
-        });
-        mAutoModePreference.setEntryValues(new CharSequence[]{
-                String.valueOf(ColorDisplayController.AUTO_MODE_DISABLED),
-                String.valueOf(ColorDisplayController.AUTO_MODE_CUSTOM),
-                String.valueOf(ColorDisplayController.AUTO_MODE_TWILIGHT)
-        });
-        mAutoModePreference.setOnPreferenceChangeListener(this);
-        mActivatedPreference.setOnPreferenceChangeListener(this);
-        mTemperaturePreference.setOnPreferenceChangeListener(this);
     }
 
     @Override
@@ -120,14 +62,6 @@
 
         // Listen for changes only while visible.
         mController.setListener(this);
-
-        // Update the current state since it have changed while not visible.
-        onActivated(mController.isActivated());
-        onAutoModeChanged(mController.getAutoMode());
-        onCustomStartTimeChanged(mController.getCustomStartTime());
-        onCustomEndTimeChanged(mController.getCustomEndTime());
-        onColorTemperatureChanged(mController.getColorTemperature());
-        onDisplayColorModeChanged(mController.getColorMode());
     }
 
     @Override
@@ -140,12 +74,12 @@
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference == mStartTimePreference) {
-            showDialog(DIALOG_START_TIME);
-            return true;
-        } else if (preference == mEndTimePreference) {
+        if ("night_display_end_time".equals(preference.getKey())) {
             showDialog(DIALOG_END_TIME);
             return true;
+        } else if ("night_display_start_time".equals(preference.getKey())) {
+            showDialog(DIALOG_START_TIME);
+            return true;
         }
         return super.onPreferenceTreeClick(preference);
     }
@@ -188,63 +122,37 @@
 
     @Override
     public void onActivated(boolean activated) {
-        mActivatedPreference.setChecked(activated);
-        mTemperaturePreference.setEnabled(activated);
+        // Update activated and temperature preferences.
+        updatePreferenceStates();
     }
 
     @Override
     public void onAutoModeChanged(int autoMode) {
-        mAutoModePreference.setValue(String.valueOf(autoMode));
-
-        final boolean showCustomSchedule = autoMode == ColorDisplayController.AUTO_MODE_CUSTOM;
-        mStartTimePreference.setVisible(showCustomSchedule);
-        mEndTimePreference.setVisible(showCustomSchedule);
+        // Update auto mode, start time, and end time preferences.
+        updatePreferenceStates();
     }
 
     @Override
     public void onColorTemperatureChanged(int colorTemperature) {
-        mTemperaturePreference.setProgress(convertTemperature(colorTemperature));
-    }
-
-    private String getFormattedTimeString(LocalTime localTime) {
-        final Calendar c = Calendar.getInstance();
-        c.setTimeZone(mTimeFormatter.getTimeZone());
-        c.set(Calendar.HOUR_OF_DAY, localTime.getHour());
-        c.set(Calendar.MINUTE, localTime.getMinute());
-        c.set(Calendar.SECOND, 0);
-        c.set(Calendar.MILLISECOND, 0);
-        return mTimeFormatter.format(c.getTime());
-    }
-
-    /**
-     * Inverts and range-adjusts a raw value from the SeekBar (i.e. [0, maxTemp-minTemp]), or
-     * converts an inverted and range-adjusted value to the raw SeekBar value, depending on the
-     * adjustment status of the input.
-     */
-    private int convertTemperature(int temperature) {
-        return mController.getMaximumColorTemperature() - temperature;
+        // Update temperature preference.
+        updatePreferenceStates();
     }
 
     @Override
     public void onCustomStartTimeChanged(LocalTime startTime) {
-        mStartTimePreference.setSummary(getFormattedTimeString(startTime));
+        // Update start time preference.
+        updatePreferenceStates();
     }
 
     @Override
     public void onCustomEndTimeChanged(LocalTime endTime) {
-        mEndTimePreference.setSummary(getFormattedTimeString(endTime));
+        // Update end time preference.
+        updatePreferenceStates();
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        if (preference == mAutoModePreference) {
-            return mController.setAutoMode(Integer.parseInt((String) newValue));
-        } else if (preference == mActivatedPreference) {
-            return mController.setActivated((Boolean) newValue);
-        } else if (preference == mTemperaturePreference) {
-            return mController.setColorTemperature(convertTemperature((Integer) newValue));
-        }
-        return false;
+    protected int getPreferenceScreenResId() {
+        return R.xml.night_display_settings;
     }
 
     @Override
@@ -252,13 +160,33 @@
         return MetricsEvent.NIGHT_DISPLAY_SETTINGS;
     }
 
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_night_display;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context);
+    }
+
+    private static List <AbstractPreferenceController> buildPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>(1);
+        controllers.add(new NightDisplayFooterPreferenceController(context));
+        return controllers;
+    }
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
                 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
                         boolean enabled) {
                     final ArrayList<SearchIndexableResource> result = new ArrayList<>();
-
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
                     sir.xmlResId = R.xml.night_display_settings;
                     result.add(sir);
@@ -269,5 +197,11 @@
                 protected boolean isPageSearchEnabled(Context context) {
                     return ColorDisplayController.isAvailable(context);
                 }
+
+                @Override
+                public List<AbstractPreferenceController> createPreferenceControllers(
+                    Context context) {
+                    return buildPreferenceControllers(context);
+                }
             };
 }
diff --git a/src/com/android/settings/display/NightDisplayTimeFormatter.java b/src/com/android/settings/display/NightDisplayTimeFormatter.java
new file mode 100644
index 0000000..48a1994
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayTimeFormatter.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+
+import java.text.DateFormat;
+import java.time.LocalTime;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+public class NightDisplayTimeFormatter {
+
+    private DateFormat mTimeFormatter;
+
+    NightDisplayTimeFormatter(Context context) {
+        mTimeFormatter = android.text.format.DateFormat.getTimeFormat(context);
+        mTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+    }
+
+    public String getFormattedTimeString(LocalTime localTime) {
+        final Calendar c = Calendar.getInstance();
+        c.setTimeZone(mTimeFormatter.getTimeZone());
+        c.set(Calendar.HOUR_OF_DAY, localTime.getHour());
+        c.set(Calendar.MINUTE, localTime.getMinute());
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return mTimeFormatter.format(c.getTime());
+    }
+
+    public String getAutoModeTimeSummary(Context context, ColorDisplayController controller) {
+        final int summaryFormatResId = controller.isActivated() ? R.string.night_display_summary_on
+                : R.string.night_display_summary_off;
+        return context.getString(summaryFormatResId, getAutoModeSummary(context, controller));
+    }
+
+    private String getAutoModeSummary(Context context, ColorDisplayController controller) {
+        final boolean isActivated = controller.isActivated();
+        final int autoMode = controller.getAutoMode();
+        if (autoMode == ColorDisplayController.AUTO_MODE_CUSTOM) {
+            if (isActivated) {
+                return context.getString(R.string.night_display_summary_on_auto_mode_custom,
+                        getFormattedTimeString(controller.getCustomEndTime()));
+            } else {
+                return context.getString(R.string.night_display_summary_off_auto_mode_custom,
+                        getFormattedTimeString(controller.getCustomStartTime()));
+            }
+        } else if (autoMode == ColorDisplayController.AUTO_MODE_TWILIGHT) {
+            return context.getString(isActivated
+                    ? R.string.night_display_summary_on_auto_mode_twilight
+                    : R.string.night_display_summary_off_auto_mode_twilight);
+        } else {
+            return context.getString(isActivated
+                    ? R.string.night_display_summary_on_auto_mode_never
+                    : R.string.night_display_summary_off_auto_mode_never);
+        }
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index 0e4f9c3..bbeb435 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -38,6 +38,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.support.annotation.GuardedBy;
 import android.support.annotation.VisibleForTesting;
 import android.util.Log;
 import android.util.Pair;
@@ -65,10 +66,13 @@
     static final int UID_NULL = -1;
     @VisibleForTesting
     static final int STATSD_UID_FILED = 1;
-
     @VisibleForTesting
     static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30);
 
+    private final Object mLock = new Object();
+    @GuardedBy("mLock")
+    private boolean mIsJobCanceled = false;
+
     public static void scheduleAnomalyDetection(Context context, Intent intent) {
         final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
         final ComponentName component = new ComponentName(context,
@@ -102,14 +106,14 @@
                     .getFactory(this).getMetricsFeatureProvider();
             batteryUtils.initBatteryStatsHelper(batteryStatsHelper, null /* bundle */, userManager);
 
-            for (JobWorkItem item = params.dequeueWork(); item != null;
-                    item = params.dequeueWork()) {
+            for (JobWorkItem item = dequeueWork(params); item != null; item = dequeueWork(params)) {
                 saveAnomalyToDatabase(context, batteryStatsHelper, userManager,
                         batteryDatabaseManager, batteryUtils, policy, powerWhitelistBackend,
                         contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
                         item.getIntent().getExtras());
+
+                completeWork(params, item);
             }
-            jobFinished(params, false /* wantsReschedule */);
         });
 
         return true;
@@ -117,7 +121,10 @@
 
     @Override
     public boolean onStopJob(JobParameters jobParameters) {
-        return false;
+        synchronized (mLock) {
+            mIsJobCanceled = true;
+        }
+        return true; // Need to reschedule
     }
 
     @VisibleForTesting
@@ -229,4 +236,26 @@
         return anomalyInfo.anomalyType
                 == StatsManagerConfig.AnomalyType.EXCESSIVE_BACKGROUND_SERVICE;
     }
+
+    @VisibleForTesting
+    JobWorkItem dequeueWork(JobParameters parameters) {
+        synchronized (mLock) {
+            if (mIsJobCanceled) {
+                return null;
+            }
+
+            return parameters.dequeueWork();
+        }
+    }
+
+    @VisibleForTesting
+    void completeWork(JobParameters parameters, JobWorkItem item) {
+        synchronized (mLock) {
+            if (mIsJobCanceled) {
+                return;
+            }
+
+            parameters.completeWork(item);
+        }
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 74c65f9..ac6d622 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -79,16 +79,8 @@
 
         switch (mBatteryTip.getType()) {
             case BatteryTip.TipType.SUMMARY:
-                final long averageTimeMs = ((SummaryTip) mBatteryTip).getAverageTimeMs();
-                final String message = context.getString(
-                        averageTimeMs == Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN
-                                ? R.string.battery_tip_dialog_summary_message_no_estimation
-                                : R.string.battery_tip_dialog_summary_message,
-                        StringUtil.formatElapsedTime(context, averageTimeMs,
-                                false /* withSeconds */));
-
                 return new AlertDialog.Builder(context)
-                        .setMessage(message)
+                        .setMessage(R.string.battery_tip_dialog_summary_message)
                         .setPositiveButton(android.R.string.ok, null)
                         .create();
             case BatteryTip.TipType.HIGH_DEVICE_USAGE:
diff --git a/src/com/android/settings/notification/ZenCustomRadioButtonPreference.java b/src/com/android/settings/notification/ZenCustomRadioButtonPreference.java
index 6035b49..91472f9 100644
--- a/src/com/android/settings/notification/ZenCustomRadioButtonPreference.java
+++ b/src/com/android/settings/notification/ZenCustomRadioButtonPreference.java
@@ -86,10 +86,13 @@
         }
 
         final View gear = holder.findViewById(android.R.id.widget_frame);
+        final View divider = holder.findViewById(R.id.two_target_divider);
         if (mOnGearClickListener != null) {
+            divider.setVisibility(View.VISIBLE);
             gear.setVisibility(View.VISIBLE);
             gear.setOnClickListener(this);
         } else {
+            divider.setVisibility(View.GONE);
             gear.setVisibility(View.GONE);
             gear.setOnClickListener(null);
         }
diff --git a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java b/src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceController.java
similarity index 84%
rename from src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
rename to src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceController.java
index cf6218c..79aa0cb 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceController.java
@@ -22,13 +22,13 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
-public class ZenModeBehaviorPreferenceController extends
+public class ZenModeBehaviorCallsPreferenceController extends
         AbstractZenModePreferenceController implements PreferenceControllerMixin {
 
-    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_mode_behavior_settings";
+    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_mode_calls_settings";
     private final ZenModeSettings.SummaryBuilder mSummaryBuilder;
 
-    public ZenModeBehaviorPreferenceController(Context context, Lifecycle lifecycle) {
+    public ZenModeBehaviorCallsPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_BEHAVIOR_SETTINGS, lifecycle);
         mSummaryBuilder = new ZenModeSettings.SummaryBuilder(context);
     }
@@ -47,7 +47,6 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
 
-        preference.setSummary(mSummaryBuilder.getBehaviorSettingSummary(getPolicy(),
-                getZenMode()));
+        preference.setSummary(mSummaryBuilder.getCallsSettingSummary(getPolicy()));
     }
 }
diff --git a/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceController.java b/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceController.java
index a1c2b01..7f8760b 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceController.java
@@ -16,13 +16,12 @@
 
 package com.android.settings.notification;
 
-import android.content.Context;
 import android.content.ComponentName;
+import android.content.Context;
 import android.net.Uri;
 import android.provider.Settings;
 import android.service.notification.ZenModeConfig;
 import android.support.v7.preference.Preference;
-import android.util.Slog;
 
 import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -30,14 +29,17 @@
 public class ZenModeBehaviorFooterPreferenceController extends AbstractZenModePreferenceController {
 
     protected static final String KEY = "footer_preference";
+    private final int mTitleRes;
 
-    public ZenModeBehaviorFooterPreferenceController(Context context, Lifecycle lifecycle) {
+    public ZenModeBehaviorFooterPreferenceController(Context context, Lifecycle lifecycle,
+            int titleRes) {
         super(context, KEY, lifecycle);
+        mTitleRes = titleRes;
     }
 
     @Override
     public boolean isAvailable() {
-        return isDeprecatedZenMode(getZenMode());
+        return true;
     }
 
     @Override
@@ -48,45 +50,45 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-
-        boolean isAvailable = isAvailable();
-        preference.setVisible(isAvailable);
-        if (isAvailable) {
-            preference.setTitle(getFooterText());
-        }
-
+        preference.setTitle(getFooterText());
     }
 
     protected String getFooterText() {
-        ZenModeConfig config = getZenModeConfig();
+        if (isDeprecatedZenMode(getZenMode())) {
+            ZenModeConfig config = getZenModeConfig();
 
-        // DND turned on by manual rule with deprecated zen mode
-        if (config.manualRule != null &&
-                isDeprecatedZenMode(config.manualRule.zenMode)) {
-            final Uri id = config.manualRule.conditionId;
-            if (config.manualRule.enabler != null) {
-                // app triggered manual rule
-                String appOwner = mZenModeConfigWrapper.getOwnerCaption(config.manualRule.enabler);
-                if (!appOwner.isEmpty()) {
-                    return mContext.getString(R.string.zen_mode_app_set_behavior, appOwner);
-                }
-            } else {
-                return mContext.getString(R.string.zen_mode_qs_set_behavior);
-            }
-        }
-
-        // DND turned on by an automatic rule with deprecated zen mode
-        for (ZenModeConfig.ZenRule automaticRule : config.automaticRules.values()) {
-            if (automaticRule.isAutomaticActive() && isDeprecatedZenMode(automaticRule.zenMode)) {
-                ComponentName component = automaticRule.component;
-                if (component != null) {
-                    return mContext.getString(R.string.zen_mode_app_set_behavior,
-                            component.getPackageName());
+            // DND turned on by manual rule with deprecated zen mode
+            if (config.manualRule != null &&
+                    isDeprecatedZenMode(config.manualRule.zenMode)) {
+                final Uri id = config.manualRule.conditionId;
+                if (config.manualRule.enabler != null) {
+                    // app triggered manual rule
+                    String appOwner = mZenModeConfigWrapper.getOwnerCaption(
+                            config.manualRule.enabler);
+                    if (!appOwner.isEmpty()) {
+                        return mContext.getString(R.string.zen_mode_app_set_behavior, appOwner);
+                    }
+                } else {
+                    return mContext.getString(R.string.zen_mode_qs_set_behavior);
                 }
             }
-        }
 
-        return mContext.getString(R.string.zen_mode_unknown_app_set_behavior);
+            // DND turned on by an automatic rule with deprecated zen mode
+            for (ZenModeConfig.ZenRule automaticRule : config.automaticRules.values()) {
+                if (automaticRule.isAutomaticActive() && isDeprecatedZenMode(
+                        automaticRule.zenMode)) {
+                    ComponentName component = automaticRule.component;
+                    if (component != null) {
+                        return mContext.getString(R.string.zen_mode_app_set_behavior,
+                                component.getPackageName());
+                    }
+                }
+            }
+
+            return mContext.getString(R.string.zen_mode_unknown_app_set_behavior);
+        } else {
+            return mContext.getString(mTitleRes);
+        }
     }
 
     private boolean isDeprecatedZenMode(int zenMode) {
diff --git a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java b/src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceController.java
similarity index 82%
copy from src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
copy to src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceController.java
index cf6218c..8527696 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceController.java
@@ -22,13 +22,14 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
-public class ZenModeBehaviorPreferenceController extends
+public class ZenModeBehaviorMsgEventReminderPreferenceController extends
         AbstractZenModePreferenceController implements PreferenceControllerMixin {
 
-    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_mode_behavior_settings";
+    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_mode_msg_event_reminder_settings";
     private final ZenModeSettings.SummaryBuilder mSummaryBuilder;
 
-    public ZenModeBehaviorPreferenceController(Context context, Lifecycle lifecycle) {
+    public ZenModeBehaviorMsgEventReminderPreferenceController(Context context,
+            Lifecycle lifecycle) {
         super(context, KEY_BEHAVIOR_SETTINGS, lifecycle);
         mSummaryBuilder = new ZenModeSettings.SummaryBuilder(context);
     }
@@ -47,7 +48,6 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
 
-        preference.setSummary(mSummaryBuilder.getBehaviorSettingSummary(getPolicy(),
-                getZenMode()));
+        preference.setSummary(mSummaryBuilder.getMsgEventReminderSettingSummary(getPolicy()));
     }
 }
diff --git a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java b/src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceController.java
similarity index 77%
copy from src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
copy to src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceController.java
index cf6218c..07f1229 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,13 +22,13 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
-public class ZenModeBehaviorPreferenceController extends
+public class ZenModeBehaviorSoundPreferenceController extends
         AbstractZenModePreferenceController implements PreferenceControllerMixin {
 
-    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_mode_behavior_settings";
+    protected static final String KEY_BEHAVIOR_SETTINGS = "zen_sound_vibration_settings";
     private final ZenModeSettings.SummaryBuilder mSummaryBuilder;
 
-    public ZenModeBehaviorPreferenceController(Context context, Lifecycle lifecycle) {
+    public ZenModeBehaviorSoundPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_BEHAVIOR_SETTINGS, lifecycle);
         mSummaryBuilder = new ZenModeSettings.SummaryBuilder(context);
     }
@@ -47,7 +47,6 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
 
-        preference.setSummary(mSummaryBuilder.getBehaviorSettingSummary(getPolicy(),
-                getZenMode()));
+        preference.setSummary(mSummaryBuilder.getSoundSettingSummary(getPolicy()));
     }
 }
diff --git a/src/com/android/settings/notification/ZenModeBehaviorSettings.java b/src/com/android/settings/notification/ZenModeCallsSettings.java
similarity index 77%
copy from src/com/android/settings/notification/ZenModeBehaviorSettings.java
copy to src/com/android/settings/notification/ZenModeCallsSettings.java
index 31542c3..20396b5 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorSettings.java
+++ b/src/com/android/settings/notification/ZenModeCallsSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Indexable {
+public class ZenModeCallsSettings extends ZenModeSettingsBase implements Indexable {
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
@@ -39,23 +39,20 @@
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle) {
         List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new ZenModeAlarmsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeMediaPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeSystemPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeEventsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeRemindersPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeMessagesPreferenceController(context, lifecycle));
         controllers.add(new ZenModeCallsPreferenceController(context, lifecycle));
+        // TODO: is a controller needed for a pref that just launches an external activity?
+        // or can the contacts app insert this setting themselves?
         controllers.add(new ZenModeRepeatCallersPreferenceController(context, lifecycle,
                 context.getResources().getInteger(com.android.internal.R.integer
                 .config_zen_repeat_callers_threshold)));
-        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorFooterPreferenceController(
+                context, lifecycle, R.string.zen_mode_calls_footer));
         return controllers;
     }
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.zen_mode_behavior_settings;
+        return R.xml.zen_mode_calls_settings;
     }
 
     @Override
@@ -66,7 +63,7 @@
     /**
      * For Search.
      */
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
 
                 @Override
@@ -75,7 +72,7 @@
                     final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.zen_mode_behavior_settings;
+                    sir.xmlResId = R.xml.zen_mode_calls_settings;
                     result.add(sir);
                     return result;
                 }
diff --git a/src/com/android/settings/notification/ZenModeBehaviorSettings.java b/src/com/android/settings/notification/ZenModeMsgEventReminderSettings.java
similarity index 78%
rename from src/com/android/settings/notification/ZenModeBehaviorSettings.java
rename to src/com/android/settings/notification/ZenModeMsgEventReminderSettings.java
index 31542c3..c2508e3 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorSettings.java
+++ b/src/com/android/settings/notification/ZenModeMsgEventReminderSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Indexable {
+public class ZenModeMsgEventReminderSettings extends ZenModeSettingsBase implements Indexable {
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
@@ -39,23 +39,17 @@
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle) {
         List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new ZenModeAlarmsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeMediaPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeSystemPreferenceController(context, lifecycle));
         controllers.add(new ZenModeEventsPreferenceController(context, lifecycle));
         controllers.add(new ZenModeRemindersPreferenceController(context, lifecycle));
         controllers.add(new ZenModeMessagesPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeCallsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeRepeatCallersPreferenceController(context, lifecycle,
-                context.getResources().getInteger(com.android.internal.R.integer
-                .config_zen_repeat_callers_threshold)));
-        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle,
+                R.string.zen_msg_event_reminder_footer));
         return controllers;
     }
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.zen_mode_behavior_settings;
+        return R.xml.zen_mode_msg_event_reminder_settings;
     }
 
     @Override
@@ -75,7 +69,7 @@
                     final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.zen_mode_behavior_settings;
+                    sir.xmlResId = R.xml.zen_mode_msg_event_reminder_settings;
                     result.add(sir);
                     return result;
                 }
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index bdc24e3..ec0f619 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -16,6 +16,15 @@
 
 package com.android.settings.notification;
 
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_CALLS;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_EVENTS;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_MEDIA;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REMINDERS;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REPEAT_CALLERS;
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_SYSTEM;
+
 import android.app.AutomaticZenRule;
 import android.app.FragmentManager;
 import android.app.NotificationManager;
@@ -25,7 +34,6 @@
 import android.provider.Settings;
 import android.service.notification.ZenModeConfig;
 import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.CheckBoxPreference;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
@@ -39,17 +47,12 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.function.Predicate;
 
 public class ZenModeSettings extends ZenModeSettingsBase {
-    private static final String KEY_SOUND = "zen_effect_sound";
     @Override
     public void onResume() {
         super.onResume();
-        CheckBoxPreference soundPreference =
-                (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SOUND);
-        if (soundPreference != null) {
-            soundPreference.setChecked(true);
-        }
     }
 
     @Override
@@ -75,7 +78,9 @@
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle, FragmentManager fragmentManager) {
         List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new ZenModeBehaviorPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorMsgEventReminderPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorSoundPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorCallsPreferenceController(context, lifecycle));
         controllers.add(new ZenModeBlockedEffectsPreferenceController(context, lifecycle));
         controllers.add(new ZenModeDurationPreferenceController(context, lifecycle,
                 fragmentManager));
@@ -95,19 +100,63 @@
 
         // these should match NotificationManager.Policy#ALL_PRIORITY_CATEGORIES
         private static final int[] ALL_PRIORITY_CATEGORIES = {
-                Policy.PRIORITY_CATEGORY_ALARMS,
-                Policy.PRIORITY_CATEGORY_MEDIA,
-                Policy.PRIORITY_CATEGORY_SYSTEM,
-                Policy.PRIORITY_CATEGORY_REMINDERS,
-                Policy.PRIORITY_CATEGORY_EVENTS,
-                Policy.PRIORITY_CATEGORY_MESSAGES,
-                Policy.PRIORITY_CATEGORY_CALLS,
-                Policy.PRIORITY_CATEGORY_REPEAT_CALLERS,
+                PRIORITY_CATEGORY_ALARMS,
+                PRIORITY_CATEGORY_MEDIA,
+                PRIORITY_CATEGORY_SYSTEM,
+                PRIORITY_CATEGORY_MESSAGES,
+                PRIORITY_CATEGORY_EVENTS,
+                PRIORITY_CATEGORY_REMINDERS,
+                PRIORITY_CATEGORY_CALLS,
+                PRIORITY_CATEGORY_REPEAT_CALLERS,
         };
 
-        String getBehaviorSettingSummary(Policy policy, int zenMode) {
-            List<String> enabledCategories = getEnabledCategories(policy);
+        String getSoundSettingSummary(Policy policy) {
+            List<String> enabledCategories = getEnabledCategories(policy,
+                    category -> PRIORITY_CATEGORY_ALARMS == category
+                            || PRIORITY_CATEGORY_MEDIA == category
+                            || PRIORITY_CATEGORY_SYSTEM == category);
+            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());
+            } else if (numCategories == 2) {
+                return mContext.getString(R.string.zen_sound_two_allowed,
+                        enabledCategories.get(0).toLowerCase(),
+                        enabledCategories.get(1).toLowerCase());
+            } 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());
+            } else {
+                return mContext.getString(R.string.zen_sound_none_muted);
+            }
+        }
 
+        String getCallsSettingSummary(Policy policy) {
+            List<String> enabledCategories = getEnabledCategories(policy,
+                    category -> PRIORITY_CATEGORY_CALLS == category
+                            || PRIORITY_CATEGORY_REPEAT_CALLERS == category);
+            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());
+            } else {
+                return mContext.getString(R.string.zen_mode_calls_summary_two,
+                        enabledCategories.get(0).toLowerCase(),
+                        enabledCategories.get(1).toLowerCase());
+            }
+        }
+
+        String getMsgEventReminderSettingSummary(Policy policy) {
+            List<String> enabledCategories = getEnabledCategories(policy,
+                    category -> PRIORITY_CATEGORY_EVENTS == category
+                            || PRIORITY_CATEGORY_REMINDERS == category
+                            || PRIORITY_CATEGORY_MESSAGES == category);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
                 return mContext.getString(R.string.zen_mode_no_exceptions);
@@ -193,22 +242,19 @@
             return count;
         }
 
-        private List<String> getEnabledCategories(Policy policy) {
+        private List<String> getEnabledCategories(Policy policy,
+                Predicate<Integer> filteredCategories) {
             List<String> enabledCategories = new ArrayList<>();
             for (int category : ALL_PRIORITY_CATEGORIES) {
-                if (isCategoryEnabled(policy, category)) {
-                    if (category == Policy.PRIORITY_CATEGORY_ALARMS) {
+                if (filteredCategories.test(category) && isCategoryEnabled(policy, category)) {
+                    if (category == PRIORITY_CATEGORY_ALARMS) {
                         enabledCategories.add(mContext.getString(R.string.zen_mode_alarms));
-                    } else if (category == Policy.PRIORITY_CATEGORY_MEDIA) {
+                    } else if (category == PRIORITY_CATEGORY_MEDIA) {
                         enabledCategories.add(mContext.getString(
                                 R.string.zen_mode_media));
-                    } else if (category == Policy.PRIORITY_CATEGORY_SYSTEM) {
+                    } else if (category == PRIORITY_CATEGORY_SYSTEM) {
                         enabledCategories.add(mContext.getString(
                                 R.string.zen_mode_system));
-                    } else if (category == Policy.PRIORITY_CATEGORY_REMINDERS) {
-                        enabledCategories.add(mContext.getString(R.string.zen_mode_reminders));
-                    } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) {
-                        enabledCategories.add(mContext.getString(R.string.zen_mode_events));
                     } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) {
                         if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
                             enabledCategories.add(mContext.getString(
@@ -217,13 +263,20 @@
                             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_selected_callers));
+                                    R.string.zen_mode_starred_callers));
                         }
                     } else if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) {
                         if (!enabledCategories.contains(mContext.getString(
@@ -240,10 +293,6 @@
         private boolean isCategoryEnabled(Policy policy, int categoryType) {
             return (policy.priorityCategories & categoryType) != 0;
         }
-
-        private boolean isEffectSuppressed(Policy policy, int effect) {
-            return (policy.suppressedVisualEffects & effect) != 0;
-        }
     }
 
     /**
diff --git a/src/com/android/settings/notification/ZenModeBehaviorSettings.java b/src/com/android/settings/notification/ZenModeSoundVibrationSettings.java
similarity index 75%
copy from src/com/android/settings/notification/ZenModeBehaviorSettings.java
copy to src/com/android/settings/notification/ZenModeSoundVibrationSettings.java
index 31542c3..d100e12 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorSettings.java
+++ b/src/com/android/settings/notification/ZenModeSoundVibrationSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Indexable {
+public class ZenModeSoundVibrationSettings extends ZenModeSettingsBase implements Indexable {
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
@@ -42,20 +42,14 @@
         controllers.add(new ZenModeAlarmsPreferenceController(context, lifecycle));
         controllers.add(new ZenModeMediaPreferenceController(context, lifecycle));
         controllers.add(new ZenModeSystemPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeEventsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeRemindersPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeMessagesPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeCallsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeRepeatCallersPreferenceController(context, lifecycle,
-                context.getResources().getInteger(com.android.internal.R.integer
-                .config_zen_repeat_callers_threshold)));
-        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle));
+        controllers.add(new ZenModeBehaviorFooterPreferenceController(context, lifecycle,
+                R.string.zen_sound_footer));
         return controllers;
     }
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.zen_mode_behavior_settings;
+        return R.xml.zen_mode_sound_vibration_settings;
     }
 
     @Override
@@ -66,7 +60,7 @@
     /**
      * For Search.
      */
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
 
                 @Override
@@ -75,7 +69,7 @@
                     final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.zen_mode_behavior_settings;
+                    sir.xmlResId = R.xml.zen_mode_sound_vibration_settings;
                     result.add(sir);
                     return result;
                 }
diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
index d5e4eb9..0001c7d 100644
--- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java
+++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
@@ -75,10 +75,12 @@
 import com.android.settings.notification.ConfigureNotificationSettings;
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.notification.ZenModeAutomationSettings;
-import com.android.settings.notification.ZenModeBehaviorSettings;
+import com.android.settings.notification.ZenModeCallsSettings;
+import com.android.settings.notification.ZenModeMsgEventReminderSettings;
 import com.android.settings.notification.ZenModeBlockedEffectsSettings;
 import com.android.settings.notification.ZenModeRestrictNotificationsSettings;
 import com.android.settings.notification.ZenModeSettings;
+import com.android.settings.notification.ZenModeSoundVibrationSettings;
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.security.EncryptionAndCredential;
 import com.android.settings.security.LockscreenDashboardFragment;
@@ -178,7 +180,9 @@
         addIndex(LockscreenDashboardFragment.class);
         addIndex(UsbDetailsFragment.class);
         addIndex(WifiDisplaySettings.class);
-        addIndex(ZenModeBehaviorSettings.class);
+        addIndex(ZenModeMsgEventReminderSettings.class);
+        addIndex(ZenModeCallsSettings.class);
+        addIndex(ZenModeSoundVibrationSettings.class);
         addIndex(ZenModeBlockedEffectsSettings.class);
         addIndex(ZenModeAutomationSettings.class);
         addIndex(ZenModeRestrictNotificationsSettings.class);
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index edb2512..0a4d51b 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -30,13 +30,16 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.net.Uri;
+import android.provider.Settings;
 import android.provider.SettingsSlicesContract;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Pair;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.SubSettings;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.SliderPreferenceController;
@@ -75,6 +78,7 @@
      * {@param sliceData} is an inline controller.
      */
     public static Slice buildSlice(Context context, SliceData sliceData) {
+        Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController());
         final BasePreferenceController controller = getPreferenceController(context, sliceData);
         final Pair<Integer, Object> sliceNamePair =
                 Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey());
@@ -177,8 +181,7 @@
      * @return {@link PendingIntent} to the Settings home page.
      */
     public static PendingIntent getSettingsIntent(Context context) {
-        final PackageManager manager = context.getPackageManager();
-        final Intent intent = manager.getLaunchIntentForPackage(context.getPackageName());
+        final Intent intent = new Intent(Settings.ACTION_SETTINGS);
         return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
     }
 
diff --git a/tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
new file mode 100644
index 0000000..8553f11
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import com.android.settings.widget.SeekBarPreference;
+
+import com.android.settings.slices.SliceData;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SettingsSliderPreferenceControllerTest {
+
+    private FakeSliderPreferenceController mSliderController;
+
+    private SeekBarPreference mPreference;
+
+    @Before
+    public void setUp() {
+        mPreference = new SeekBarPreference(RuntimeEnvironment.application);
+        mSliderController = new FakeSliderPreferenceController(RuntimeEnvironment.application,
+                "key");
+
+        mPreference.setContinuousUpdates(true);
+        mPreference.setMax(mSliderController.getMaxSteps());
+    }
+
+    @Test
+    public void onPreferenceChange_updatesPosition() {
+        final int newValue = 28;
+
+        mSliderController.onPreferenceChange(mPreference, newValue);
+
+        assertThat(mSliderController.getSliderPosition()).isEqualTo(newValue);
+    }
+
+    @Test
+    public void updateState_setsPreferenceToCurrentValue() {
+        final int newValue = 28;
+        mSliderController.setSliderPosition(newValue);
+
+        mSliderController.updateState(mPreference);
+
+        assertThat(mPreference.getProgress()).isEqualTo(newValue);
+    }
+
+    @Test
+    public void testSliceType_returnsSliceType() {
+        assertThat(mSliderController.getSliceType()).isEqualTo(
+                SliceData.SliceType.SLIDER);
+    }
+
+    private class FakeSliderPreferenceController extends SliderPreferenceController {
+
+        private final int MAX_STEPS = 2112;
+        private int mPosition;
+
+        public FakeSliderPreferenceController(Context context, String key) {
+            super(context, key);
+        }
+
+        @Override
+        public int getSliderPosition() {
+            return mPosition;
+        }
+
+        @Override
+        public boolean setSliderPosition(int position) {
+            mPosition = position;
+            return true;
+        }
+
+        @Override
+        public int getMaxSteps() {
+            return MAX_STEPS;
+        }
+
+        @Override
+        public int getAvailabilityStatus() {
+            return AVAILABLE;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java
index f9f656e..2d598c5 100644
--- a/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java
@@ -30,10 +30,10 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class SliderPreferenceControllerTest {
 
-    FakeSlider mSliderController;
+    private FakeSlider mSliderController;
 
-    Context mContext;
-    SeekBarPreference mPreference;
+    private Context mContext;
+    private SeekBarPreference mPreference;
 
     @Before
     public void setUp() {
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayActivationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayActivationPreferenceControllerTest.java
new file mode 100644
index 0000000..88adc51
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayActivationPreferenceControllerTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings.Secure;
+import android.support.v7.preference.PreferenceScreen;
+
+import android.view.View;
+import com.android.settings.R;
+import com.android.settings.applications.LayoutPreference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayActivationPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mScreen;
+    private LayoutPreference mPreference;
+    private Context mContext;
+    private NightDisplayActivationPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new LayoutPreference(mContext, R.layout.night_display_activation_button);
+        when(mScreen.findPreference(anyString())).thenReturn(mPreference);
+        mController = new NightDisplayActivationPreferenceController(mContext,
+            "night_display_activation");
+        mController.displayPreference(mScreen);
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void onClick_activates() {
+        Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, 0);
+
+        final View view = mPreference.findViewById(R.id.night_display_turn_on_button);
+        assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
+        view.performClick();
+
+        assertThat(Secure.getInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, -1))
+                .isEqualTo(1);
+    }
+
+    @Test
+    public void onClick_deactivates() {
+        Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, 1);
+
+        final View view = mPreference.findViewById(R.id.night_display_turn_on_button);
+        assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
+        view.performClick();
+
+        assertThat(Secure.getInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, -1))
+                .isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayAutoModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayAutoModePreferenceControllerTest.java
new file mode 100644
index 0000000..20b0380
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayAutoModePreferenceControllerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings.Secure;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayAutoModePreferenceControllerTest {
+
+    private Context mContext;
+    private NightDisplayAutoModePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mController = new NightDisplayAutoModePreferenceController(mContext,
+            "night_display_auto_mode");
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void onPreferenceChange_changesAutoMode() {
+        mController.onPreferenceChange(null,
+                String.valueOf(ColorDisplayController.AUTO_MODE_TWILIGHT));
+        assertThat(Secure.getInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, -1))
+                .isEqualTo(ColorDisplayController.AUTO_MODE_TWILIGHT);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceControllerTest.java
new file mode 100644
index 0000000..ed6618b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceControllerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayCustomEndTimePreferenceControllerTest {
+
+    private NightDisplayCustomEndTimePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mController = new NightDisplayCustomEndTimePreferenceController(
+                RuntimeEnvironment.application, "night_display_end_time");
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceControllerTest.java
new file mode 100644
index 0000000..c413000
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceControllerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayCustomStartTimePreferenceControllerTest {
+
+    private NightDisplayCustomStartTimePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mController = new NightDisplayCustomStartTimePreferenceController(
+                RuntimeEnvironment.application, "night_display_start_time");
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java
new file mode 100644
index 0000000..8168c20
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayFooterPreferenceControllerTest {
+
+    private NightDisplayFooterPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mController = new NightDisplayFooterPreferenceController(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayIntensityPreferenceControllerTest.java
new file mode 100644
index 0000000..1a69b6b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayIntensityPreferenceControllerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings.Secure;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.class)
+public class NightDisplayIntensityPreferenceControllerTest {
+
+    private Context mContext;
+    private NightDisplayIntensityPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mController = new NightDisplayIntensityPreferenceController(mContext,
+            "night_display_temperature");
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable_isActivated_available() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, 1);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredAvailable_isNotActivated_available() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, true);
+        Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, 0);
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_configuredUnavailable_unavailable() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.bool.config_nightDisplayAvailable, false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void onPreferenceChange_changesTemperature() {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.integer.config_nightDisplayColorTemperatureMin, 2950);
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.integer.config_nightDisplayColorTemperatureMax, 3050);
+        // A slider-adjusted "20" here would be 1/5 from the left / least-intense, i.e. 3030.
+        mController.onPreferenceChange(null, 20);
+
+        assertThat(Secure.getInt(mContext.getContentResolver(),
+                Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, -1))
+                .isEqualTo(3030);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index d6fad34..f159e79 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -23,11 +23,14 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -37,7 +40,9 @@
 
 import android.app.StatsManager;
 import android.app.job.JobInfo;
+import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
+import android.app.job.JobWorkItem;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -55,6 +60,7 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowConnectivityManager;
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 
 import org.junit.Before;
@@ -62,8 +68,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
+import org.robolectric.android.controller.ServiceController;
+import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowJobScheduler;
 
 import java.util.ArrayList;
@@ -71,6 +80,7 @@
 import java.util.concurrent.TimeUnit;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = ShadowConnectivityManager.class)
 public class AnomalyDetectionJobServiceTest {
     private static final int UID = 12345;
     private static final String SYSTEM_PACKAGE = "com.android.system";
@@ -92,6 +102,10 @@
     private PowerWhitelistBackend mPowerWhitelistBackend;
     @Mock
     private StatsDimensionsValue mStatsDimensionsValue;
+    @Mock
+    private JobParameters mJobParameters;
+    @Mock
+    private JobWorkItem mJobWorkItem;
 
     private BatteryTipPolicy mPolicy;
     private Bundle mBundle;
@@ -110,11 +124,14 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         when(mBatteryUtils.getAppLongVersionCode(any())).thenReturn(VERSION_CODE);
 
-        mAnomalyDetectionJobService = spy(new AnomalyDetectionJobService());
+        final ServiceController<AnomalyDetectionJobService> controller =
+                Robolectric.buildService(AnomalyDetectionJobService.class);
+        mAnomalyDetectionJobService = spy(controller.get());
+        doNothing().when(mAnomalyDetectionJobService).jobFinished(any(), anyBoolean());
     }
 
     @Test
-    public void testScheduleCleanUp() {
+    public void scheduleCleanUp() {
         AnomalyDetectionJobService.scheduleAnomalyDetection(application, new Intent());
 
         ShadowJobScheduler shadowJobScheduler =
@@ -129,7 +146,7 @@
     }
 
     @Test
-    public void testSaveAnomalyToDatabase_systemWhitelisted_doNotSave() {
+    public void saveAnomalyToDatabase_systemWhitelisted_doNotSave() {
         doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
         doReturn(true).when(mPowerWhitelistBackend).isSysWhitelistedExceptIdle(any(String[].class));
 
@@ -144,7 +161,7 @@
     }
 
     @Test
-    public void testSaveAnomalyToDatabase_systemApp_doNotSaveButLog() {
+    public void saveAnomalyToDatabase_systemApp_doNotSaveButLog() {
         final ArrayList<String> cookies = new ArrayList<>();
         cookies.add(SUBSCRIBER_COOKIES_AUTO_RESTRICTION);
         mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
@@ -170,7 +187,7 @@
     }
 
     @Test
-    public void testSaveAnomalyToDatabase_systemUid_doNotSave() {
+    public void saveAnomalyToDatabase_systemUid_doNotSave() {
         doReturn(Process.SYSTEM_UID).when(
                 mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
 
@@ -185,7 +202,7 @@
     }
 
     @Test
-    public void testSaveAnomalyToDatabase_uidNull_doNotSave() {
+    public void saveAnomalyToDatabase_uidNull_doNotSave() {
         doReturn(AnomalyDetectionJobService.UID_NULL).when(
                 mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
 
@@ -200,7 +217,7 @@
     }
 
     @Test
-    public void testSaveAnomalyToDatabase_normalAppWithAutoRestriction_save() {
+    public void saveAnomalyToDatabase_normalAppWithAutoRestriction_save() {
         final ArrayList<String> cookies = new ArrayList<>();
         cookies.add(SUBSCRIBER_COOKIES_AUTO_RESTRICTION);
         mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
@@ -224,9 +241,8 @@
                 Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
     }
 
-
     @Test
-    public void testSaveAnomalyToDatabase_normalAppWithoutAutoRestriction_save() {
+    public void saveAnomalyToDatabase_normalAppWithoutAutoRestriction_save() {
         final ArrayList<String> cookies = new ArrayList<>();
         cookies.add(SUBSCRIBER_COOKIES_NOT_AUTO_RESTRICTION);
         mBundle.putStringArrayList(StatsManager.EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES, cookies);
@@ -251,7 +267,7 @@
     }
 
     @Test
-    public void testExtractUidFromStatsDimensionsValue_extractCorrectUid() {
+    public void extractUidFromStatsDimensionsValue_extractCorrectUid() {
         // Build an integer dimensions value.
         final StatsDimensionsValue intValue = mock(StatsDimensionsValue.class);
         when(intValue.isValueType(INT_VALUE_TYPE)).thenReturn(true);
@@ -270,7 +286,7 @@
     }
 
     @Test
-    public void testExtractUidFromStatsDimensionsValue_wrongFormat_returnNull() {
+    public void extractUidFromStatsDimensionsValue_wrongFormat_returnNull() {
         // Build a float dimensions value
         final StatsDimensionsValue floatValue = mock(StatsDimensionsValue.class);
         when(floatValue.isValueType(FLOAT_VALUE_TYPE)).thenReturn(true);
@@ -280,4 +296,24 @@
         assertThat(mAnomalyDetectionJobService.extractUidFromStatsDimensionsValue(
                 floatValue)).isEqualTo(AnomalyDetectionJobService.UID_NULL);
     }
+
+    @Test
+    public void stopJobWhileDequeuingWork_shouldNotCrash() {
+        when(mJobParameters.dequeueWork()).thenThrow(new SecurityException());
+
+        mAnomalyDetectionJobService.onStopJob(mJobParameters);
+
+        // Should not crash even job is stopped
+        mAnomalyDetectionJobService.dequeueWork(mJobParameters);
+    }
+
+    @Test
+    public void stopJobWhileCompletingWork_shouldNotCrash() {
+        doThrow(new SecurityException()).when(mJobParameters).completeWork(any());
+
+        mAnomalyDetectionJobService.onStopJob(mJobParameters);
+
+        // Should not crash even job is stopped
+        mAnomalyDetectionJobService.completeWork(mJobParameters, mJobWorkItem);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index 1de1e48..7a41921 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -199,7 +199,7 @@
     }
 
     @Test
-    public void testOnCreateDialog_summaryTipWithEstimation_fireDialogWithEstimation() {
+    public void testOnCreateDialog_summaryTip_fireDialog() {
         doReturn(AVERAGE_TIME_MS).when(mSummaryTip).getAverageTimeMs();
         mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY);
 
@@ -209,20 +209,8 @@
         ShadowAlertDialog shadowDialog = shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
-                "Based on your usage, your battery usually lasts about 1 hr when fully charged"
-                        + ".\n\nIf you need to extend your battery life, turn on Battery Saver.");
-    }
-
-    @Test
-    public void testOnCreateDialog_summaryTipWithoutEstimation_fireDialogWithoutEstimation() {
-        mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY);
-
-        FragmentTestUtil.startFragment(mDialogFragment);
-
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                "If you need to extend your battery life, turn on Battery Saver");
+                "Your apps are using a normal amount of battery. If apps use too much battery, "
+                        + "your phone will suggest actions you can take.\n\nYou can always turn"
+                        + " on Battery Saver if you’re running low on battery.");
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index 90d00fc..ba829b1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -37,6 +37,7 @@
 import android.text.format.DateUtils;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
@@ -181,7 +182,9 @@
         assertThat(preferenceGroup.getPreferenceCount()).isEqualTo(1);
 
         final Preference preference = preferenceGroup.getPreference(0);
-        assertThat(preference.getTitle()).isEqualTo("Battery is in good shape");
-        assertThat(preference.getSummary()).isEqualTo("Apps are running normally");
+        assertThat(preference.getTitle()).isEqualTo(
+                mContext.getString(R.string.battery_tip_summary_title));
+        assertThat(preference.getSummary()).isEqualTo(
+                mContext.getString(R.string.battery_tip_summary_summary));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceControllerTest.java
new file mode 100644
index 0000000..70e7919
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorCallsPreferenceControllerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public final class ZenModeBehaviorCallsPreferenceControllerTest {
+
+    private ZenModeBehaviorCallsPreferenceController mController;
+    @Mock
+    private NotificationManager mNotificationManager;
+    @Mock
+    private NotificationManager.Policy mPolicy;
+
+    private Context mContext;
+    @Mock
+    private ZenModeBackend mBackend;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplication shadowApplication = ShadowApplication.getInstance();
+        shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
+
+        mContext = RuntimeEnvironment.application;
+        when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
+
+        mController = new ZenModeBehaviorCallsPreferenceController(
+                mContext, mock(Lifecycle.class));
+        ReflectionHelpers.setField(mController, "mBackend", mBackend);
+    }
+
+    @Test
+    public void testIsAvailable() {
+        assertTrue(mController.isAvailable());
+    }
+
+    @Test
+    public void testHasSummary() {
+        Preference pref = mock(Preference.class);
+        mController.updateState(pref);
+        verify(pref).setSummary(any());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceControllerTest.java
index 2de559e..5020598 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorFooterPreferenceControllerTest.java
@@ -41,6 +41,7 @@
 import android.support.v7.preference.PreferenceScreen;
 import android.util.ArrayMap;
 
+import com.android.settings.R;
 import com.android.settings.notification.AbstractZenModePreferenceController.ZenModeConfigWrapper;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -77,6 +78,7 @@
 
     private Context mContext;
     private ContentResolver mContentResolver;
+    private int mTitleResId = R.string.zen_sound_title;
 
     @Before
     public void setup() {
@@ -88,8 +90,8 @@
         mContentResolver = RuntimeEnvironment.application.getContentResolver();
         when(mNotificationManager.getZenModeConfig()).thenReturn(mZenModeConfig);
 
-        mController =
-            new ZenModeBehaviorFooterPreferenceController(mContext, mock(Lifecycle.class));
+        mController = new ZenModeBehaviorFooterPreferenceController(
+                mContext, mock(Lifecycle.class), mTitleResId);
         ReflectionHelpers.setField(mController, "mZenModeConfigWrapper", mConfigWrapper);
 
         when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
@@ -112,13 +114,13 @@
     @Test
     public void priorityOnly_footerIsAvailable() {
         Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
-    public void zenModeOff_footerIsNotAvailable() {
+    public void zenModeOff_footerIsAvailable() {
         Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_OFF);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
@@ -126,7 +128,7 @@
         Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_OFF);
         mController.updateState(mockPref);
 
-        verify(mockPref, never()).setTitle(any(String.class));
+        verify(mockPref).setTitle(mContext.getString(mTitleResId));
     }
 
     @Test
@@ -134,7 +136,7 @@
         Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_IMPORTANT_INTERRUPTIONS);
         mController.updateState(mockPref);
 
-        verify(mockPref, never()).setTitle(any(String.class));
+        verify(mockPref).setTitle(mContext.getString(mTitleResId));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceControllerTest.java
new file mode 100644
index 0000000..afd9f71
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorMsgEventReminderPreferenceControllerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public final class ZenModeBehaviorMsgEventReminderPreferenceControllerTest {
+
+    private ZenModeBehaviorMsgEventReminderPreferenceController mController;
+    @Mock
+    private NotificationManager mNotificationManager;
+    @Mock
+    private NotificationManager.Policy mPolicy;
+
+    private Context mContext;
+    @Mock
+    private ZenModeBackend mBackend;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplication shadowApplication = ShadowApplication.getInstance();
+        shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
+
+        mContext = RuntimeEnvironment.application;
+        when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
+
+        mController = new ZenModeBehaviorMsgEventReminderPreferenceController(
+                mContext, mock(Lifecycle.class));
+        ReflectionHelpers.setField(mController, "mBackend", mBackend);
+    }
+
+    @Test
+    public void testIsAvailable() {
+        assertTrue(mController.isAvailable());
+    }
+
+    @Test
+    public void testHasSummary() {
+        Preference pref = mock(Preference.class);
+        mController.updateState(pref);
+        verify(pref).setSummary(any());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceControllerTest.java
new file mode 100644
index 0000000..a561271
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeBehaviorSoundPreferenceControllerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public final class ZenModeBehaviorSoundPreferenceControllerTest {
+
+    private ZenModeBehaviorSoundPreferenceController mController;
+    @Mock
+    private NotificationManager mNotificationManager;
+    @Mock
+    private NotificationManager.Policy mPolicy;
+
+    private Context mContext;
+    @Mock
+    private ZenModeBackend mBackend;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplication shadowApplication = ShadowApplication.getInstance();
+        shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
+
+        mContext = RuntimeEnvironment.application;
+        when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
+
+        mController = new ZenModeBehaviorSoundPreferenceController(
+                mContext, mock(Lifecycle.class));
+        ReflectionHelpers.setField(mController, "mBackend", mBackend);
+    }
+
+    @Test
+    public void testIsAvailable() {
+        assertTrue(mController.isAvailable());
+    }
+
+    @Test
+    public void testHasSummary() {
+        Preference pref = mock(Preference.class);
+        mController.updateState(pref);
+        verify(pref).setSummary(any());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
index b26989d..5b2782f 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
@@ -20,9 +20,9 @@
 import static junit.framework.Assert.assertEquals;
 
 import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
 import android.content.Context;
 import android.provider.SearchIndexableResource;
-import android.provider.Settings;
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -47,54 +47,140 @@
     }
 
     @Test
-    public void testGetBehaviorSettingSummary_noSoundsCanBypass() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(0, 0, 0);
-        final String result = mBuilder.getBehaviorSettingSummary(policy,
-                Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        String totalSilence = mContext.getString(R.string.zen_mode_no_exceptions);
-        assertEquals(totalSilence, result);
-    }
-
-    @Test
-    public void testGetBehaviorSettingSummary_alarmsAndMedia() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(
-                        NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS
-                        | NotificationManager.Policy.PRIORITY_CATEGORY_MEDIA,
-                0, 0);
-        final String result = mBuilder.getBehaviorSettingSummary(policy,
-                Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-
-        String alarmsAndMedia = mContext.getString(R.string.join_two_items,
-                mContext.getString(R.string.zen_mode_alarms),
-                mContext.getString(R.string.zen_mode_media).toLowerCase());
-        assertEquals(alarmsAndMedia, result);
-    }
-
-    @Test
     public void testBlockedEffectsSummary_none() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(0, 0, 0, 0);
+        Policy policy = new Policy(0, 0, 0, 0);
         assertEquals(mContext.getString(R.string.zen_mode_restrict_notifications_summary_muted),
                 mBuilder.getBlockedEffectsSummary(policy));
     }
 
     @Test
     public void testBlockedEffectsSummary_some() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(
-                0, 0, 0, NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK);
+        Policy policy = new Policy(0, 0, 0, NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK);
         assertEquals(mContext.getString(R.string.zen_mode_restrict_notifications_summary_custom),
                 mBuilder.getBlockedEffectsSummary(policy));
     }
 
     @Test
     public void testBlockedEffectsSummary_all() {
-        NotificationManager.Policy policy = new NotificationManager.Policy(
-                0, 0, 0, 511);
+        Policy policy = new Policy(0, 0, 0, 511);
         assertEquals(mContext.getString(R.string.zen_mode_restrict_notifications_summary_hidden),
                 mBuilder.getBlockedEffectsSummary(policy));
     }
 
     @Test
+    public void testGetMsgEventReminderSettingSummary_none() {
+        Policy policy = new Policy(0, 0, 0, 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy)).isEqualTo("None");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_single() {
+        Policy policy = new Policy(
+                Policy.PRIORITY_CATEGORY_ALARMS | Policy.PRIORITY_CATEGORY_EVENTS, 0 , 0 , 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy)).isEqualTo("Events");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_someMsgs() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_MESSAGES, 0,
+                Policy.PRIORITY_SENDERS_CONTACTS , 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy)).isEqualTo("Some messages");
+
+        policy = new Policy(Policy.PRIORITY_CATEGORY_MESSAGES, 0,
+                Policy.PRIORITY_SENDERS_STARRED , 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy)).isEqualTo("Some messages");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_msgs() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_MESSAGES, 0, 0, 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy)).isEqualTo("Messages");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_someMsgsAndOther() {
+        Policy policy = new Policy(
+                Policy.PRIORITY_CATEGORY_MESSAGES | Policy.PRIORITY_CATEGORY_REMINDERS,
+                0, Policy.PRIORITY_SENDERS_CONTACTS , 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy))
+                .isEqualTo("Some messages and reminders");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_someMsgsAndAllOthers() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_EVENTS
+                | Policy.PRIORITY_CATEGORY_MESSAGES | Policy.PRIORITY_CATEGORY_REMINDERS,
+                0, Policy.PRIORITY_SENDERS_CONTACTS , 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy))
+                .isEqualTo("Some messages, events, and reminders");
+    }
+
+    @Test
+    public void testGetMsgEventReminderSettingSummary_noMsgsAndOther() {
+        Policy policy = new Policy(
+                Policy.PRIORITY_CATEGORY_EVENTS | Policy.PRIORITY_CATEGORY_REMINDERS,
+                0,0, 0);
+        assertThat(mBuilder.getMsgEventReminderSettingSummary(policy))
+                .isEqualTo("Events and reminders");
+    }
+
+    @Test
+    public void testGetCallsSettingSummary_none() {
+        Policy policy = new Policy(0, 0, 0, 0);
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("None");
+    }
+
+    @Test
+    public void testGetCallsSettingSummary_contacts() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS | Policy.PRIORITY_CATEGORY_CALLS,
+                Policy.PRIORITY_SENDERS_CONTACTS, 0, 0);
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("From contacts only");
+    }
+
+    @Test
+    public void testGetCallsSettingSummary_repeatCallers() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_REPEAT_CALLERS, 0, 0, 0);
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("From repeat callers only");
+    }
+
+    @Test
+    public void testGetCallsSettingSummary_starredRepeatCallers() {
+        Policy policy = new Policy(
+                Policy.PRIORITY_CATEGORY_REPEAT_CALLERS | Policy.PRIORITY_CATEGORY_CALLS,
+                Policy.PRIORITY_SENDERS_STARRED, 0, 0);
+        assertThat(mBuilder.getCallsSettingSummary(policy))
+                .isEqualTo("From starred contacts and repeat callers");
+    }
+
+    @Test
+    public void testGetSoundSettingSummary_allOff() {
+        Policy policy = new Policy(0, 0, 0, 0);
+        assertThat(mBuilder.getSoundSettingSummary(policy)).isEqualTo("Muted");
+    }
+
+    @Test
+    public void testGetSoundSettingSummary_allOn() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS | Policy.PRIORITY_CATEGORY_SYSTEM
+                | Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0);
+        assertThat(mBuilder.getSoundSettingSummary(policy))
+                .isEqualTo("Muted, but allow alarms, media, and touch sounds");
+    }
+
+    @Test
+    public void testGetSoundSettingSummary_allOffButOne() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0);
+        assertThat(mBuilder.getSoundSettingSummary(policy)).isEqualTo("Muted, but allow media");
+    }
+
+    @Test
+    public void testGetSoundSettingSummary_allOffButTwo() {
+        Policy policy = new Policy(Policy.PRIORITY_CATEGORY_SYSTEM
+                | Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0);
+        assertThat(mBuilder.getSoundSettingSummary(policy))
+                .isEqualTo("Muted, but allow media and touch sounds");
+    }
+
+    @Test
     public void searchProvider_shouldIndexDefaultXml() {
         final List<SearchIndexableResource> sir = ZenModeSettings.SEARCH_INDEX_DATA_PROVIDER
                 .getXmlResourcesToIndex(mContext, true /* enabled */);
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 20bb5a0..a74e2ba 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -24,6 +24,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.app.PendingIntent;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -405,6 +406,16 @@
         assertThat(intentData).isEqualTo(expectedUri);
     }
 
+    @Test
+    public void getSettingsIntent_createsIntentToSettings() {
+        final Intent intent = new Intent(Settings.ACTION_SETTINGS);
+        final PendingIntent expectedIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
+
+        final PendingIntent settingsIntent = SliceBuilderUtils.getSettingsIntent(mContext);
+
+        assertThat(expectedIntent).isEqualTo(settingsIntent);
+    }
+
     private SliceData getDummyData() {
         return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH);
     }
