Merge "Checkpoint of new storage wizards."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e8c3f6e..83ea62a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -158,6 +158,17 @@
                 android:value="true" />
         </activity>
 
+        <activity android:name="AirplaneModeVoiceActivity"
+                android:label="@string/wireless_networks_settings_title"
+                android:theme="@android:style/Theme.Material.Light.Voice"
+                android:exported="true">
+            <intent-filter>
+                <action android:name="android.settings.VOICE_CONTROL_AIRPLANE_MODE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE" />
+            </intent-filter>
+        </activity>
+
         <!-- Top-level settings -->
 
         <activity android:name="Settings$WifiSettingsActivity"
@@ -696,6 +707,10 @@
                 <action android:name="android.settings.ZEN_MODE_AUTOMATION_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.ACTION_CONDITION_PROVIDER_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" />
@@ -729,6 +744,26 @@
                 android:value="true" />
         </activity>
 
+        <activity android:name="Settings$ZenModeExternalRuleSettingsActivity"
+                android:exported="true"
+                android:taskAffinity="">
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.ZEN_MODE_EXTERNAL_RULE_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" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.notification.ZenModeExternalRuleSettings" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/notification_settings" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                android:value="true" />
+        </activity>
+
         <activity android:name="Settings$HomeSettingsActivity"
                 android:label="@string/home_settings"
                 android:taskAffinity="">
@@ -972,6 +1007,16 @@
                 android:value="com.android.settings.notification.NotificationStation" />
         </activity>
 
+        <activity android:name=".notification.ZenModeVoiceActivity"
+                android:theme="@android:style/Theme.Material.Light"
+                android:label="@string/zen_mode_settings_title">
+            <intent-filter>
+                <action android:name="android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE" />
+            </intent-filter>
+        </activity>
+
         <!--
         <activity android:name="Settings$AppOpsSummaryActivity"
                 android:label="@string/app_ops_settings"
@@ -1299,10 +1344,12 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="ConfirmLockPattern"/>
+        <activity android:name="ConfirmLockPattern"
+            android:theme="@style/Theme.ConfirmDeviceCredentials"/>
 
         <activity android:name="ConfirmLockPassword"
-            android:windowSoftInputMode="stateVisible|adjustResize"/>
+            android:windowSoftInputMode="stateVisible|adjustResize"
+            android:theme="@style/Theme.ConfirmDeviceCredentials"/>
 
         <activity android:name="FingerprintSettings" android:exported="false"/>
         <activity android:name="FingerprintEnroll" android:exported="false"/>
@@ -1879,6 +1926,17 @@
                 android:value="true" />
         </activity>
 
+        <activity android:name=".fuelguage.BatterySaverModeVoiceActivity"
+                android:label="@string/power_usage_summary_title"
+                android:theme="@android:style/Theme.Material.Light.Voice"
+                android:exported="true">
+            <intent-filter>
+                <action android:name="android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="Settings$AccountSettingsActivity"
             android:label="@string/account_settings_title"
             android:taskAffinity=""
@@ -2106,23 +2164,6 @@
                        android:resource="@id/security_settings" />
         </activity>
 
-        <activity android:name="Settings$ConditionProviderSettingsActivity"
-                  android:label="@string/manage_condition_providers"
-                  android:taskAffinity="">
-            <intent-filter android:priority="1">
-                <action android:name="android.settings.ACTION_CONDITION_PROVIDER_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" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.notification.ConditionProviderSettings" />
-            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
-                       android:resource="@id/notification_settings" />
-        </activity>
-
         <activity android:name="Settings$NotificationSettingsActivity"
                 android:label="@string/notification_settings"
                 android:exported="true"
diff --git a/res/drawable-hdpi/ic_settings_about.png b/res/drawable-hdpi/ic_settings_about.png
deleted file mode 100644
index f4596ed..0000000
--- a/res/drawable-hdpi/ic_settings_about.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_about_alpha.png b/res/drawable-hdpi/ic_settings_about_alpha.png
new file mode 100644
index 0000000..1e38ba5
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_about_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_accessibility.png b/res/drawable-hdpi/ic_settings_accessibility.png
deleted file mode 100644
index 202ec9d..0000000
--- a/res/drawable-hdpi/ic_settings_accessibility.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_accessibility_alpha.png b/res/drawable-hdpi/ic_settings_accessibility_alpha.png
new file mode 100644
index 0000000..74ca88e
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_accessibility_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_accounts.png b/res/drawable-hdpi/ic_settings_accounts.png
deleted file mode 100644
index cdeb8b0..0000000
--- a/res/drawable-hdpi/ic_settings_accounts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_accounts_alpha.png b/res/drawable-hdpi/ic_settings_accounts_alpha.png
new file mode 100644
index 0000000..c36216c
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_accounts_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_applications.png b/res/drawable-hdpi/ic_settings_applications.png
deleted file mode 100644
index 627b7cb..0000000
--- a/res/drawable-hdpi/ic_settings_applications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_applications_alpha.png b/res/drawable-hdpi/ic_settings_applications_alpha.png
new file mode 100644
index 0000000..1c46133
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_applications_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_backup.png b/res/drawable-hdpi/ic_settings_backup.png
deleted file mode 100644
index 701b6cf..0000000
--- a/res/drawable-hdpi/ic_settings_backup.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_backup_alpha.png b/res/drawable-hdpi/ic_settings_backup_alpha.png
new file mode 100644
index 0000000..ef8acea
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_backup_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_battery.png b/res/drawable-hdpi/ic_settings_battery.png
deleted file mode 100644
index 75a2af9..0000000
--- a/res/drawable-hdpi/ic_settings_battery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_battery_alpha.png b/res/drawable-hdpi/ic_settings_battery_alpha.png
new file mode 100644
index 0000000..89013cf
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_battery_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_bluetooth.png b/res/drawable-hdpi/ic_settings_bluetooth.png
deleted file mode 100644
index 3d9015f..0000000
--- a/res/drawable-hdpi/ic_settings_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_bluetooth2.png b/res/drawable-hdpi/ic_settings_bluetooth2.png
deleted file mode 100644
index 9afe435..0000000
--- a/res/drawable-hdpi/ic_settings_bluetooth2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_bluetooth2_alpha.png b/res/drawable-hdpi/ic_settings_bluetooth2_alpha.png
new file mode 100644
index 0000000..9dbc509
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_bluetooth2_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_bluetooth_alpha.png b/res/drawable-hdpi/ic_settings_bluetooth_alpha.png
new file mode 100644
index 0000000..a21982e
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_bluetooth_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_data_usage.png b/res/drawable-hdpi/ic_settings_data_usage.png
deleted file mode 100644
index b274f4f..0000000
--- a/res/drawable-hdpi/ic_settings_data_usage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_data_usage_alpha.png b/res/drawable-hdpi/ic_settings_data_usage_alpha.png
new file mode 100644
index 0000000..68e0d8a
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_data_usage_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_date_time.png b/res/drawable-hdpi/ic_settings_date_time.png
deleted file mode 100644
index 5a84c33..0000000
--- a/res/drawable-hdpi/ic_settings_date_time.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_date_time_alpha.png b/res/drawable-hdpi/ic_settings_date_time_alpha.png
new file mode 100644
index 0000000..edea4ac
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_date_time_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_development.png b/res/drawable-hdpi/ic_settings_development.png
deleted file mode 100644
index 7f38de0..0000000
--- a/res/drawable-hdpi/ic_settings_development.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_development_alpha.png b/res/drawable-hdpi/ic_settings_development_alpha.png
new file mode 100644
index 0000000..44cfb57
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_development_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_display_am.png b/res/drawable-hdpi/ic_settings_display_am.png
deleted file mode 100644
index 24719b1..0000000
--- a/res/drawable-hdpi/ic_settings_display_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_display_am_alpha.png b/res/drawable-hdpi/ic_settings_display_am_alpha.png
new file mode 100644
index 0000000..7b8f909
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_display_am_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_dock.png b/res/drawable-hdpi/ic_settings_dock.png
deleted file mode 100644
index bdeaee7..0000000
--- a/res/drawable-hdpi/ic_settings_dock.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_dock_alpha.png b/res/drawable-hdpi/ic_settings_dock_alpha.png
new file mode 100644
index 0000000..98ef4e8
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_dock_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_home.png b/res/drawable-hdpi/ic_settings_home.png
deleted file mode 100644
index 6a0564a..0000000
--- a/res/drawable-hdpi/ic_settings_home.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_home_alpha.png b/res/drawable-hdpi/ic_settings_home_alpha.png
new file mode 100644
index 0000000..4ab9ae0
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_home_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_language.png b/res/drawable-hdpi/ic_settings_language.png
deleted file mode 100644
index e27035a..0000000
--- a/res/drawable-hdpi/ic_settings_language.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_language_alpha.png b/res/drawable-hdpi/ic_settings_language_alpha.png
new file mode 100644
index 0000000..5a65a5b
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_language_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_location.png b/res/drawable-hdpi/ic_settings_location.png
deleted file mode 100644
index 968253c..0000000
--- a/res/drawable-hdpi/ic_settings_location.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_location_alpha.png b/res/drawable-hdpi/ic_settings_location_alpha.png
new file mode 100644
index 0000000..f90ce84
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_location_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_more.png b/res/drawable-hdpi/ic_settings_more.png
deleted file mode 100644
index 61bb00c..0000000
--- a/res/drawable-hdpi/ic_settings_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_more_alpha.png b/res/drawable-hdpi/ic_settings_more_alpha.png
new file mode 100644
index 0000000..38255a2
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_more_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_multiuser.png b/res/drawable-hdpi/ic_settings_multiuser.png
deleted file mode 100644
index c1a6e63..0000000
--- a/res/drawable-hdpi/ic_settings_multiuser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_multiuser_alpha.png b/res/drawable-hdpi/ic_settings_multiuser_alpha.png
new file mode 100644
index 0000000..c2efeba
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_multiuser_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_nfc_payment_am.png b/res/drawable-hdpi/ic_settings_nfc_payment_am.png
deleted file mode 100644
index 7431cb0..0000000
--- a/res/drawable-hdpi/ic_settings_nfc_payment_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_nfc_payment_am_alpha.png b/res/drawable-hdpi/ic_settings_nfc_payment_am_alpha.png
new file mode 100644
index 0000000..0a71416
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_nfc_payment_am_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_notifications.png b/res/drawable-hdpi/ic_settings_notifications.png
deleted file mode 100644
index 6dd91bb..0000000
--- a/res/drawable-hdpi/ic_settings_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_notifications_alpha.png b/res/drawable-hdpi/ic_settings_notifications_alpha.png
new file mode 100644
index 0000000..fd6df67
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_notifications_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_print.png b/res/drawable-hdpi/ic_settings_print.png
deleted file mode 100644
index 62624ee..0000000
--- a/res/drawable-hdpi/ic_settings_print.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_print_alpha.png b/res/drawable-hdpi/ic_settings_print_alpha.png
new file mode 100644
index 0000000..06f8dac
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_print_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_security.png b/res/drawable-hdpi/ic_settings_security.png
deleted file mode 100644
index abbf3fa..0000000
--- a/res/drawable-hdpi/ic_settings_security.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_security_alpha.png b/res/drawable-hdpi/ic_settings_security_alpha.png
new file mode 100644
index 0000000..33c9505
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_security_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_sound.png b/res/drawable-hdpi/ic_settings_sound.png
deleted file mode 100644
index dec290a..0000000
--- a/res/drawable-hdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_sound_alpha.png b/res/drawable-hdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..beac382
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_storage.png b/res/drawable-hdpi/ic_settings_storage.png
deleted file mode 100644
index 5444eeb..0000000
--- a/res/drawable-hdpi/ic_settings_storage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_storage_alpha.png b/res/drawable-hdpi/ic_settings_storage_alpha.png
new file mode 100644
index 0000000..a25da20
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_storage_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_sync.png b/res/drawable-hdpi/ic_settings_sync.png
deleted file mode 100644
index 96254d6..0000000
--- a/res/drawable-hdpi/ic_settings_sync.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_sync_alpha.png b/res/drawable-hdpi/ic_settings_sync_alpha.png
new file mode 100644
index 0000000..f7c0cc2
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_sync_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_wifi.png b/res/drawable-hdpi/ic_settings_wifi.png
deleted file mode 100644
index b8c3eaa..0000000
--- a/res/drawable-hdpi/ic_settings_wifi.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_wifi_alpha.png b/res/drawable-hdpi/ic_settings_wifi_alpha.png
new file mode 100644
index 0000000..a21982e
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_wifi_alpha.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_wireless.png b/res/drawable-hdpi/ic_settings_wireless.png
deleted file mode 100644
index 5c82e8b..0000000
--- a/res/drawable-hdpi/ic_settings_wireless.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_wireless_alpha.png b/res/drawable-hdpi/ic_settings_wireless_alpha.png
new file mode 100644
index 0000000..e5ad5ba
--- /dev/null
+++ b/res/drawable-hdpi/ic_settings_wireless_alpha.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_settings_sound.png b/res/drawable-ldrtl-hdpi/ic_settings_sound.png
deleted file mode 100755
index b703b4e..0000000
--- a/res/drawable-ldrtl-hdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_settings_sound_alpha.png b/res/drawable-ldrtl-hdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..cebb01f
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_settings_sound.png b/res/drawable-ldrtl-mdpi/ic_settings_sound.png
deleted file mode 100644
index 419868f..0000000
--- a/res/drawable-ldrtl-mdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_settings_sound_alpha.png b/res/drawable-ldrtl-mdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..c7fe326
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_settings_sound.png b/res/drawable-ldrtl-xhdpi/ic_settings_sound.png
deleted file mode 100644
index 8d04d42..0000000
--- a/res/drawable-ldrtl-xhdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_settings_sound_alpha.png b/res/drawable-ldrtl-xhdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..7503f50
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_about.png b/res/drawable-mdpi/ic_settings_about.png
deleted file mode 100644
index 8c5206e..0000000
--- a/res/drawable-mdpi/ic_settings_about.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_about_alpha.png b/res/drawable-mdpi/ic_settings_about_alpha.png
new file mode 100644
index 0000000..4065701
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_about_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_accessibility.png b/res/drawable-mdpi/ic_settings_accessibility.png
deleted file mode 100644
index d0229f6..0000000
--- a/res/drawable-mdpi/ic_settings_accessibility.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_accessibility_alpha.png b/res/drawable-mdpi/ic_settings_accessibility_alpha.png
new file mode 100644
index 0000000..c040ba0
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_accessibility_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_accounts.png b/res/drawable-mdpi/ic_settings_accounts.png
deleted file mode 100644
index 65008ce..0000000
--- a/res/drawable-mdpi/ic_settings_accounts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_accounts_alpha.png b/res/drawable-mdpi/ic_settings_accounts_alpha.png
new file mode 100644
index 0000000..769b46a
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_accounts_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_applications.png b/res/drawable-mdpi/ic_settings_applications.png
deleted file mode 100644
index 60ebf38..0000000
--- a/res/drawable-mdpi/ic_settings_applications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_applications_alpha.png b/res/drawable-mdpi/ic_settings_applications_alpha.png
new file mode 100644
index 0000000..f2ea795
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_applications_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_backup.png b/res/drawable-mdpi/ic_settings_backup.png
deleted file mode 100644
index 4595bda..0000000
--- a/res/drawable-mdpi/ic_settings_backup.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_backup_alpha.png b/res/drawable-mdpi/ic_settings_backup_alpha.png
new file mode 100644
index 0000000..932d354
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_backup_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_battery.png b/res/drawable-mdpi/ic_settings_battery.png
deleted file mode 100644
index 7a001fc..0000000
--- a/res/drawable-mdpi/ic_settings_battery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_battery_alpha.png b/res/drawable-mdpi/ic_settings_battery_alpha.png
new file mode 100644
index 0000000..970e6ed
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_battery_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_bluetooth.png b/res/drawable-mdpi/ic_settings_bluetooth.png
deleted file mode 100644
index 8cf80c0..0000000
--- a/res/drawable-mdpi/ic_settings_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_bluetooth2.png b/res/drawable-mdpi/ic_settings_bluetooth2.png
deleted file mode 100644
index f556bb4..0000000
--- a/res/drawable-mdpi/ic_settings_bluetooth2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_bluetooth2_alpha.png b/res/drawable-mdpi/ic_settings_bluetooth2_alpha.png
new file mode 100644
index 0000000..f51e5ca
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_bluetooth2_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_bluetooth_alpha.png b/res/drawable-mdpi/ic_settings_bluetooth_alpha.png
new file mode 100644
index 0000000..31be004
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_bluetooth_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_data_usage.png b/res/drawable-mdpi/ic_settings_data_usage.png
deleted file mode 100644
index e5d464d..0000000
--- a/res/drawable-mdpi/ic_settings_data_usage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_data_usage_alpha.png b/res/drawable-mdpi/ic_settings_data_usage_alpha.png
new file mode 100644
index 0000000..a368371
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_data_usage_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_date_time.png b/res/drawable-mdpi/ic_settings_date_time.png
deleted file mode 100644
index 80be678..0000000
--- a/res/drawable-mdpi/ic_settings_date_time.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_date_time_alpha.png b/res/drawable-mdpi/ic_settings_date_time_alpha.png
new file mode 100644
index 0000000..6837c11
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_date_time_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_development.png b/res/drawable-mdpi/ic_settings_development.png
deleted file mode 100644
index 44aaa29..0000000
--- a/res/drawable-mdpi/ic_settings_development.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_development_alpha.png b/res/drawable-mdpi/ic_settings_development_alpha.png
new file mode 100644
index 0000000..cdc3ffe
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_development_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_display_am.png b/res/drawable-mdpi/ic_settings_display_am.png
deleted file mode 100644
index c794f76..0000000
--- a/res/drawable-mdpi/ic_settings_display_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_display_am_alpha.png b/res/drawable-mdpi/ic_settings_display_am_alpha.png
new file mode 100644
index 0000000..f894832
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_display_am_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_dock.png b/res/drawable-mdpi/ic_settings_dock.png
deleted file mode 100644
index 62ccb3c..0000000
--- a/res/drawable-mdpi/ic_settings_dock.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_dock_alpha.png b/res/drawable-mdpi/ic_settings_dock_alpha.png
new file mode 100644
index 0000000..3ef7ab2
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_dock_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_home.png b/res/drawable-mdpi/ic_settings_home.png
deleted file mode 100644
index b18ca3e..0000000
--- a/res/drawable-mdpi/ic_settings_home.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_home_alpha.png b/res/drawable-mdpi/ic_settings_home_alpha.png
new file mode 100644
index 0000000..ad90fb8
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_home_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_language.png b/res/drawable-mdpi/ic_settings_language.png
deleted file mode 100644
index 604a710..0000000
--- a/res/drawable-mdpi/ic_settings_language.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_language_alpha.png b/res/drawable-mdpi/ic_settings_language_alpha.png
new file mode 100644
index 0000000..9149bb1
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_language_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_location.png b/res/drawable-mdpi/ic_settings_location.png
deleted file mode 100644
index de70e6f..0000000
--- a/res/drawable-mdpi/ic_settings_location.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_location_alpha.png b/res/drawable-mdpi/ic_settings_location_alpha.png
new file mode 100644
index 0000000..0b42099
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_location_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_more.png b/res/drawable-mdpi/ic_settings_more.png
deleted file mode 100644
index bad02c8..0000000
--- a/res/drawable-mdpi/ic_settings_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_more_alpha.png b/res/drawable-mdpi/ic_settings_more_alpha.png
new file mode 100644
index 0000000..809bf53
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_more_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_multiuser.png b/res/drawable-mdpi/ic_settings_multiuser.png
deleted file mode 100644
index d6f8501..0000000
--- a/res/drawable-mdpi/ic_settings_multiuser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_multiuser_alpha.png b/res/drawable-mdpi/ic_settings_multiuser_alpha.png
new file mode 100644
index 0000000..4a90287
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_multiuser_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_nfc_payment_am.png b/res/drawable-mdpi/ic_settings_nfc_payment_am.png
deleted file mode 100644
index 1cf5e86..0000000
--- a/res/drawable-mdpi/ic_settings_nfc_payment_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_nfc_payment_am_alpha.png b/res/drawable-mdpi/ic_settings_nfc_payment_am_alpha.png
new file mode 100644
index 0000000..1a66a30
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_nfc_payment_am_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_notifications.png b/res/drawable-mdpi/ic_settings_notifications.png
deleted file mode 100644
index 407ec8c..0000000
--- a/res/drawable-mdpi/ic_settings_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_notifications_alpha.png b/res/drawable-mdpi/ic_settings_notifications_alpha.png
new file mode 100644
index 0000000..8e255ae
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_notifications_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_print.png b/res/drawable-mdpi/ic_settings_print.png
deleted file mode 100644
index 76234a6..0000000
--- a/res/drawable-mdpi/ic_settings_print.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_print_alpha.png b/res/drawable-mdpi/ic_settings_print_alpha.png
new file mode 100644
index 0000000..e65113d
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_print_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_security.png b/res/drawable-mdpi/ic_settings_security.png
deleted file mode 100644
index cd65dd2..0000000
--- a/res/drawable-mdpi/ic_settings_security.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_security_alpha.png b/res/drawable-mdpi/ic_settings_security_alpha.png
new file mode 100644
index 0000000..b1a7cd0
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_security_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_sound.png b/res/drawable-mdpi/ic_settings_sound.png
deleted file mode 100644
index 17b2cc4..0000000
--- a/res/drawable-mdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_sound_alpha.png b/res/drawable-mdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..4a292ee
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_storage.png b/res/drawable-mdpi/ic_settings_storage.png
deleted file mode 100644
index ff6af99..0000000
--- a/res/drawable-mdpi/ic_settings_storage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_storage_alpha.png b/res/drawable-mdpi/ic_settings_storage_alpha.png
new file mode 100644
index 0000000..ddbde7c
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_storage_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_sync.png b/res/drawable-mdpi/ic_settings_sync.png
deleted file mode 100644
index fbd03ba..0000000
--- a/res/drawable-mdpi/ic_settings_sync.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_sync_alpha.png b/res/drawable-mdpi/ic_settings_sync_alpha.png
new file mode 100644
index 0000000..850e594
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_sync_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_wifi.png b/res/drawable-mdpi/ic_settings_wifi.png
deleted file mode 100644
index e8f3129..0000000
--- a/res/drawable-mdpi/ic_settings_wifi.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_wifi_alpha.png b/res/drawable-mdpi/ic_settings_wifi_alpha.png
new file mode 100644
index 0000000..31be004
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_wifi_alpha.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_wireless.png b/res/drawable-mdpi/ic_settings_wireless.png
deleted file mode 100644
index 6b81932f..0000000
--- a/res/drawable-mdpi/ic_settings_wireless.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_wireless_alpha.png b/res/drawable-mdpi/ic_settings_wireless_alpha.png
new file mode 100644
index 0000000..7bb2dfb
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_wireless_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_about.png b/res/drawable-xhdpi/ic_settings_about.png
deleted file mode 100644
index 188b362..0000000
--- a/res/drawable-xhdpi/ic_settings_about.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_about_alpha.png b/res/drawable-xhdpi/ic_settings_about_alpha.png
new file mode 100644
index 0000000..c64616f
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_about_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_accessibility.png b/res/drawable-xhdpi/ic_settings_accessibility.png
deleted file mode 100644
index 297a08b..0000000
--- a/res/drawable-xhdpi/ic_settings_accessibility.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_accessibility_alpha.png b/res/drawable-xhdpi/ic_settings_accessibility_alpha.png
new file mode 100644
index 0000000..d7f5c4d
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_accessibility_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_accounts.png b/res/drawable-xhdpi/ic_settings_accounts.png
deleted file mode 100644
index 8538036..0000000
--- a/res/drawable-xhdpi/ic_settings_accounts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_accounts_alpha.png b/res/drawable-xhdpi/ic_settings_accounts_alpha.png
new file mode 100644
index 0000000..6937eb1
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_accounts_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_applications.png b/res/drawable-xhdpi/ic_settings_applications.png
deleted file mode 100644
index f8122ba..0000000
--- a/res/drawable-xhdpi/ic_settings_applications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_applications_alpha.png b/res/drawable-xhdpi/ic_settings_applications_alpha.png
new file mode 100644
index 0000000..1d022e6
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_applications_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_backup.png b/res/drawable-xhdpi/ic_settings_backup.png
deleted file mode 100644
index 73d718b..0000000
--- a/res/drawable-xhdpi/ic_settings_backup.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_backup_alpha.png b/res/drawable-xhdpi/ic_settings_backup_alpha.png
new file mode 100644
index 0000000..93e7399
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_backup_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_battery.png b/res/drawable-xhdpi/ic_settings_battery.png
deleted file mode 100644
index 6825b71..0000000
--- a/res/drawable-xhdpi/ic_settings_battery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_battery_alpha.png b/res/drawable-xhdpi/ic_settings_battery_alpha.png
new file mode 100644
index 0000000..16d290d
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_battery_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_bluetooth.png b/res/drawable-xhdpi/ic_settings_bluetooth.png
deleted file mode 100644
index a75b550..0000000
--- a/res/drawable-xhdpi/ic_settings_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_bluetooth2.png b/res/drawable-xhdpi/ic_settings_bluetooth2.png
deleted file mode 100644
index 3767382..0000000
--- a/res/drawable-xhdpi/ic_settings_bluetooth2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_bluetooth2_alpha.png b/res/drawable-xhdpi/ic_settings_bluetooth2_alpha.png
new file mode 100644
index 0000000..a3e09db
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_bluetooth2_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_bluetooth_alpha.png b/res/drawable-xhdpi/ic_settings_bluetooth_alpha.png
new file mode 100644
index 0000000..cee4e67
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_bluetooth_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_data_usage.png b/res/drawable-xhdpi/ic_settings_data_usage.png
deleted file mode 100644
index 57cf2b1..0000000
--- a/res/drawable-xhdpi/ic_settings_data_usage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_data_usage_alpha.png b/res/drawable-xhdpi/ic_settings_data_usage_alpha.png
new file mode 100644
index 0000000..8ef9d09
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_data_usage_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_date_time.png b/res/drawable-xhdpi/ic_settings_date_time.png
deleted file mode 100644
index 8a40de8..0000000
--- a/res/drawable-xhdpi/ic_settings_date_time.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_date_time_alpha.png b/res/drawable-xhdpi/ic_settings_date_time_alpha.png
new file mode 100644
index 0000000..ad45114
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_date_time_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_development.png b/res/drawable-xhdpi/ic_settings_development.png
deleted file mode 100644
index 22050369..0000000
--- a/res/drawable-xhdpi/ic_settings_development.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_development_alpha.png b/res/drawable-xhdpi/ic_settings_development_alpha.png
new file mode 100644
index 0000000..3a4b3d9
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_development_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_display_am.png b/res/drawable-xhdpi/ic_settings_display_am.png
deleted file mode 100644
index be367f3..0000000
--- a/res/drawable-xhdpi/ic_settings_display_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_display_am_alpha.png b/res/drawable-xhdpi/ic_settings_display_am_alpha.png
new file mode 100644
index 0000000..05e82fb
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_display_am_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_dock.png b/res/drawable-xhdpi/ic_settings_dock.png
deleted file mode 100644
index e7eb120..0000000
--- a/res/drawable-xhdpi/ic_settings_dock.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_dock_alpha.png b/res/drawable-xhdpi/ic_settings_dock_alpha.png
new file mode 100644
index 0000000..eb01a66
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_dock_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_home.png b/res/drawable-xhdpi/ic_settings_home.png
deleted file mode 100644
index 3cb118d..0000000
--- a/res/drawable-xhdpi/ic_settings_home.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_home_alpha.png b/res/drawable-xhdpi/ic_settings_home_alpha.png
new file mode 100644
index 0000000..7098fbf
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_home_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_language.png b/res/drawable-xhdpi/ic_settings_language.png
deleted file mode 100644
index 4e44c01..0000000
--- a/res/drawable-xhdpi/ic_settings_language.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_language_alpha.png b/res/drawable-xhdpi/ic_settings_language_alpha.png
new file mode 100644
index 0000000..9b922e3
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_language_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_location.png b/res/drawable-xhdpi/ic_settings_location.png
deleted file mode 100644
index cd2e7b5..0000000
--- a/res/drawable-xhdpi/ic_settings_location.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_location_alpha.png b/res/drawable-xhdpi/ic_settings_location_alpha.png
new file mode 100644
index 0000000..fca5cf2
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_location_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_more.png b/res/drawable-xhdpi/ic_settings_more.png
deleted file mode 100644
index 8b9fe07..0000000
--- a/res/drawable-xhdpi/ic_settings_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_more_alpha.png b/res/drawable-xhdpi/ic_settings_more_alpha.png
new file mode 100644
index 0000000..0747c87
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_more_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_multiuser.png b/res/drawable-xhdpi/ic_settings_multiuser.png
deleted file mode 100644
index e1b3932..0000000
--- a/res/drawable-xhdpi/ic_settings_multiuser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_multiuser_alpha.png b/res/drawable-xhdpi/ic_settings_multiuser_alpha.png
new file mode 100644
index 0000000..b51072e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_multiuser_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_nfc_payment_am.png b/res/drawable-xhdpi/ic_settings_nfc_payment_am.png
deleted file mode 100644
index 4cf007d..0000000
--- a/res/drawable-xhdpi/ic_settings_nfc_payment_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_nfc_payment_am_alpha.png b/res/drawable-xhdpi/ic_settings_nfc_payment_am_alpha.png
new file mode 100644
index 0000000..9aa2fd2
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_nfc_payment_am_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_notifications.png b/res/drawable-xhdpi/ic_settings_notifications.png
deleted file mode 100644
index a67930e..0000000
--- a/res/drawable-xhdpi/ic_settings_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_notifications_alpha.png b/res/drawable-xhdpi/ic_settings_notifications_alpha.png
new file mode 100644
index 0000000..a5fd6ae
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_notifications_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_print.png b/res/drawable-xhdpi/ic_settings_print.png
deleted file mode 100644
index 9ea3b85..0000000
--- a/res/drawable-xhdpi/ic_settings_print.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_print_alpha.png b/res/drawable-xhdpi/ic_settings_print_alpha.png
new file mode 100644
index 0000000..9afa8d2
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_print_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_security.png b/res/drawable-xhdpi/ic_settings_security.png
deleted file mode 100644
index 5ead24e..0000000
--- a/res/drawable-xhdpi/ic_settings_security.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_security_alpha.png b/res/drawable-xhdpi/ic_settings_security_alpha.png
new file mode 100644
index 0000000..cc79239
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_security_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_sound.png b/res/drawable-xhdpi/ic_settings_sound.png
deleted file mode 100644
index 644e593..0000000
--- a/res/drawable-xhdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_sound_alpha.png b/res/drawable-xhdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..603bc71
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_storage.png b/res/drawable-xhdpi/ic_settings_storage.png
deleted file mode 100644
index 51ded7e..0000000
--- a/res/drawable-xhdpi/ic_settings_storage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_storage_alpha.png b/res/drawable-xhdpi/ic_settings_storage_alpha.png
new file mode 100644
index 0000000..556abdf
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_storage_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_sync.png b/res/drawable-xhdpi/ic_settings_sync.png
deleted file mode 100644
index 50f3bf8..0000000
--- a/res/drawable-xhdpi/ic_settings_sync.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_sync_alpha.png b/res/drawable-xhdpi/ic_settings_sync_alpha.png
new file mode 100644
index 0000000..87e01fb
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_sync_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_wifi.png b/res/drawable-xhdpi/ic_settings_wifi.png
deleted file mode 100644
index 2bd4648..0000000
--- a/res/drawable-xhdpi/ic_settings_wifi.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_wifi_alpha.png b/res/drawable-xhdpi/ic_settings_wifi_alpha.png
new file mode 100644
index 0000000..cee4e67
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_wifi_alpha.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_wireless.png b/res/drawable-xhdpi/ic_settings_wireless.png
deleted file mode 100644
index ad6a98e..0000000
--- a/res/drawable-xhdpi/ic_settings_wireless.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_wireless_alpha.png b/res/drawable-xhdpi/ic_settings_wireless_alpha.png
new file mode 100644
index 0000000..cd7c175
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_wireless_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_about.png b/res/drawable-xxhdpi/ic_settings_about.png
deleted file mode 100644
index ae91bad..0000000
--- a/res/drawable-xxhdpi/ic_settings_about.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_about_alpha.png b/res/drawable-xxhdpi/ic_settings_about_alpha.png
new file mode 100644
index 0000000..f4cbde6
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_about_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_accessibility.png b/res/drawable-xxhdpi/ic_settings_accessibility.png
deleted file mode 100644
index 08ee9c4..0000000
--- a/res/drawable-xxhdpi/ic_settings_accessibility.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_accessibility_alpha.png b/res/drawable-xxhdpi/ic_settings_accessibility_alpha.png
new file mode 100644
index 0000000..b3dbab6
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_accessibility_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_accounts.png b/res/drawable-xxhdpi/ic_settings_accounts.png
deleted file mode 100644
index 6371c62..0000000
--- a/res/drawable-xxhdpi/ic_settings_accounts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_accounts_alpha.png b/res/drawable-xxhdpi/ic_settings_accounts_alpha.png
new file mode 100644
index 0000000..b7ebc4b
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_accounts_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_applications.png b/res/drawable-xxhdpi/ic_settings_applications.png
deleted file mode 100644
index db8c9c4..0000000
--- a/res/drawable-xxhdpi/ic_settings_applications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_applications_alpha.png b/res/drawable-xxhdpi/ic_settings_applications_alpha.png
new file mode 100644
index 0000000..cb1caf9
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_applications_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_backup.png b/res/drawable-xxhdpi/ic_settings_backup.png
deleted file mode 100644
index d7add84..0000000
--- a/res/drawable-xxhdpi/ic_settings_backup.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_backup_alpha.png b/res/drawable-xxhdpi/ic_settings_backup_alpha.png
new file mode 100644
index 0000000..762095d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_backup_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_battery.png b/res/drawable-xxhdpi/ic_settings_battery.png
deleted file mode 100644
index 1648ee4..0000000
--- a/res/drawable-xxhdpi/ic_settings_battery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_battery_alpha.png b/res/drawable-xxhdpi/ic_settings_battery_alpha.png
new file mode 100644
index 0000000..733a787
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_battery_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_bluetooth2.png b/res/drawable-xxhdpi/ic_settings_bluetooth2.png
deleted file mode 100644
index ad5e802..0000000
--- a/res/drawable-xxhdpi/ic_settings_bluetooth2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_bluetooth2_alpha.png b/res/drawable-xxhdpi/ic_settings_bluetooth2_alpha.png
new file mode 100644
index 0000000..2cc0577
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_bluetooth2_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_data_usage.png b/res/drawable-xxhdpi/ic_settings_data_usage.png
deleted file mode 100644
index 4460509..0000000
--- a/res/drawable-xxhdpi/ic_settings_data_usage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_data_usage_alpha.png b/res/drawable-xxhdpi/ic_settings_data_usage_alpha.png
new file mode 100644
index 0000000..6586a5c
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_data_usage_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_date_time.png b/res/drawable-xxhdpi/ic_settings_date_time.png
deleted file mode 100644
index dd13084..0000000
--- a/res/drawable-xxhdpi/ic_settings_date_time.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_date_time_alpha.png b/res/drawable-xxhdpi/ic_settings_date_time_alpha.png
new file mode 100644
index 0000000..875e1dd
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_date_time_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_development.png b/res/drawable-xxhdpi/ic_settings_development.png
deleted file mode 100644
index 35555d4..0000000
--- a/res/drawable-xxhdpi/ic_settings_development.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_development_alpha.png b/res/drawable-xxhdpi/ic_settings_development_alpha.png
new file mode 100644
index 0000000..fc23084
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_development_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_display_am.png b/res/drawable-xxhdpi/ic_settings_display_am.png
deleted file mode 100644
index a16ee17..0000000
--- a/res/drawable-xxhdpi/ic_settings_display_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_display_am_alpha.png b/res/drawable-xxhdpi/ic_settings_display_am_alpha.png
new file mode 100644
index 0000000..9dd90a1
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_display_am_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_dock.png b/res/drawable-xxhdpi/ic_settings_dock.png
deleted file mode 100644
index 24f2351..0000000
--- a/res/drawable-xxhdpi/ic_settings_dock.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_dock_alpha.png b/res/drawable-xxhdpi/ic_settings_dock_alpha.png
new file mode 100644
index 0000000..f8550be
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_dock_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_home.png b/res/drawable-xxhdpi/ic_settings_home.png
deleted file mode 100644
index 5a7e813..0000000
--- a/res/drawable-xxhdpi/ic_settings_home.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_home_alpha.png b/res/drawable-xxhdpi/ic_settings_home_alpha.png
new file mode 100644
index 0000000..653c08c
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_home_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_language.png b/res/drawable-xxhdpi/ic_settings_language.png
deleted file mode 100644
index 3d6559d..0000000
--- a/res/drawable-xxhdpi/ic_settings_language.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_language_alpha.png b/res/drawable-xxhdpi/ic_settings_language_alpha.png
new file mode 100644
index 0000000..9db2b5d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_language_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_location.png b/res/drawable-xxhdpi/ic_settings_location.png
deleted file mode 100644
index 3fe4b9d..0000000
--- a/res/drawable-xxhdpi/ic_settings_location.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_location_alpha.png b/res/drawable-xxhdpi/ic_settings_location_alpha.png
new file mode 100644
index 0000000..b7c2776
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_location_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_more.png b/res/drawable-xxhdpi/ic_settings_more.png
deleted file mode 100644
index 0e0ba13..0000000
--- a/res/drawable-xxhdpi/ic_settings_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_more_alpha.png b/res/drawable-xxhdpi/ic_settings_more_alpha.png
new file mode 100644
index 0000000..7b44cac
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_more_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_multiuser.png b/res/drawable-xxhdpi/ic_settings_multiuser.png
deleted file mode 100644
index b5155d7..0000000
--- a/res/drawable-xxhdpi/ic_settings_multiuser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_multiuser_alpha.png b/res/drawable-xxhdpi/ic_settings_multiuser_alpha.png
new file mode 100644
index 0000000..25ba926
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_multiuser_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_nfc_payment_am.png b/res/drawable-xxhdpi/ic_settings_nfc_payment_am.png
deleted file mode 100644
index 0b9e41e..0000000
--- a/res/drawable-xxhdpi/ic_settings_nfc_payment_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_nfc_payment_am_alpha.png b/res/drawable-xxhdpi/ic_settings_nfc_payment_am_alpha.png
new file mode 100644
index 0000000..6e09248
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_nfc_payment_am_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_notifications.png b/res/drawable-xxhdpi/ic_settings_notifications.png
deleted file mode 100644
index 3f0e063..0000000
--- a/res/drawable-xxhdpi/ic_settings_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_notifications_alpha.png b/res/drawable-xxhdpi/ic_settings_notifications_alpha.png
new file mode 100644
index 0000000..946c31a
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_notifications_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_print.png b/res/drawable-xxhdpi/ic_settings_print.png
deleted file mode 100644
index a0058dc..0000000
--- a/res/drawable-xxhdpi/ic_settings_print.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_print_alpha.png b/res/drawable-xxhdpi/ic_settings_print_alpha.png
new file mode 100644
index 0000000..4fe082e
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_print_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_security.png b/res/drawable-xxhdpi/ic_settings_security.png
deleted file mode 100644
index 0c317aa..0000000
--- a/res/drawable-xxhdpi/ic_settings_security.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_security_alpha.png b/res/drawable-xxhdpi/ic_settings_security_alpha.png
new file mode 100644
index 0000000..c815e43
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_security_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_sound.png b/res/drawable-xxhdpi/ic_settings_sound.png
deleted file mode 100644
index 5283caf..0000000
--- a/res/drawable-xxhdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_sound_alpha.png b/res/drawable-xxhdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..4461c1f
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_storage.png b/res/drawable-xxhdpi/ic_settings_storage.png
deleted file mode 100644
index 45c42a7..0000000
--- a/res/drawable-xxhdpi/ic_settings_storage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_storage_alpha.png b/res/drawable-xxhdpi/ic_settings_storage_alpha.png
new file mode 100644
index 0000000..ec53b8a
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_storage_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_sync.png b/res/drawable-xxhdpi/ic_settings_sync.png
deleted file mode 100644
index 2a09495..0000000
--- a/res/drawable-xxhdpi/ic_settings_sync.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_sync_alpha.png b/res/drawable-xxhdpi/ic_settings_sync_alpha.png
new file mode 100644
index 0000000..3a36ef3
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_sync_alpha.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_wireless.png b/res/drawable-xxhdpi/ic_settings_wireless.png
deleted file mode 100644
index 3058e98..0000000
--- a/res/drawable-xxhdpi/ic_settings_wireless.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_wireless_alpha.png b/res/drawable-xxhdpi/ic_settings_wireless_alpha.png
new file mode 100644
index 0000000..3640551
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_wireless_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_about.png b/res/drawable-xxxhdpi/ic_settings_about.png
deleted file mode 100644
index b39842f..0000000
--- a/res/drawable-xxxhdpi/ic_settings_about.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_about_alpha.png b/res/drawable-xxxhdpi/ic_settings_about_alpha.png
new file mode 100644
index 0000000..746900d
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_about_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_accessibility.png b/res/drawable-xxxhdpi/ic_settings_accessibility.png
deleted file mode 100644
index d289f02..0000000
--- a/res/drawable-xxxhdpi/ic_settings_accessibility.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_accessibility_alpha.png b/res/drawable-xxxhdpi/ic_settings_accessibility_alpha.png
new file mode 100644
index 0000000..1da61c9
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_accessibility_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_accounts.png b/res/drawable-xxxhdpi/ic_settings_accounts.png
deleted file mode 100644
index d1c389b..0000000
--- a/res/drawable-xxxhdpi/ic_settings_accounts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_accounts_alpha.png b/res/drawable-xxxhdpi/ic_settings_accounts_alpha.png
new file mode 100644
index 0000000..c479acc
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_accounts_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_applications.png b/res/drawable-xxxhdpi/ic_settings_applications.png
deleted file mode 100644
index 07f5785..0000000
--- a/res/drawable-xxxhdpi/ic_settings_applications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_applications_alpha.png b/res/drawable-xxxhdpi/ic_settings_applications_alpha.png
new file mode 100644
index 0000000..133f363
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_applications_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_backup.png b/res/drawable-xxxhdpi/ic_settings_backup.png
deleted file mode 100644
index 2a3f313..0000000
--- a/res/drawable-xxxhdpi/ic_settings_backup.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_backup_alpha.png b/res/drawable-xxxhdpi/ic_settings_backup_alpha.png
new file mode 100644
index 0000000..01efd94
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_backup_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_battery.png b/res/drawable-xxxhdpi/ic_settings_battery.png
deleted file mode 100644
index d45c6ef..0000000
--- a/res/drawable-xxxhdpi/ic_settings_battery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_battery_alpha.png b/res/drawable-xxxhdpi/ic_settings_battery_alpha.png
new file mode 100644
index 0000000..6a060c7
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_battery_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_bluetooth2.png b/res/drawable-xxxhdpi/ic_settings_bluetooth2.png
deleted file mode 100644
index d354eb6..0000000
--- a/res/drawable-xxxhdpi/ic_settings_bluetooth2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_bluetooth2_alpha.png b/res/drawable-xxxhdpi/ic_settings_bluetooth2_alpha.png
new file mode 100644
index 0000000..284c94e
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_bluetooth2_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_data_usage.png b/res/drawable-xxxhdpi/ic_settings_data_usage.png
deleted file mode 100644
index 54d464b..0000000
--- a/res/drawable-xxxhdpi/ic_settings_data_usage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_data_usage_alpha.png b/res/drawable-xxxhdpi/ic_settings_data_usage_alpha.png
new file mode 100644
index 0000000..55941d4
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_data_usage_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_date_time.png b/res/drawable-xxxhdpi/ic_settings_date_time.png
deleted file mode 100644
index 736bb3f..0000000
--- a/res/drawable-xxxhdpi/ic_settings_date_time.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_date_time_alpha.png b/res/drawable-xxxhdpi/ic_settings_date_time_alpha.png
new file mode 100644
index 0000000..4a5d491
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_date_time_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_development.png b/res/drawable-xxxhdpi/ic_settings_development.png
deleted file mode 100644
index eaf1f2c..0000000
--- a/res/drawable-xxxhdpi/ic_settings_development.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_development_alpha.png b/res/drawable-xxxhdpi/ic_settings_development_alpha.png
new file mode 100644
index 0000000..47f4547
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_development_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_display_am.png b/res/drawable-xxxhdpi/ic_settings_display_am.png
deleted file mode 100644
index 4f6933d..0000000
--- a/res/drawable-xxxhdpi/ic_settings_display_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_display_am_alpha.png b/res/drawable-xxxhdpi/ic_settings_display_am_alpha.png
new file mode 100644
index 0000000..ba90acc
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_display_am_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_dock.png b/res/drawable-xxxhdpi/ic_settings_dock.png
deleted file mode 100644
index 56aac4b..0000000
--- a/res/drawable-xxxhdpi/ic_settings_dock.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_dock_alpha.png b/res/drawable-xxxhdpi/ic_settings_dock_alpha.png
new file mode 100644
index 0000000..d5e4855
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_dock_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_home.png b/res/drawable-xxxhdpi/ic_settings_home.png
deleted file mode 100644
index 5d37a94..0000000
--- a/res/drawable-xxxhdpi/ic_settings_home.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_home_alpha.png b/res/drawable-xxxhdpi/ic_settings_home_alpha.png
new file mode 100644
index 0000000..2242f5e
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_home_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_language.png b/res/drawable-xxxhdpi/ic_settings_language.png
deleted file mode 100644
index c9447bd..0000000
--- a/res/drawable-xxxhdpi/ic_settings_language.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_language_alpha.png b/res/drawable-xxxhdpi/ic_settings_language_alpha.png
new file mode 100644
index 0000000..b5135c8
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_language_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_location.png b/res/drawable-xxxhdpi/ic_settings_location.png
deleted file mode 100644
index 67f5bad..0000000
--- a/res/drawable-xxxhdpi/ic_settings_location.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_location_alpha.png b/res/drawable-xxxhdpi/ic_settings_location_alpha.png
new file mode 100644
index 0000000..5ff19aa
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_location_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_more.png b/res/drawable-xxxhdpi/ic_settings_more.png
deleted file mode 100644
index b2083ba..0000000
--- a/res/drawable-xxxhdpi/ic_settings_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_more_alpha.png b/res/drawable-xxxhdpi/ic_settings_more_alpha.png
new file mode 100644
index 0000000..36384be
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_more_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_multiuser.png b/res/drawable-xxxhdpi/ic_settings_multiuser.png
deleted file mode 100644
index aad5c64..0000000
--- a/res/drawable-xxxhdpi/ic_settings_multiuser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_multiuser_alpha.png b/res/drawable-xxxhdpi/ic_settings_multiuser_alpha.png
new file mode 100644
index 0000000..51fb328
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_multiuser_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_nfc_payment_am.png b/res/drawable-xxxhdpi/ic_settings_nfc_payment_am.png
deleted file mode 100644
index 01e1e0b..0000000
--- a/res/drawable-xxxhdpi/ic_settings_nfc_payment_am.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_nfc_payment_am_alpha.png b/res/drawable-xxxhdpi/ic_settings_nfc_payment_am_alpha.png
new file mode 100644
index 0000000..6c29a53
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_nfc_payment_am_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_notifications.png b/res/drawable-xxxhdpi/ic_settings_notifications.png
deleted file mode 100644
index 1619240..0000000
--- a/res/drawable-xxxhdpi/ic_settings_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_notifications_alpha.png b/res/drawable-xxxhdpi/ic_settings_notifications_alpha.png
new file mode 100644
index 0000000..bd3bebe
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_notifications_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_print.png b/res/drawable-xxxhdpi/ic_settings_print.png
deleted file mode 100644
index f0ffb52..0000000
--- a/res/drawable-xxxhdpi/ic_settings_print.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_print_alpha.png b/res/drawable-xxxhdpi/ic_settings_print_alpha.png
new file mode 100644
index 0000000..8634ca1
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_print_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_security.png b/res/drawable-xxxhdpi/ic_settings_security.png
deleted file mode 100644
index 9a3959b..0000000
--- a/res/drawable-xxxhdpi/ic_settings_security.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_security_alpha.png b/res/drawable-xxxhdpi/ic_settings_security_alpha.png
new file mode 100644
index 0000000..6abec60
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_security_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_sound.png b/res/drawable-xxxhdpi/ic_settings_sound.png
deleted file mode 100644
index 15352de..0000000
--- a/res/drawable-xxxhdpi/ic_settings_sound.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_sound_alpha.png b/res/drawable-xxxhdpi/ic_settings_sound_alpha.png
new file mode 100644
index 0000000..3292db8
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_sound_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_storage.png b/res/drawable-xxxhdpi/ic_settings_storage.png
deleted file mode 100644
index be02ffb..0000000
--- a/res/drawable-xxxhdpi/ic_settings_storage.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_storage_alpha.png b/res/drawable-xxxhdpi/ic_settings_storage_alpha.png
new file mode 100644
index 0000000..48581a6
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_storage_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_sync.png b/res/drawable-xxxhdpi/ic_settings_sync.png
deleted file mode 100644
index 7a741a7..0000000
--- a/res/drawable-xxxhdpi/ic_settings_sync.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_sync_alpha.png b/res/drawable-xxxhdpi/ic_settings_sync_alpha.png
new file mode 100644
index 0000000..450647a
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_sync_alpha.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_wireless.png b/res/drawable-xxxhdpi/ic_settings_wireless.png
deleted file mode 100644
index bcc4233..0000000
--- a/res/drawable-xxxhdpi/ic_settings_wireless.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_wireless_alpha.png b/res/drawable-xxxhdpi/ic_settings_wireless_alpha.png
new file mode 100644
index 0000000..a5d14b3
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_wireless_alpha.png
Binary files differ
diff --git a/res/drawable/bg_circle_blue.xml b/res/drawable/bg_circle_blue.xml
new file mode 100644
index 0000000..7f2cb1d
--- /dev/null
+++ b/res/drawable/bg_circle_blue.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2015 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.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/blue" />
+</shape>
diff --git a/res/drawable/ic_fingerprint.xml b/res/drawable/ic_fingerprint.xml
new file mode 100644
index 0000000..2f27753
--- /dev/null
+++ b/res/drawable/ic_fingerprint.xml
@@ -0,0 +1,36 @@
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="32dp"
+        android:height="32dp"
+        android:viewportWidth="32.0"
+        android:viewportHeight="32.0">
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M23.7,5.9c-0.1,0.0 -0.2,0.0 -0.3,-0.1C21.0,4.5 18.6,3.9 16.0,3.9c-2.5,0.0 -4.6,0.6 -6.9,1.9C8.8,6.0 8.3,5.9 8.1,5.5C7.9,5.2 8.0,4.7 8.4,4.5c2.5,-1.4 4.9,-2.1 7.7,-2.1c2.8,0.0 5.4,0.7 8.0,2.1c0.4,0.2 0.5,0.6 0.3,1.0C24.2,5.7 24.0,5.9 23.7,5.9z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M5.3,13.2c-0.1,0.0 -0.3,0.0 -0.4,-0.1c-0.3,-0.2 -0.4,-0.7 -0.2,-1.0c1.3,-1.9 2.9,-3.4 4.9,-4.5c4.1,-2.2 9.3,-2.2 13.4,0.0c1.9,1.1 3.6,2.5 4.9,4.4c0.2,0.3 0.1,0.8 -0.2,1.0c-0.3,0.2 -0.8,0.1 -1.0,-0.2c-1.2,-1.7 -2.6,-3.0 -4.3,-4.0c-3.7,-2.0 -8.3,-2.0 -12.0,0.0c-1.7,0.9 -3.2,2.3 -4.3,4.0C5.7,13.1 5.5,13.2 5.3,13.2z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M13.3,29.6c-0.2,0.0 -0.4,-0.1 -0.5,-0.2c-1.1,-1.2 -1.7,-2.0 -2.6,-3.6c-0.9,-1.7 -1.4,-3.7 -1.4,-5.9c0.0,-4.1 3.3,-7.4 7.4,-7.4c4.1,0.0 7.4,3.3 7.4,7.4c0.0,0.4 -0.3,0.7 -0.7,0.7s-0.7,-0.3 -0.7,-0.7c0.0,-3.3 -2.7,-5.9 -5.9,-5.9c-3.3,0.0 -5.9,2.7 -5.9,5.9c0.0,2.0 0.4,3.8 1.2,5.2c0.8,1.6 1.4,2.2 2.4,3.3c0.3,0.3 0.3,0.8 0.0,1.0C13.7,29.5 13.5,29.6 13.3,29.6z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M22.6,27.1c-1.6,0.0 -2.9,-0.4 -4.1,-1.2c-1.9,-1.4 -3.1,-3.6 -3.1,-6.0c0.0,-0.4 0.3,-0.7 0.7,-0.7s0.7,0.3 0.7,0.7c0.0,1.9 0.9,3.7 2.5,4.8c0.9,0.6 1.9,1.0 3.2,1.0c0.3,0.0 0.8,0.0 1.3,-0.1c0.4,-0.1 0.8,0.2 0.8,0.6c0.1,0.4 -0.2,0.8 -0.6,0.8C23.4,27.1 22.8,27.1 22.6,27.1z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M20.0,29.9c-0.1,0.0 -0.1,0.0 -0.2,0.0c-2.1,-0.6 -3.4,-1.4 -4.8,-2.9c-1.8,-1.9 -2.8,-4.4 -2.8,-7.1c0.0,-2.2 1.8,-4.1 4.1,-4.1c2.2,0.0 4.1,1.8 4.1,4.1c0.0,1.4 1.2,2.6 2.6,2.6c1.4,0.0 2.6,-1.2 2.6,-2.6c0.0,-5.1 -4.2,-9.3 -9.3,-9.3c-3.6,0.0 -6.9,2.1 -8.4,5.4C7.3,17.1 7.0,18.4 7.0,19.8c0.0,1.1 0.1,2.7 0.9,4.9c0.1,0.4 -0.1,0.8 -0.4,0.9c-0.4,0.1 -0.8,-0.1 -0.9,-0.4c-0.6,-1.8 -0.9,-3.6 -0.9,-5.4c0.0,-1.6 0.3,-3.1 0.9,-4.4c1.7,-3.8 5.6,-6.3 9.8,-6.3c5.9,0.0 10.7,4.8 10.7,10.7c0.0,2.2 -1.8,4.1 -4.1,4.1s-4.0,-1.8 -4.0,-4.1c0.0,-1.4 -1.2,-2.6 -2.6,-2.6c-1.4,0.0 -2.6,1.2 -2.6,2.6c0.0,2.3 0.9,4.5 2.4,6.1c1.2,1.3 2.4,2.0 4.2,2.5c0.4,0.1 0.6,0.5 0.5,0.9C20.6,29.7 20.3,29.9 20.0,29.9z"/>
+</vector>
diff --git a/res/drawable/ic_fingerprint_error.xml b/res/drawable/ic_fingerprint_error.xml
new file mode 100644
index 0000000..d00280d
--- /dev/null
+++ b/res/drawable/ic_fingerprint_error.xml
@@ -0,0 +1,30 @@
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="32dp"
+        android:height="32dp"
+        android:viewportWidth="32.0"
+        android:viewportHeight="32.0">
+    <path
+        android:fillColor="@color/warning"
+        android:pathData="M15.99,2.5C8.53,2.5 2.5,8.54 2.5,16.0s6.03,13.5 13.49,13.5S29.5,23.46 29.5,16.0S23.45,2.5 15.99,2.5zM16.0,26.8c-5.97,0.0 -10.8,-4.83 -10.8,-10.8S10.03,5.2 16.0,5.2S26.8,10.03 26.8,16.0S21.97,26.8 16.0,26.8z"/>
+    <path
+        android:fillColor="@color/warning"
+        android:pathData="M14.65,20.05l2.7,0.0l0.0,2.7l-2.7,0.0z"/>
+    <path
+        android:fillColor="@color/warning"
+        android:pathData="M14.65,9.25l2.7,0.0l0.0,8.1l-2.7,0.0z"/>
+</vector>
diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml
new file mode 100644
index 0000000..8266b90
--- /dev/null
+++ b/res/drawable/ic_settings_about.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_about_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml
new file mode 100644
index 0000000..63a8f77
--- /dev/null
+++ b/res/drawable/ic_settings_accessibility.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_accessibility_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_accounts.xml b/res/drawable/ic_settings_accounts.xml
new file mode 100644
index 0000000..bdd569d
--- /dev/null
+++ b/res/drawable/ic_settings_accounts.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_accounts_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_applications.xml b/res/drawable/ic_settings_applications.xml
new file mode 100644
index 0000000..e56fe7e
--- /dev/null
+++ b/res/drawable/ic_settings_applications.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_applications_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_backup.xml b/res/drawable/ic_settings_backup.xml
new file mode 100644
index 0000000..23f8081
--- /dev/null
+++ b/res/drawable/ic_settings_backup.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_backup_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_battery.xml b/res/drawable/ic_settings_battery.xml
new file mode 100644
index 0000000..a983b69
--- /dev/null
+++ b/res/drawable/ic_settings_battery.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_battery_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_bluetooth.xml b/res/drawable/ic_settings_bluetooth.xml
new file mode 100644
index 0000000..a76cd2c
--- /dev/null
+++ b/res/drawable/ic_settings_bluetooth.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_bluetooth_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_bluetooth2.xml b/res/drawable/ic_settings_bluetooth2.xml
new file mode 100644
index 0000000..df0f866
--- /dev/null
+++ b/res/drawable/ic_settings_bluetooth2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_bluetooth2_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml
new file mode 100644
index 0000000..16da024
--- /dev/null
+++ b/res/drawable/ic_settings_data_usage.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_data_usage_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_date_time.xml b/res/drawable/ic_settings_date_time.xml
new file mode 100644
index 0000000..c722fce
--- /dev/null
+++ b/res/drawable/ic_settings_date_time.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_date_time_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_development.xml b/res/drawable/ic_settings_development.xml
new file mode 100644
index 0000000..42d043e
--- /dev/null
+++ b/res/drawable/ic_settings_development.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_development_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml
index 29cc3e4..ad846ce 100644
--- a/res/drawable/ic_settings_display.xml
+++ b/res/drawable/ic_settings_display.xml
@@ -1,23 +1,22 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
- * Copyright 2014, 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.
- */
+     Copyright (C) 2015 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.
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_settings_display_am"
-        android:autoMirrored="true"
-        />
+    android:src="@drawable/ic_settings_display_am_alpha"
+    android:tint="?android:attr/colorAccent"
+    android:autoMirrored="true" />
+
diff --git a/res/drawable/ic_settings_dock.xml b/res/drawable/ic_settings_dock.xml
new file mode 100644
index 0000000..c6d6571
--- /dev/null
+++ b/res/drawable/ic_settings_dock.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_dock_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_home.xml b/res/drawable/ic_settings_home.xml
new file mode 100644
index 0000000..86e108f
--- /dev/null
+++ b/res/drawable/ic_settings_home.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_home_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_language.xml b/res/drawable/ic_settings_language.xml
new file mode 100644
index 0000000..0130baa
--- /dev/null
+++ b/res/drawable/ic_settings_language.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_language_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_location.xml b/res/drawable/ic_settings_location.xml
new file mode 100644
index 0000000..da64367
--- /dev/null
+++ b/res/drawable/ic_settings_location.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_location_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_more.xml b/res/drawable/ic_settings_more.xml
new file mode 100644
index 0000000..7df6e1d
--- /dev/null
+++ b/res/drawable/ic_settings_more.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_more_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_multiuser.xml b/res/drawable/ic_settings_multiuser.xml
new file mode 100644
index 0000000..b793360
--- /dev/null
+++ b/res/drawable/ic_settings_multiuser.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_multiuser_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_nfc_payment.xml b/res/drawable/ic_settings_nfc_payment.xml
index 10672a9..897cd8b 100644
--- a/res/drawable/ic_settings_nfc_payment.xml
+++ b/res/drawable/ic_settings_nfc_payment.xml
@@ -1,23 +1,22 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
- * Copyright 2014, 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.
- */
+     Copyright (C) 2015 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.
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_settings_nfc_payment_am"
-        android:autoMirrored="true"
-        />
+    android:src="@drawable/ic_settings_nfc_payment_am_alpha"
+    android:tint="?android:attr/colorAccent"
+    android:autoMirrored="true" />
+
diff --git a/res/drawable/ic_settings_notifications.xml b/res/drawable/ic_settings_notifications.xml
new file mode 100644
index 0000000..da5aa38
--- /dev/null
+++ b/res/drawable/ic_settings_notifications.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_notifications_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_print.xml b/res/drawable/ic_settings_print.xml
new file mode 100644
index 0000000..4f30edf
--- /dev/null
+++ b/res/drawable/ic_settings_print.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_print_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_security.xml b/res/drawable/ic_settings_security.xml
new file mode 100644
index 0000000..fd23658
--- /dev/null
+++ b/res/drawable/ic_settings_security.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_security_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_sound.xml b/res/drawable/ic_settings_sound.xml
new file mode 100644
index 0000000..b84c224
--- /dev/null
+++ b/res/drawable/ic_settings_sound.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_sound_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_storage.xml b/res/drawable/ic_settings_storage.xml
new file mode 100644
index 0000000..b6714a9
--- /dev/null
+++ b/res/drawable/ic_settings_storage.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_storage_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_sync.xml b/res/drawable/ic_settings_sync.xml
new file mode 100644
index 0000000..2d30dac
--- /dev/null
+++ b/res/drawable/ic_settings_sync.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_sync_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_wifi.xml b/res/drawable/ic_settings_wifi.xml
new file mode 100644
index 0000000..9b58909
--- /dev/null
+++ b/res/drawable/ic_settings_wifi.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_wifi_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/drawable/ic_settings_wireless.xml b/res/drawable/ic_settings_wireless.xml
new file mode 100644
index 0000000..f663599
--- /dev/null
+++ b/res/drawable/ic_settings_wireless.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_settings_wireless_alpha"
+    android:tint="?android:attr/colorAccent" />
+
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 4158c88..d8da8fe 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -1,104 +1,92 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, 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.
-*/
+<!-- Copyright (C) 2015 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.
 -->
-<!-- This is basically the same layout as choose_lock_password. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
     android:orientation="vertical"
-    android:gravity="center_horizontal">
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent">
 
-    <LinearLayout
-        android:layout_width="match_parent"
+    <TextView
+        style="@android:style/TextAppearance.Material.Title"
+        android:id="@+id/headerText"
+        android:layout_marginStart="24dp"
+        android:layout_marginEnd="24dp"
+        android:layout_marginTop="12dp"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <!-- "Enter PIN(Password) to unlock" -->
-        <TextView android:id="@+id/headerText"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="horizontal"
-            android:layout_marginEnd="6dip"
-            android:layout_marginStart="6dip"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="10dip"
-            android:gravity="start"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/colorAccent"/>
+
+    <TextView
+        style="@android:style/TextAppearance.Material.Body1"
+        android:id="@+id/detailsText"
+        android:layout_marginStart="24dp"
+        android:layout_marginEnd="24dp"
+        android:layout_marginTop="8dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         />
 
-        <!-- Password entry field -->
-        <EditText android:id="@+id/password_entry"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="5dip"
-            android:layout_marginBottom="5dip"
-            android:layout_gravity="center"
-            android:layout_weight="1"
-            android:inputType="textPassword"
-            android:imeOptions="actionNext"
-            android:gravity="center"
-            android:textSize="24sp"
-            style="@style/TextAppearance.PasswordEntry"
-        />
-    </LinearLayout>
-
-    <!-- Spacer between password entry and keyboard -->
     <View
         android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
+        android:layout_height="0dp"
+        android:layout_weight="1"/>
 
-    <!-- Alphanumeric keyboard -->
-    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="#00000000"
-        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
-        android:visibility="gone"
-    />
-
-    <RelativeLayout
+    <FrameLayout
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
-        android:background="@android:drawable/bottom_bar"
-        android:visibility="gone">
+        android:orientation="horizontal">
 
-        <Button android:id="@+id/cancel_button"
-            android:layout_width="150dip"
+        <Button
+            style="@android:style/Widget.Material.Button.Borderless"
+            android:id="@+id/cancelButton"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_margin="5dip"
-            android:layout_alignParentStart="true"
-            android:text="@string/lockpassword_cancel_label"
-        />
+            android:layout_gravity="start|bottom"
+            android:text="@string/cancel"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginBottom="14dp"/>
 
-        <Button android:id="@+id/next_button"
-            android:layout_width="150dip"
+        <EditText android:id="@+id/password_entry"
+            android:layout_width="208dp"
             android:layout_height="wrap_content"
-            android:layout_margin="5dip"
-            android:layout_alignParentEnd="true"
-            android:drawableEnd="@drawable/ic_btn_next"
-            android:drawablePadding="10dip"
-            android:text="@string/lockpassword_continue_label"
-        />
+            android:layout_gravity="center_horizontal|bottom"
+            android:layout_marginBottom="26dp"
+            android:inputType="textPassword"
+            android:imeOptions="actionNext|flagNoFullscreen"
+            android:gravity="center"
+            android:textSize="16sp"
+            style="@style/TextAppearance.PasswordEntry"/>
 
-    </RelativeLayout>
+        <TextView style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
+            android:id="@+id/errorText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal|bottom"
+            android:layout_marginBottom="10dp"/>
 
-</LinearLayout>
+        <ImageView
+            android:id="@+id/fingerprintIcon"
+            android:layout_gravity="end|bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="28dp"
+            android:layout_marginEnd="20dp"
+            android:visibility="gone"/>
+    </FrameLayout>
 
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout-land/confirm_lock_pattern.xml b/res/layout-land/confirm_lock_pattern.xml
index b58b46f..0567fad 100644
--- a/res/layout-land/confirm_lock_pattern.xml
+++ b/res/layout-land/confirm_lock_pattern.xml
@@ -13,56 +13,102 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
 <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
-        xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/topLayout"
     android:orientation="horizontal"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:clipChildren="false"
+    android:clipToPadding="false">
 
-    <!-- left side: instructions and messages -->
     <LinearLayout
-            android:orientation="vertical"
-            android:layout_width="0dip"
-            android:layout_height="match_parent"
-            android:layout_weight="1.0"
-            >
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_weight="1"
+        android:orientation="vertical">
 
-        <!-- header message -->
-        <TextView android:id="@+id/headerText"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:layout_marginTop="16dp"
-                  android:gravity="center"
-                  android:textSize="18sp"/>
+        <TextView
+            style="@android:style/TextAppearance.Material.Headline"
+            android:id="@+id/headerText"
+            android:layout_marginStart="32dp"
+            android:layout_marginEnd="32dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="?android:attr/colorAccent"/>
 
-        <!-- fill space between header and button below -->
-        <View
-            android:layout_weight="1.0"
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            />
+        <TextView
+            style="@android:style/TextAppearance.Material.Body1"
+            android:id="@+id/detailsText"
+            android:layout_marginStart="32dp"
+            android:layout_marginEnd="32dp"
+            android:layout_marginTop="12dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
 
-        <!-- footer message -->
-        <TextView android:id="@+id/footerText"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:gravity="center"
-                  android:textSize="14sp"/>
+        <Button
+            style="@android:style/Widget.Material.Button.Borderless"
+            android:id="@+id/cancelButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/cancel"
+            android:layout_marginStart="16dp"
+            android:layout_marginEnd="16dp"
+            android:layout_marginTop="16dp"/>
     </LinearLayout>
 
-    <View
-         android:background="@*android:drawable/code_lock_left"
-         android:layout_width="2dip"
-         android:layout_height="match_parent" />
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="horizontal"
+        android:clipChildren="false"
+        android:clipToPadding="false">
 
-    <!-- right side: lock pattern -->
-    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-         android:layout_width="match_parent"
-         android:layout_height="match_parent"
-         android:background="@color/lock_pattern_background" />
+        <View
+            android:id="@+id/leftSpacer"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="0.4"/>
 
+        <FrameLayout
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:clipChildren="false"
+            android:clipToPadding="false">
+
+            <com.android.internal.widget.LockPatternView
+                android:id="@+id/lockPattern"
+                android:layout_width="288dp"
+                android:layout_height="288dp"
+                android:layout_marginStart="-42dp"
+                android:layout_marginEnd="-42dp"
+                android:layout_gravity="center_vertical"/>
+
+            <TextView
+                style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
+                android:id="@+id/errorText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="bottom|center_horizontal"
+                android:layout_marginBottom="24dp"/>
+        </FrameLayout>
+
+        <View
+            android:id="@+id/rightSpacer"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"/>
+
+        <ImageView
+            android:id="@+id/fingerprintIcon"
+            android:layout_gravity="center_vertical"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:visibility="gone"/>
+    </LinearLayout>
 
 </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 
diff --git a/res/layout-sw600dp-land/confirm_lock_password.xml b/res/layout-sw600dp-land/confirm_lock_password.xml
deleted file mode 100644
index cbaad7a..0000000
--- a/res/layout-sw600dp-land/confirm_lock_password.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, 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.
-*/
--->
-
-<!-- This is the same layout as choose_lock_password. TODO: find out why merge tag fails -->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="20dip"
-        android:orientation="horizontal">
-
-        <!-- "Enter PIN(Password) to unlock" -->
-        <TextView android:id="@+id/headerText"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="horizontal"
-            android:layout_marginEnd="6dip"
-            android:layout_marginStart="6dip"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="10dip"
-            android:gravity="start"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-        />
-
-        <!-- Password entry field -->
-        <EditText android:id="@+id/password_entry"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="5dip"
-            android:layout_marginBottom="5dip"
-            android:layout_gravity="center"
-            android:layout_weight="1"
-            android:inputType="textPassword"
-            android:imeOptions="actionNext"
-            android:gravity="center"
-            android:textSize="24sp"
-            style="@style/TextAppearance.PasswordEntry"
-        />
-    </LinearLayout>
-
-    <!-- confirm / restart buttons -->
-    <LinearLayout
-        style="@style/SecurityPreferenceButtonContainer"
-        android:layout_alignParentEnd="true"
-        android:layout_alignParentBottom="true"
-        android:orientation="horizontal">
-
-        <!-- left / top button: skip, or re-try -->
-        <Button android:id="@+id/cancel_button"
-            style="@style/SecurityPreferenceButton"
-            android:text="@string/lockpassword_cancel_label"/>
-
-        <!-- right / bottom button: confirm or ok -->
-        <Button android:id="@+id/next_button"
-            style="@style/SecurityPreferenceButton"
-            android:text="@string/lockpassword_continue_label"/>
-
-    </LinearLayout>
-    <!-- Alphanumeric keyboard -->
-    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="#00000000"
-        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
-        android:visibility="gone"
-    />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/res/layout-sw600dp-land/confirm_lock_pattern.xml b/res/layout-sw600dp-land/confirm_lock_pattern.xml
deleted file mode 100644
index a090a6f..0000000
--- a/res/layout-sw600dp-land/confirm_lock_pattern.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/topLayout"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center_horizontal">
-
-    <!-- header message -->
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:layout_marginTop="40dip">
-
-        <TextView android:id="@+id/headerText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    </ScrollView>
-
-    <!-- footer message -->
-    <TextView android:id="@+id/footerText"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dip"
-        android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="0.6"/>
-
-    <!-- lock pattern widget -->
-    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-        android:layout_width="354dip"
-        android:layout_height="354dip"
-        android:background="@color/lock_pattern_background"
-        aspect="square"/>
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"/>
-
-</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
-
diff --git a/res/layout-sw600dp/confirm_lock_password.xml b/res/layout-sw600dp/confirm_lock_password.xml
index 12b6ab2..1649aaa 100644
--- a/res/layout-sw600dp/confirm_lock_password.xml
+++ b/res/layout-sw600dp/confirm_lock_password.xml
@@ -1,103 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-**
-** Copyright 2008, 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.
-*/
--->
+  ~ Copyright (C) 2015 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="match_parent"
+    android:paddingTop="48dp">
 
-<!-- This is the same layout as choose_lock_password -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:gravity="center_horizontal">
-
-    <!-- header text ('Enter Pin') -->
-    <TextView android:id="@+id/headerText"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    <!-- spacer above text entry field -->
-    <View
-        android:id="@+id/spacerBottom"
-        android:layout_width="fill_parent"
-        android:layout_height="1dip"
-        android:layout_marginTop="6dip"
-        android:background="@android:drawable/divider_horizontal_dark"
-    />
-
-    <!-- Password entry field -->
-    <EditText android:id="@+id/password_entry"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="15dip"
-        android:layout_marginStart="30dip"
-        android:layout_marginEnd="30dip"
-        android:layout_gravity="center"
-        android:inputType="textPassword"
-        android:imeOptions="actionNext"
-        android:gravity="center"
-        android:textSize="32sp"
-        style="@style/TextAppearance.PasswordEntry"
-    />
-
-    <!-- Spacer between password entry and keyboard -->
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-
-    <!-- Alphanumeric keyboard -->
-    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="#00000000"
-        android:layout_marginBottom="30dip"
-        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
-        android:visibility="gone"
-    />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-    />
-
-    <RelativeLayout
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent">
-
-        <LinearLayout
-            style="@style/SecurityPreferenceButtonContainer"
-            android:layout_alignParentEnd="true"
-            android:orientation="horizontal">
-
-            <Button android:id="@+id/cancel_button"
-                style="@style/SecurityPreferenceButton"
-                android:text="@string/lockpassword_cancel_label"/>
-
-            <Button android:id="@+id/next_button"
-                style="@style/SecurityPreferenceButton"
-                android:text="@string/lockpassword_continue_label"/>
-
-        </LinearLayout>
-
-    </RelativeLayout>
-
-</LinearLayout>
-
+    <include layout="@layout/confirm_lock_password_base"
+        android:layout_width="328dp"
+        android:layout_height="match_parent"
+        android:layout_gravity="center_horizontal"/>
+</FrameLayout>
diff --git a/res/layout-sw600dp/confirm_lock_pattern.xml b/res/layout-sw600dp/confirm_lock_pattern.xml
index 12e2b86..5c93ccd 100644
--- a/res/layout-sw600dp/confirm_lock_pattern.xml
+++ b/res/layout-sw600dp/confirm_lock_pattern.xml
@@ -13,48 +13,19 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
-        xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/topLayout"
-    android:orientation="vertical"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:gravity="center_horizontal">
+    android:paddingTop="48dp"
+    android:background="#80000000">
 
-    <!-- top: instructions and buttons -->
-    <!-- header message -->
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:layout_marginTop="96dip">
+    <View android:layout_width="328dp"
+        android:layout_height="match_parent"
+        android:background="@color/confirm_device_credential_dark_background"
+        android:layout_gravity="center_horizontal"/>
 
-        <TextView android:id="@+id/headerText"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    </ScrollView>
-
-    <!-- footer message -->
-    <TextView android:id="@+id/footerText"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dip"
-        android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    <!-- bottom: lock pattern -->
-    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-         android:layout_width="354dip"
-         android:layout_height="354dip"
-         android:layout_marginTop="80dip"
-         android:background="@color/lock_pattern_background"
-         aspect="square"/>
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"/>
-
-</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+    <include layout="@layout/confirm_lock_pattern_base"
+        android:layout_width="328dp"
+        android:layout_height="match_parent"
+        android:layout_gravity="center_horizontal"/>
+</FrameLayout>
diff --git a/res/layout/confirm_lock_password.xml b/res/layout/confirm_lock_password.xml
deleted file mode 100644
index c9a0bbe..0000000
--- a/res/layout/confirm_lock_password.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2008, 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.
-*/
--->
-
-<!-- This is the same layout as choose_lock_password -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:gravity="center_horizontal">
-
-    <!-- header text ('Enter Pin') -->
-    <TextView android:id="@+id/headerText"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium"/>
-
-    <!-- Password entry field -->
-    <EditText android:id="@+id/password_entry"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="30dip"
-        android:layout_marginEnd="30dip"
-        android:layout_gravity="center"
-        android:inputType="textPassword"
-        android:imeOptions="actionNext"
-        android:gravity="center"
-        android:textSize="24sp"
-        style="@style/TextAppearance.PasswordEntry"
-    />
-
-    <!-- Spacer between password entry and keyboard -->
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-
-    <!-- Alphanumeric keyboard -->
-    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="#00000000"
-        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
-        android:visibility="gone"
-    />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-    />
-
-    <LinearLayout
-        style="@style/SecurityPreferenceButtonContainer"
-        android:layout_alignParentEnd="true"
-        android:layout_alignParentBottom="true"
-        android:orientation="horizontal">
-
-        <!-- left / top button: skip, or re-try -->
-        <Button android:id="@+id/cancel_button"
-            style="@style/SecurityPreferenceButton"
-            android:text="@string/lockpattern_tutorial_cancel_label"/>
-
-        <!-- right / bottom button: confirm or ok -->
-        <Button android:id="@+id/next_button"
-            style="@style/SecurityPreferenceButton"
-            android:text="@string/lockpattern_tutorial_continue_label"/>
-
-    </LinearLayout>
-
-</LinearLayout>
-
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
new file mode 100644
index 0000000..af4ffe8
--- /dev/null
+++ b/res/layout/confirm_lock_password_base.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent">
+
+    <TextView
+        style="@android:style/TextAppearance.Material.Headline"
+        android:id="@+id/headerText"
+        android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginTop="?attr/confirmDeviceCredentialsTopMargin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="?android:attr/colorAccent"/>
+
+    <TextView
+        style="@android:style/TextAppearance.Material.Body1"
+        android:id="@+id/detailsText"
+        android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginTop="12dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        />
+
+    <Button
+        style="@android:style/Widget.Material.Button.Borderless"
+        android:id="@+id/cancelButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/cancel"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginTop="16dp"/>
+
+    <View android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"/>
+
+    <EditText
+        android:id="@+id/password_entry"
+        android:layout_width="208dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="-40dp"
+        android:inputType="textPassword"
+        android:imeOptions="actionNext"
+        android:gravity="center"
+        android:textSize="16sp"
+        style="@style/TextAppearance.PasswordEntry"/>
+
+    <TextView
+        style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
+        android:id="@+id/errorText"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginStart="12dp"
+        android:layout_marginEnd="12dp"
+        android:gravity="center_vertical"/>
+
+    <ImageView
+        android:id="@+id/fingerprintIcon"
+        android:layout_gravity="center_horizontal"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_marginBottom="24dp"
+        android:visibility="gone"/>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
\ No newline at end of file
diff --git a/res/layout/confirm_lock_pattern.xml b/res/layout/confirm_lock_pattern.xml
deleted file mode 100644
index 4426242..0000000
--- a/res/layout/confirm_lock_pattern.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
-        xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/topLayout"
-    android:orientation="vertical"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent">
-
-    <TextView android:id="@+id/headerText"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1.0"
-        android:gravity="center"
-        android:textSize="18sp"/>
-
-    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-         android:layout_width="match_parent"
-         android:layout_height="match_parent"
-         android:background="@color/lock_pattern_background" />
-
-    <TextView android:id="@+id/footerText"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1.0"
-        android:gravity="center"
-        android:textSize="14sp"/>
-
-</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
new file mode 100644
index 0000000..029b856
--- /dev/null
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent">
+
+    <TextView
+        style="@android:style/TextAppearance.Material.Headline"
+        android:id="@+id/headerText"
+        android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginTop="?attr/confirmDeviceCredentialsTopMargin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="?android:attr/colorAccent"/>
+
+    <TextView
+        style="@android:style/TextAppearance.Material.Body1"
+        android:id="@+id/detailsText"
+        android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
+        android:layout_marginTop="12dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        />
+
+    <Button
+        style="@android:style/Widget.Material.Button.Borderless"
+        android:id="@+id/cancelButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/cancel"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginTop="16dp"/>
+
+    <View android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.5"/>
+
+    <com.android.internal.widget.LockPatternView
+        android:id="@+id/lockPattern"
+        android:layout_width="312dp"
+        android:layout_height="312dp"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="-46dp"
+        android:layout_marginBottom="-46dp"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <TextView
+            style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
+            android:id="@+id/errorText"
+            android:layout_width="wrap_content"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="12dp"
+            android:layout_marginStart="12dp"
+            android:layout_marginEnd="12dp"
+            android:gravity="center_vertical"/>
+
+        <ImageView
+            android:id="@+id/fingerprintIcon"
+            android:layout_gravity="center_horizontal"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_marginBottom="24dp"
+            android:visibility="gone"/>
+    </LinearLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
\ No newline at end of file
diff --git a/res/layout/loading_container.xml b/res/layout/loading_container.xml
new file mode 100644
index 0000000..eb67044
--- /dev/null
+++ b/res/layout/loading_container.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/loading_container"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:visibility="gone"
+    android:gravity="center">
+
+    <ProgressBar style="?android:attr/progressBarStyleLarge"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <TextView android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:text="@string/settings_safetylegal_activity_loading"
+        android:paddingTop="4dip"
+        android:singleLine="true" />
+
+</LinearLayout>
diff --git a/res/layout/manage_applications_apps.xml b/res/layout/manage_applications_apps.xml
index 1e0518d..044cdb4 100644
--- a/res/layout/manage_applications_apps.xml
+++ b/res/layout/manage_applications_apps.xml
@@ -52,25 +52,7 @@
 
         </LinearLayout>
 
-        <LinearLayout android:id="@+id/loading_container"
-                android:orientation="vertical"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:visibility="gone"
-                android:gravity="center">
-
-            <ProgressBar style="?android:attr/progressBarStyleLarge"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
-
-            <TextView android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:textAppearance="?android:attr/textAppearanceSmall"
-                    android:text="@string/settings_safetylegal_activity_loading"
-                    android:paddingTop="4dip"
-                    android:singleLine="true" />
-
-        </LinearLayout>
+        <include layout="@layout/loading_container" />
 
     </FrameLayout>
 
diff --git a/res/layout/manage_applications_running.xml b/res/layout/manage_applications_running.xml
index 485523a..6a9d4e5 100644
--- a/res/layout/manage_applications_running.xml
+++ b/res/layout/manage_applications_running.xml
@@ -29,25 +29,7 @@
                 android:layout_height="match_parent"
                 android:visibility="gone" />
 
-        <LinearLayout android:id="@+id/loading_container"
-                android:orientation="vertical"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:visibility="gone"
-                android:gravity="center">
-
-            <ProgressBar style="?android:attr/progressBarStyleLarge"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
-
-            <TextView android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:textAppearance="?android:attr/textAppearanceSmall"
-                    android:text="@string/settings_safetylegal_activity_loading"
-                    android:paddingTop="4dip"
-                    android:singleLine="true" />
-
-        </LinearLayout>
+        <include layout="@layout/loading_container" />
 
     </FrameLayout>
 
diff --git a/res/layout/preference_list_fragment.xml b/res/layout/preference_list_fragment.xml
index b47e175..6e8ad91 100644
--- a/res/layout/preference_list_fragment.xml
+++ b/res/layout/preference_list_fragment.xml
@@ -29,20 +29,27 @@
                  android:layout_height="wrap_content"
                  android:visibility="gone" />
 
-    <ListView android:id="@android:id/list"
-              style="@style/PreferenceFragmentListSinglePane"
-              android:layout_width="match_parent"
-              android:layout_height="0px"
-              android:layout_weight="1"
-              android:paddingStart="@dimen/settings_side_margin"
-              android:paddingEnd="@dimen/settings_side_margin"
-              android:paddingTop="@dimen/dashboard_padding_top"
-              android:paddingBottom="@dimen/dashboard_padding_bottom"
-              android:scrollbarStyle="@*android:integer/preference_fragment_scrollbarStyle"
-              android:clipToPadding="false"
-              android:drawSelectorOnTop="false"
-              android:elevation="@dimen/dashboard_category_elevation"
-              android:scrollbarAlwaysDrawVerticalTrack="true" />
+    <FrameLayout android:layout_height="0px"
+                 android:layout_weight="1"
+                 android:layout_width="match_parent">
+
+        <ListView android:id="@android:id/list"
+                  style="@style/PreferenceFragmentListSinglePane"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:paddingStart="@dimen/settings_side_margin"
+                  android:paddingEnd="@dimen/settings_side_margin"
+                  android:paddingTop="@dimen/dashboard_padding_top"
+                  android:paddingBottom="@dimen/dashboard_padding_bottom"
+                  android:scrollbarStyle="@*android:integer/preference_fragment_scrollbarStyle"
+                  android:clipToPadding="false"
+                  android:drawSelectorOnTop="false"
+                  android:elevation="@dimen/dashboard_category_elevation"
+                  android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+        <include layout="@layout/loading_container" />
+
+    </FrameLayout>
 
     <TextView android:id="@android:id/empty"
               android:layout_width="match_parent"
diff --git a/res/layout/voice_interaction.xml b/res/layout/voice_interaction.xml
new file mode 100644
index 0000000..13c4341
--- /dev/null
+++ b/res/layout/voice_interaction.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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:id="@+id/fragment_root"
+    android:paddingLeft="8dp"
+    android:paddingRight="8dp"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+</FrameLayout>
diff --git a/res/layout/voice_item_row.xml b/res/layout/voice_item_row.xml
new file mode 100644
index 0000000..8576a57
--- /dev/null
+++ b/res/layout/voice_item_row.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+    <LinearLayout
+        android:id="@+id/row_one"
+        android:orientation="horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_marginTop="20dp"
+        android:layout_marginBottom="20dp">
+
+        <TextView
+            android:layout_width="0px"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:id="@+id/voice_item_label" />
+
+        <TextView
+            android:layout_width="100px"
+            android:layout_height="100px"
+            android:gravity="center_horizontal|center_vertical"
+            android:background="@drawable/bg_circle_blue"
+            android:textAppearance="?android:attr/textAppearanceMediumInverse"
+            android:textStyle="bold"
+            android:id="@+id/voice_item_position" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/zen_rule_name.xml b/res/layout/zen_rule_name.xml
index 62f51ea..a192c83 100755
--- a/res/layout/zen_rule_name.xml
+++ b/res/layout/zen_rule_name.xml
@@ -13,7 +13,8 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >
 
@@ -29,4 +30,34 @@
 
     </EditText>
 
-</FrameLayout>
+    <RadioGroup
+        android:id="@+id/rule_types"
+        android:visibility="gone"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="22dp"
+        android:layout_marginRight="22dp"
+        android:layout_marginTop="16dp"
+        android:orientation="vertical"
+        android:checkedButton="@+id/rule_type_schedule" >
+
+        <RadioButton android:id="@+id/rule_type_schedule"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/zen_schedule_rule_type_name" />
+
+        <RadioButton android:id="@+id/rule_type_2"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <RadioButton android:id="@+id/rule_type_3"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <RadioButton android:id="@+id/rule_type_4"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </RadioGroup>
+
+</LinearLayout>
diff --git a/res/values-land/themes.xml b/res/values-land/themes.xml
new file mode 100644
index 0000000..8f407c6
--- /dev/null
+++ b/res/values-land/themes.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+<resources>
+    <style name="Theme.ConfirmDeviceCredentials" parent="Theme.SubSettings">
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index e1bb33e..a26c99b 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -87,4 +87,6 @@
     <dimen name="wifi_assistant_padding_start_end">24dp</dimen>
     <dimen name="wifi_assistant_padding">25dp</dimen>
     <dimen name="wifi_assistant_text_padding">24dp</dimen>
+
+    <dimen name="confirm_credentials_security_method_margin">72dp</dimen>
 </resources>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index d09b23e..8cf0e86 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -68,5 +68,4 @@
     <style name="KeyguardAppWidgetItem">
         <item name="android:textSize">16sp</item>
     </style>
-
 </resources>
diff --git a/res/values-sw600dp/themes.xml b/res/values-sw600dp/themes.xml
new file mode 100644
index 0000000..833e36e
--- /dev/null
+++ b/res/values-sw600dp/themes.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+<resources>
+    <style name="Theme.ConfirmDeviceCredentials" parent="Theme.SubSettings">
+    </style>
+</resources>
\ No newline at end of file
diff --git a/res/values/aliases.xml b/res/values/aliases.xml
index 97a50c5..248ac71 100644
--- a/res/values/aliases.xml
+++ b/res/values/aliases.xml
@@ -15,7 +15,8 @@
 -->
 
 <resources>
-    <item name="notification_app_section" type="layout">@*android:layout/preference_category_material
-    </item>
+     <item name="notification_app_section" type="layout">@*android:layout/preference_category_material</item>
+     <item name="confirm_lock_pattern" type="layout">@layout/confirm_lock_pattern_base</item>
+     <item name="confirm_lock_password" type="layout">@layout/confirm_lock_password_base</item>
 </resources>
 
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 1fe36d6..248cf92 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -109,4 +109,8 @@
     <attr name="switchBarMarginEnd" format="dimension" />
 
     <attr name="preferenceBackgroundColor" format="color" />
+
+    <!-- Confirm device credentials screen -->
+    <attr name="confirmDeviceCredentialsSideMargin" format="dimension" />
+    <attr name="confirmDeviceCredentialsTopMargin" format="dimension" />
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 97ba2ed..0d0637c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -17,6 +17,7 @@
 <resources>
     <color name="black">#000</color>
     <color name="red">#F00</color>
+    <color name="blue">#00F</color>
 
     <color name="material_empty_color_light">#FFCED7DB</color>
 
@@ -53,7 +54,9 @@
 
     <color name="lock_pattern_background">#00000000</color>
     <color name="lock_pattern_view_regular_color">#ff37474f</color>
-    <color name="lock_pattern_view_error_color">#fff4511e</color>
+    <color name="lock_pattern_view_error_color">@color/warning</color>
+
+    <color name="lock_pattern_view_regular_color_dark">#ffffff</color>
 
     <color name="unlock_pattern_view_regular_color">@android:color/white</color>
     <color name="unlock_pattern_view_error_color">#fff4511e</color>
@@ -76,4 +79,6 @@
     <color name="wifi_divider">#ffe0e0e0</color>
     <color name="sim_noitification">@*android:color/material_deep_teal_500</color>
 
+    <color name="warning">#ff5621</color>
+    <color name="confirm_device_credential_dark_background">#263238</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 1fd22e0..07e6957 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -238,4 +238,5 @@
     <dimen name="fingerprint_ring_radius">96dip</dimen>
     <dimen name="fingerprint_ring_thickness">4dip</dimen>
 
+    <dimen name="confirm_credentials_security_method_margin">48dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7165f86..86eae3a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -830,12 +830,6 @@
     <string name="crypt_keeper_dialog_need_password_message">You need to set a lock screen PIN or
     password before you can start encryption.</string>
 
-    <!-- String at bottom of screen when prompting for pattern.
-         Note: This is only for the pattern case. -->
-    <string name="crypt_keeper_confirm_encrypt">
-    You need to draw your unlock pattern to confirm encrypting your device.
-    </string>
-
     <!-- Title of the final confirmation screen before starting device encryption -->
     <string name="crypt_keeper_confirm_title">Encrypt?</string>
     <!-- Warning text in the final confirmation screen before starting device encryption -->
@@ -2511,19 +2505,17 @@
     <!-- SD card & phone storage settings screen, setting option name under Backup & Restore heading -->
     <string name="reset_network_title">Network settings reset</string>
     <!-- SD card & phone storage settings screen, message on screen after user selects Reset network settings [CHAR LIMIT=NONE] -->
-    <string name="reset_network_desc">This will reset all settings related to networking to the factory defaults, including:\n\n<li>Wifi</li>\n<li>Mobile data</li>\n<li>Bluetooth</li>"</string>
+    <string name="reset_network_desc">This will reset all network settings, including:\n\n<li>Wi\u2011Fi</li>\n<li>Cellular data</li>\n<li>Bluetooth</li>"</string>
     <!-- SD card & phone storage settings screen, button on screen after user selects Reset network settings -->
     <string name="reset_network_button_text">Reset settings</string>
     <!-- SD card & phone storage settings screen, message on screen after user selects Reset settings button -->
-    <string name="reset_network_final_desc">Reset all network settings? You can\'t reverse this action!</string>
+    <string name="reset_network_final_desc">Reset all network settings? You can\'t undo this action!</string>
     <!-- SD card & phone storage settings screen, button on screen after user selects Reset settings button -->
     <string name="reset_network_final_button_text">Reset settings</string>
-    <!-- Explanation of drawing unlock pattern to reset settings -->
-    <string name="reset_network_gesture_explanation">You need to draw your unlock pattern to confirm a network settings reset.</string>
     <!-- Reset settings confirmation screen title [CHAR LIMIT=30] -->
     <string name="reset_network_confirm_title">Reset?</string>
     <!-- Reset settings complete toast text [CHAR LIMIT=75] -->
-    <string name="reset_network_complete_toast">Network settings reset</string>
+    <string name="reset_network_complete_toast">Network settings have been reset</string>
 
     <!-- Master Clear -->
     <!-- SD card & phone storage settings screen, setting option name under Internal phone storage heading [CHAR LIMIT=30] -->
@@ -2557,11 +2549,9 @@
     <!-- SD card & phone storage settings screen, button on screen after user selects Factory data reset -->
     <string name="master_clear_button_text" product="default">Reset phone</string>
     <!-- SD card & phone storage settings screen, message on screen after user selects Reset phone button -->
-    <string name="master_clear_final_desc">Erase all your personal information and downloaded apps? You can\'t reverse this action!</string>
+    <string name="master_clear_final_desc">Erase all your personal information and downloaded apps? You can\'t undo this action!</string>
     <!-- SD card & phone storage settings screen, button on screen after user selects Reset phone button -->
     <string name="master_clear_final_button_text">Erase everything</string>
-    <!-- Explanation of drawing unlock pattern to reset phone -->
-    <string name="master_clear_gesture_explanation">You need to draw your unlock pattern to confirm a factory data reset.</string>
     <!-- Master clear failed message -->
     <string name="master_clear_failed">No reset was performed because the System Clear service isn\'t available.</string>
     <!-- Master clear confirmation screen title [CHAR LIMIT=30] -->
@@ -2596,10 +2586,6 @@
     <string name="media_format_final_desc" product="default">Erase the SD card, deleting all files stored there? You can\'t reverse this action!</string>
     <!-- SD card & phone storage settings screen, button on screen after user selects Format media button -->
     <string name="media_format_final_button_text">Erase everything</string>
-    <!-- Explanation of drawing unlock pattern to format card [CHAR LIMIT=NONE] -->
-    <string name="media_format_gesture_explanation" product="nosdcard">You need to draw your unlock pattern to confirm that you want to erase the USB storage.</string>
-    <!-- Explanation of drawing unlock pattern to format card [CHAR LIMIT=NONE] -->
-    <string name="media_format_gesture_explanation" product="default">You need to draw your unlock pattern to confirm that you want to erase the SD card.</string>
 
     <!-- Main settings screen, Call settings title for item to go into the call settings -->
     <string name="call_settings_title">Call settings</string>
@@ -2852,6 +2838,26 @@
     <!-- Toast shown if setting pattern was successful -->
     <string name="lockpassword_pattern_set_toast">Pattern has been set</string>
 
+    <!-- Message to be used to explain the user that he needs to enter his pattern to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_pattern_generic">Use your device pattern to continue.</string>
+    <!-- Message to be used to explain the user that he needs to enter his PIN to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_pin_generic">Enter your device PIN to continue.</string>
+    <!-- Message to be used to explain the user that he needs to enter his password to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_password_generic">Enter your device password to continue.</string>
+
+    <!-- Security & location settings screen, change security method screen instruction if user
+         enters incorrect PIN [CHAR LIMIT=30] -->
+    <string name="lockpassword_invalid_pin">Wrong PIN</string>
+    <!-- Security & location settings screen, change security method screen instruction if user
+         enters incorrect password [CHAR LIMIT=30] -->
+    <string name="lockpassword_invalid_password">Wrong password</string>
+    <!-- Security & location settings screen, change unlock pattern screen instruction if user
+         draws incorrect pattern [CHAR LIMIT=30] -->
+    <string name="lockpattern_need_to_unlock_wrong">Wrong pattern</string>
+
     <!-- Lock Pattern settings -->
     <!-- Security & location settings screen, header -->
     <string name="lock_settings_title">Device security</string>
@@ -2859,14 +2865,6 @@
     <string name="lockpattern_change_lock_pattern_label">Change unlock pattern</string>
     <!-- Security & location settings screen, change unlock pattern screen instruction when the user chooses "Change unlock pattern".  We first ask the user toe nter the current pattern, and this is the message seen -->
     <string name="lockpattern_change_lock_pin_label">Change unlock PIN</string>
-    <!-- Security & location settings screen, change unlock pattern screen instruction when the user chooses "Change unlock pattern".  We first ask the user toe nter the current pattern, and this is the message seen -->
-    <string name="lockpattern_need_to_unlock">Confirm saved pattern</string>
-    <!-- Do not translate. -->
-    <string name="lockpattern_need_to_unlock_footer" />
-    <!-- Security & location settings screen, change unlock pattern screen instruction if user draws incorrect pattern -->
-    <string name="lockpattern_need_to_unlock_wrong">Try again:</string>
-    <!-- Do not translate. -->
-    <string name="lockpattern_need_to_unlock_wrong_footer" />
     <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen.  This si when they are supposed to draw a new unlock pattern (for example, if they are changing their unlock patterns)..-->
     <string name="lockpattern_recording_intro_header">Draw an unlock pattern</string>
     <!-- Security & location settings screen, change unlock pattern screen hint on bottom of screen.  We are telling them to press the menu button to see more options or help. -->
@@ -2908,10 +2906,9 @@
     <string name="lockpattern_settings_change_lock_pattern">Change unlock pattern</string>
     <!-- Security & location settings screen, the help instructions (an animation) caption -->
     <string name="lockpattern_settings_help_how_to_record">How to draw an unlock pattern</string>
-    <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen after too many incorrect attempts -->
-    <string name="lockpattern_too_many_failed_confirmation_attempts_header">Too many incorrect attempts!</string>
-    <!-- Security & location settings screen, change unlock pattern screen countdown hint on bottom of screen after too many incorrect attempts -->
-    <string name="lockpattern_too_many_failed_confirmation_attempts_footer">Try again in <xliff:g id="number">%d</xliff:g> seconds.</string>
+    <!-- Security & location settings screen, confirm unlock pattern screen hint at the bottom after
+         too many incorrect attempts [CHAR LIMIT=120]-->
+    <string name="lockpattern_too_many_failed_confirmation_attempts">Too many incorrect attempts. Try again in <xliff:g id="number">%d</xliff:g> seconds.</string>
     <!-- Displayed when user launches a widget configuration activity that was uninstalled -->
     <string name="activity_not_found">Application is not installed on your phone.</string>
 
@@ -3498,10 +3495,6 @@
     <string name="oem_unlock_enable">OEM unlocking</string>
     <!-- setting Checkbox summary whether to enable OEM unlock [CHAR_LIMIT=50] -->
     <string name="oem_unlock_enable_summary">Allow the bootloader to be unlocked</string>
-    <!-- Message to enter device PIN to enable OEM unlock -->
-    <string name="oem_unlock_enable_pin_prompt">Enter your PIN</string>
-    <!-- Explanation to enter device pin to enable OEM unlock -->
-    <string name="oem_unlock_enable_pin_description">Enter your device PIN to enable OEM unlock</string>
     <!-- Confirmation dialog title to ensure user wishes to enable OEM unlock and disable theft protection features -->
     <string name="confirm_enable_oem_unlock_title">Allow OEM unlocking?</string>
     <!-- Warning dialog message to confirm user wishes to enable OEM unlock and disable theft protection features -->
@@ -4476,9 +4469,6 @@
     <!-- Error message for users that aren't allowed to see or modify credentials [CHAR LIMIT=none] -->
     <string name="credentials_settings_not_available">Credentials are not available for this user</string>
 
-    <!-- Explanation of drawing unlock pattern to install credentials -->
-    <string name="credentials_install_gesture_explanation">You need to draw your unlock pattern to confirm credential installation.</string>
-
     <!-- Title of dialog to enable credential storage [CHAR LIMIT=30] -->
     <string name="credentials_unlock"></string>
     <!-- Description of dialog to enable credential storage [CHAR LIMIT=NONE] -->
@@ -5381,7 +5371,7 @@
     <!-- Title for add user confirmation dialog [CHAR LIMIT=30] -->
     <string name="user_add_user_title">Add new user?</string>
     <!-- Message for add user confirmation dialog - long version. [CHAR LIMIT=none] -->
-    <string name="user_add_user_message_long">You can share this device with other people by creating additional users. Each user has their own space, which they can customize with their own apps, wallpaper, and so on. Users can also adjust device settings like Wi\u2011Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users.</string>
+    <string name="user_add_user_message_long">You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper, and so on. Users can also adjust device settings like Wi\u2011Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users.</string>
     <!-- Message for add user confirmation dialog - short version. [CHAR LIMIT=none] -->
     <string name="user_add_user_message_short">When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. </string>
     <!-- Title of dialog to setup a new user [CHAR LIMIT=30] -->
@@ -5819,7 +5809,7 @@
     <string name="notification_volume_option_title">Notification volume</string>
 
     <!-- Sound & notification > Sound section: Title for the Interruptions option and associated settings page. [CHAR LIMIT=30] -->
-    <string name="zen_mode_settings_title">@*android:string/zen_mode_feature_name</string>
+    <string name="zen_mode_settings_title" translatable="false">@*android:string/zen_mode_feature_name</string>
 
     <!-- Sound & notification > Sound section: Title for the Priority interruptions option and associated settings page. [CHAR LIMIT=30] -->
     <string name="zen_mode_priority_settings_title">Priority only allows</string>
@@ -5996,11 +5986,23 @@
     <!-- [CHAR LIMIT=40] Zen mode settings: Delete rule dialog button caption -->
     <string name="zen_mode_delete_rule_button">Delete</string>
 
+    <!-- [CHAR LIMIT=40] Zen mode settings: External rule type -->
+    <string name="zen_mode_rule_type">Rule type</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode settings: External rule type name if unknown -->
+    <string name="zen_mode_rule_type_unknown">Unknown</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode settings: Configure external rule -->
+    <string name="zen_mode_configure_rule">Configure rule</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode settings: Schedule rule type name -->
+    <string name="zen_schedule_rule_type_name">Schedule rule</string>
+
     <!-- [CHAR LIMIT=40] Zen mode settings: Text to display if rule isn't found  -->
     <string name="zen_mode_rule_not_found_text">Rule not found.</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Rule summary template (when enabled)  -->
-    <string name="zen_mode_rule_summary_template"><xliff:g id="days" example="Sun - Thu">%1$s</xliff:g> / <xliff:g id="timerange" example="10:00 PM to 7:30 AM">%2$s</xliff:g> / <xliff:g id="mode" example="Alarms only">%3$s</xliff:g></string>
+    <string name="zen_mode_rule_summary_combination"><xliff:g id="description" example="Sun - Thu">%1$s</xliff:g> / <xliff:g id="mode" example="Alarms only">%2$s</xliff:g></string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Timebased rule days option title -->
     <string name="zen_mode_schedule_rule_days">Days</string>
@@ -6077,6 +6079,93 @@
     <!-- [CHAR LIMIT=60] Zen mode settings: End time option: Summary text value format when end time = next day -->
     <string name="zen_mode_end_time_next_day_summary_format"><xliff:g id="formatted_time">%s</xliff:g> next day</string>
 
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Prompt read for interruption type -->
+    <string name="zen_mode_interruptions_voice_prompt">When would you like to be interrupted?</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Prompt read for zen mode duration -->
+    <string name="zen_mode_duration_voice_prompt">For how long?</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Comma delimited synonyms for important interriuptions -->
+    <string name="zen_mode_option_important_voice_synonyms">important,priority,priority notifications</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Comma delimited synonyms for alarm interriuptions -->
+    <string name="zen_mode_option_alarms_voice_synonyms">alarms</string>
+
+    <!--  [CHAR LIMIT=60] Zen mode voice: Off [CHAR LIMIT=60] -->
+    <string name="zen_mode_option_off">Off</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Comma delimited synonyms for off interriuptions -->
+    <string name="zen_mode_option_off_voice_synonyms">off,all,everything</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Comma delimited synonyms for no interriuptions -->
+    <string name="zen_mode_option_no_interruptions_voice_synonyms">none,nothing,no interruptions</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode voice: Label for indefinite mode duration -->
+    <string name="zen_mode_duration_indefinte_voice_label">Indefinitely</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode voice: Label for duration in minutes -->
+    <plurals name="zen_mode_duration_minutes_voice_label">
+       <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> minute</item>
+       <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> minutes</item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=40] Zen mode voice: Label for duration in hours -->
+    <plurals name="zen_mode_duration_hours_voice_label">
+       <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> hour</item>
+       <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> hours</item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice - spoken summary: important only duration indefinite. -->
+    <string name="zen_mode_summary_priority_indefinitely">Change to priority notifications only indefinitely</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: important only duration minutes. -->
+    <plurals name="zen_mode_summary_priority_by_minute">
+        <item quantity="one">Change to priority notifications only for one minute until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to priority notifications only for <xliff:g id="duration" example="2">%1$d</xliff:g> minutes until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: important only duration hours. -->
+    <plurals name="zen_mode_summary_priority_by_hour">
+        <item quantity="one">Change to priority notifications only for one hour until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to priority notifications only for <xliff:g id="duration" example="2">%1$d</xliff:g> hours (until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g>)</item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice - spoken summary: alarms only duration indefinite. -->
+    <string name="zen_mode_summary_alarams_only_indefinite">Change to alarms only indefinitely</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: alarms only duration minutes. -->
+    <plurals name="zen_mode_summary_alarms_only_by_minute">
+        <item quantity="one">Change to alarms only for one minute until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to alarms only for <xliff:g id="duration" example="2">%1$d</xliff:g> minutes (until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g>)</item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: alarms only duration hours. -->
+    <plurals name="zen_mode_summary_alarms_only_by_hour">
+        <item quantity="one">Change to alarms only for one hour until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to alarms only for <xliff:g id="duration" example="2">%1$d</xliff:g> hours until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice - spoken summary: no interruptions duration indefinite. -->
+    <string name="zen_mode_summary_no_interruptions_indefinite">Change to don\'t interrupt indefinitely</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: alarms only duration minutes. -->
+    <plurals name="zen_mode_summary_no_interruptions_by_minute">
+        <item quantity="one">Change to don\'t interrupt for one minute until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to don\'t interrupt for <xliff:g id="duration" example="2">%1$d</xliff:g> minutes (until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g>)</item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice- spoken summary: alarms only duration hours. -->
+    <plurals name="zen_mode_summary_no_interruptions_by_hour">
+        <item quantity="one">Change to don\'t interrupt for one hour until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+        <item quantity="other">Change to don\'t interrupt for <xliff:g id="duration" example="2">%1$d</xliff:g> hours until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
+    </plurals>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice - spoken summary: off. -->
+    <string name="zen_mode_summary_always">Change to always interrupt</string>
+
+    <!-- [CHAR LIMIT=NONE] Zen mode voice: Comma delimited synonyms for indefinte duration -->
+    <string name="zen_mode_duration_indefinite_voice_synonyms">forever</string>
+
     <!-- [CHAR LIMIT=20] Notifications settings: Apps section header -->
     <string name="notification_settings_apps_title">App notifications</string>
 
@@ -6273,6 +6362,9 @@
     <!-- Description for advanced menu option to reset app preferences [CHAR LIMIT=NONE] -->
     <string name="reset_app_preferences_description">Reset preferences across all apps to defaults</string>
 
+    <!-- Summary for a trust agent that was disabled by the device policy [LIMIT=NONE] -->
+    <string name="trust_agent_disabled_device_admin">Disabled by administrator</string>
+
     <!-- Description of settings item that leads to list of all apps [CHAR LIMIT=NONE] -->
     <string name="all_apps_summary"><xliff:g id="count" example="10">%d</xliff:g> apps installed, including system and downloaded apps</string>
 
@@ -6312,6 +6404,9 @@
         <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> apps can open their domain URLs</item>
     </plurals>
 
+    <!-- Fingerprint hint message when finger was not recognized.-->
+    <string name="fingerprint_not_recognized">Not recognized</string>
+
     <!-- Title for Default Apps settings [CHAR LIMIT=30] -->
     <string name="default_apps_title">Default Apps</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 78a3572..22061e6 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -78,7 +78,6 @@
     <style name="TextAppearance.PasswordEntry" parent="android:TextAppearance.Material">
         <item name="android:gravity">center</item>
         <item name="android:singleLine">true</item>
-        <item name="android:textStyle">bold</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
 
@@ -350,6 +349,11 @@
         <item name="android:textColor">@color/fingerprint_message_color</item>
     </style>
 
+    <style name="TextAppearance.ConfirmDeviceCredentialsErrorText"
+        parent="android:TextAppearance.Material.Caption">
+        <item name="android:textColor">@color/warning</item>
+    </style>
+
     <style name="TextAppearance.Small.SwitchBar">
         <item name="android:textColor">?android:attr/textColorPrimary</item>
         <item name="android:textStyle">normal</item>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 48c5457..379c36a 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -211,4 +211,24 @@
         <item name="android:colorAccent">@color/switch_accent_color</item>
     </style>
 
+    <style name="Theme.ConfirmDeviceCredentials" parent="Theme.SubSettings">
+        <item name="confirmDeviceCredentialsSideMargin">16dp</item>
+        <item name="confirmDeviceCredentialsTopMargin">16dp</item>
+    </style>
+
+    <style name="Theme.ConfirmDeviceCredentialsDark" parent="@android:style/Theme.Material">
+        <item name="android:colorPrimary">@*android:color/material_blue_grey_900</item>
+        <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_950</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="preferenceBackgroundColor">@color/confirm_device_credential_dark_background</item>
+
+        <item name="confirmDeviceCredentialsSideMargin">32dp</item>
+        <item name="confirmDeviceCredentialsTopMargin">32dp</item>
+
+        <!-- LockPatternView colors -->
+        <item name="@*android:regularColor">@color/lock_pattern_view_regular_color_dark</item>
+        <item name="@*android:successColor">@color/lock_pattern_view_regular_color_dark</item>
+        <item name="@*android:errorColor">@color/lock_pattern_view_error_color</item>
+    </style>
 </resources>
diff --git a/res/xml/zen_mode_external_rule_settings.xml b/res/xml/zen_mode_external_rule_settings.xml
new file mode 100644
index 0000000..e244dc8
--- /dev/null
+++ b/res/xml/zen_mode_external_rule_settings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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_external_rule_settings" >
+
+    <!-- Rule name -->
+    <Preference
+        android:key="rule_name"
+        android:title="@string/zen_mode_rule_name"
+        android:persistent="false" />
+
+    <!-- Rule type -->
+    <Preference
+        android:key="type"
+        android:title="@string/zen_mode_rule_type"
+        android:persistent="false" />
+
+    <!-- Configure -->
+    <Preference
+        android:key="configure"
+        android:title="@string/zen_mode_configure_rule"
+        android:persistent="false" />
+
+    <!-- Zen mode -->
+    <com.android.settings.DropDownPreference
+        android:key="zen_mode"
+        android:title="@string/zen_mode_settings_title"
+        android:persistent="false" />
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/AirplaneModeVoiceActivity.java b/src/com/android/settings/AirplaneModeVoiceActivity.java
index 3ab0c37..e0649e4 100644
--- a/src/com/android/settings/AirplaneModeVoiceActivity.java
+++ b/src/com/android/settings/AirplaneModeVoiceActivity.java
@@ -20,6 +20,8 @@
 import android.provider.Settings;
 import android.util.Log;
 
+import com.android.settings.utils.VoiceSettingsActivity;
+
 /**
  * Activity for modifying the {@link Settings.Global#AIRPLANE_MODE_ON AIRPLANE_MODE_ON}
  * setting using the Voice Interaction API.
@@ -27,14 +29,14 @@
 public class AirplaneModeVoiceActivity extends VoiceSettingsActivity {
     private static final String TAG = "AirplaneModeVoiceActivity";
 
-    protected void onVoiceSettingInteraction(Intent intent) {
+    protected boolean onVoiceSettingInteraction(Intent intent) {
         if (intent.hasExtra(Settings.EXTRA_AIRPLANE_MODE_ENABLED)) {
-            boolean enabled =
-                    intent.getBooleanExtra(Settings.EXTRA_AIRPLANE_MODE_ENABLED, false);
             Settings.Global.putInt(getContentResolver(),
-                    Settings.Global.AIRPLANE_MODE_ON, enabled ? 1 : 0);
+                    Settings.Global.AIRPLANE_MODE_ON,
+                    intent.getBooleanExtra(Settings.EXTRA_AIRPLANE_MODE_ENABLED, false) ? 1 : 0);
         } else {
             Log.v(TAG, "Missing airplane mode extra");
         }
+        return true;
     }
 }
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 479baf7..f4e3c4e 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -145,7 +145,8 @@
             } else if (!mWaitingForConfirmation) {
                 ChooseLockSettingsHelper helper =
                         new ChooseLockSettingsHelper(this.getActivity(), this);
-                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
+                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
+                        getString(R.string.unlock_set_unlock_launch_picker_title))) {
                     mPasswordConfirmed = true; // no password set, so no need to confirm
                     updatePreferencesOrFinish();
                 } else {
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 6d7b71d..8838286 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -243,7 +243,7 @@
                 updateStage(Stage.Introduction);
                 if (confirmCredentials) {
                     mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                            null, null);
+                            getString(R.string.unlock_set_unlock_launch_picker_title));
                 }
             } else {
                 mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 1865a6b..8892346 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -379,7 +379,8 @@
                     updateStage(Stage.NeedToConfirm);
                     boolean launchedConfirmationActivity =
                         mChooseLockSettingsHelper.launchConfirmationActivity(
-                                CONFIRM_EXISTING_REQUEST, null, null);
+                                CONFIRM_EXISTING_REQUEST,
+                                getString(R.string.unlock_set_unlock_launch_picker_title));
                     if (!launchedConfirmationActivity) {
                         updateStage(Stage.Introduction);
                     }
diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java
index bba45ce..65697f6 100644
--- a/src/com/android/settings/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/ChooseLockSettingsHelper.java
@@ -16,13 +16,14 @@
 
 package com.android.settings;
 
-import com.android.internal.widget.LockPatternUtils;
-
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
 
+import com.android.internal.widget.LockPatternUtils;
+
 public final class ChooseLockSettingsHelper {
 
     static final String EXTRA_KEY_TYPE = "type";
@@ -48,64 +49,77 @@
 
     /**
      * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     * @param message optional message to display about the action about to be done
-     * @param details optional detail message to display
+     *
+     * @param title title of the confirmation screen; shown in the action bar
      * @return true if one exists and we launched an activity to confirm it
-     * @see #onActivityResult(int, int, android.content.Intent)
+     * @see Activity#onActivityResult(int, int, android.content.Intent)
      */
-    boolean launchConfirmationActivity(int request, CharSequence message, CharSequence details) {
-        return launchConfirmationActivity(request, message, details, false);
+    boolean launchConfirmationActivity(int request, CharSequence title) {
+        return launchConfirmationActivity(request, title, null, null, false, false);
     }
 
     /**
      * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
-     * @param message optional message to display about the action about to be done
-     * @param details optional detail message to display
+     *
+     * @param title title of the confirmation screen; shown in the action bar
      * @param returnCredentials if true, put credentials into intent. Note that if this is true,
-                                this can only be called internally.
+     *                          this can only be called internally.
      * @return true if one exists and we launched an activity to confirm it
-     * @see #onActivityResult(int, int, android.content.Intent)
+     * @see Activity#onActivityResult(int, int, android.content.Intent)
      */
-    boolean launchConfirmationActivity(int request, CharSequence message, CharSequence details,
-                                       boolean returnCredentials) {
+    boolean launchConfirmationActivity(int request, CharSequence title, boolean returnCredentials) {
+        return launchConfirmationActivity(request, title, null, null, returnCredentials, false);
+    }
+
+    /**
+     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
+     *
+     * @param title title of the confirmation screen; shown in the action bar
+     * @param header header of the confirmation screen; shown as large text
+     * @param description description of the confirmation screen
+     * @param returnCredentials if true, put credentials into intent. Note that if this is true,
+     *                          this can only be called internally.
+     * @param external specifies whether this activity is launched externally, meaning that it will
+     *                 get a dark theme and allow fingerprint authentication
+     * @return true if one exists and we launched an activity to confirm it
+     * @see Activity#onActivityResult(int, int, android.content.Intent)
+     */
+    boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
+            @Nullable CharSequence header, @Nullable CharSequence description,
+            boolean returnCredentials, boolean external) {
         boolean launched = false;
         switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
             case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                launched = confirmPattern(request, message, details, returnCredentials);
+                launched = launchConfirmationActivity(request, title, header, description,
+                        returnCredentials
+                                ? ConfirmLockPattern.InternalActivity.class
+                                : ConfirmLockPattern.class, external);
                 break;
             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
             case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
             case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
             case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
-                // TODO: update UI layout for ConfirmPassword to show message and details
-                launched = confirmPassword(request, message, returnCredentials);
+                launched = launchConfirmationActivity(request, title, header, description,
+                        returnCredentials
+                                ? ConfirmLockPassword.InternalActivity.class
+                                : ConfirmLockPassword.class, external);
                 break;
         }
         return launched;
     }
 
-    /**
-     * Launch screen to confirm the existing lock pattern.
-     * @param message shown in header of ConfirmLockPattern if not null
-     * @param details shown in footer of ConfirmLockPattern if not null
-     * @param returnCredentials if true, put credentials into intent.
-     * @see #onActivityResult(int, int, android.content.Intent)
-     * @return true if we launched an activity to confirm pattern
-     */
-    private boolean confirmPattern(int request, CharSequence message,
-                                   CharSequence details, boolean returnCredentials) {
-        if (!mLockPatternUtils.isLockPatternEnabled()) {
-            return false;
-        }
+    private boolean launchConfirmationActivity(int request, CharSequence title, CharSequence header,
+            CharSequence message, Class<?> activityClass, boolean external) {
         final Intent intent = new Intent();
-        // supply header and footer text in the intent
-        intent.putExtra(ConfirmLockPattern.HEADER_TEXT, message);
-        intent.putExtra(ConfirmLockPattern.FOOTER_TEXT, details);
-        intent.setClassName("com.android.settings",
-                            returnCredentials
-                            ? ConfirmLockPattern.InternalActivity.class.getName()
-                            : ConfirmLockPattern.class.getName());
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.HEADER_TEXT, header);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.DETAILS_TEXT, message);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, external);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, external);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, external);
+        intent.putExtra(ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, external);
+        intent.setClassName(ConfirmDeviceCredentialBaseFragment.PACKAGE, activityClass.getName());
         if (mFragment != null) {
             mFragment.startActivityForResult(intent, request);
         } else {
@@ -113,31 +127,4 @@
         }
         return true;
     }
-
-    /**
-     * Launch screen to confirm the existing lock password.
-     * @param message shown in header of ConfirmLockPassword if not null
-     * @param returnCredentials if true, put credentials into intent.
-     * @see #onActivityResult(int, int, android.content.Intent)
-     * @return true if we launched an activity to confirm password
-     */
-    private boolean confirmPassword(int request, CharSequence message,
-            boolean returnCredentials) {
-        if (!mLockPatternUtils.isLockPasswordEnabled()) return false;
-        final Intent intent = new Intent();
-        // supply header text in the intent
-        intent.putExtra(ConfirmLockPattern.HEADER_TEXT, message);
-        intent.setClassName("com.android.settings",
-                            returnCredentials
-                            ? ConfirmLockPassword.InternalActivity.class.getName()
-                            : ConfirmLockPassword.class.getName());
-        if (mFragment != null) {
-            mFragment.startActivityForResult(intent, request);
-        } else {
-            mActivity.startActivityForResult(intent, request);
-        }
-        return true;
-    }
-
-
 }
diff --git a/src/com/android/settings/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
index beb2d97..9a7f843 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
@@ -48,7 +48,8 @@
         String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
 
         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-        if (!helper.launchConfirmationActivity(0 /* request code */, title, details)) {
+        if (!helper.launchConfirmationActivity(0 /* request code */, null /* title */, title,
+                details, false /* returnCredentials */, true /* isExternal */)) {
             Log.d(TAG, "No pattern, password or PIN set.");
             setResult(Activity.RESULT_OK);
             finish();
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
new file mode 100644
index 0000000..fe3de97
--- /dev/null
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.app.KeyguardManager;
+import android.os.Bundle;
+import android.view.MenuItem;
+import android.view.WindowManager;
+
+public class ConfirmDeviceCredentialBaseActivity extends SettingsActivity {
+
+    @Override
+    protected void onCreate(Bundle savedState) {
+        if (getIntent().getBooleanExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
+            setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
+        }
+        super.onCreate(savedState);
+        boolean deviceLocked = getSystemService(KeyguardManager.class).isKeyguardLocked();
+        if (deviceLocked && getIntent().getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false)) {
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+        }
+        CharSequence msg = getIntent().getStringExtra(
+                ConfirmDeviceCredentialBaseFragment.TITLE_TEXT);
+        setTitle(msg);
+        if (getActionBar() != null) {
+            getActionBar().setDisplayHomeAsUpEnabled(true);
+            getActionBar().setHomeButtonEnabled(true);
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            finish();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
new file mode 100644
index 0000000..f9908b0
--- /dev/null
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.annotation.Nullable;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * Base fragment to be shared for PIN/Pattern/Password confirmation fragments.
+ */
+public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFragment
+        implements FingerprintUiHelper.Callback {
+
+    public static final String PACKAGE = "com.android.settings";
+    public static final String TITLE_TEXT = PACKAGE + ".ConfirmCredentials.title";
+    public static final String HEADER_TEXT = PACKAGE + ".ConfirmCredentials.header";
+    public static final String DETAILS_TEXT = PACKAGE + ".ConfirmCredentials.details";
+    public static final String ALLOW_FP_AUTHENTICATION =
+            PACKAGE + ".ConfirmCredentials.allowFpAuthentication";
+    public static final String DARK_THEME = PACKAGE + ".ConfirmCredentials.darkTheme";
+    public static final String SHOW_CANCEL_BUTTON =
+            PACKAGE + ".ConfirmCredentials.showCancelButton";
+    public static final String SHOW_WHEN_LOCKED =
+            PACKAGE + ".ConfirmCredentials.showWhenLocked";
+
+    private FingerprintUiHelper mFingerprintHelper;
+    private boolean mAllowFpAuthentication;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAllowFpAuthentication = getActivity().getIntent().getBooleanExtra(
+                ALLOW_FP_AUTHENTICATION, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        mFingerprintHelper = new FingerprintUiHelper(
+                (ImageView) view.findViewById(R.id.fingerprintIcon),
+                (TextView) view.findViewById(R.id.errorText), this);
+        boolean showCancelButton = getActivity().getIntent().getBooleanExtra(
+                SHOW_CANCEL_BUTTON, false);
+        Button cancelButton = (Button) view.findViewById(R.id.cancelButton);
+        cancelButton.setVisibility(showCancelButton ? View.VISIBLE : View.GONE);
+        cancelButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                getActivity().finish();
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (mAllowFpAuthentication) {
+            mFingerprintHelper.startListening();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (mAllowFpAuthentication) {
+            mFingerprintHelper.stopListening();
+        }
+    }
+
+    @Override
+    public void onAuthenticated() {
+        // Check whether we are still active.
+        if (getActivity() != null && getActivity().isResumed()) {
+            authenticationSucceeded(null /* password */);
+        }
+    }
+
+    protected abstract void authenticationSucceeded(@Nullable String password);
+
+    @Override
+    public void onFingerprintIconVisibilityChanged(boolean visible) {
+    }
+}
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index b49dc6e..44c599b 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -16,14 +16,11 @@
 
 package com.android.settings;
 
+import android.annotation.Nullable;
 import android.text.TextUtils;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.PasswordEntryKeyboardHelper;
-import com.android.internal.widget.PasswordEntryKeyboardView;
 
-import android.app.Activity;
-import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
 import android.os.Bundle;
@@ -31,23 +28,18 @@
 import android.os.Handler;
 import android.os.SystemClock;
 import android.os.storage.StorageManager;
-import android.text.Editable;
 import android.text.InputType;
-import android.text.TextWatcher;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 
-public class ConfirmLockPassword extends SettingsActivity {
-
-    public static final String PACKAGE = "com.android.settings";
-    public static final String HEADER_TEXT = PACKAGE + ".ConfirmLockPattern.header";
+public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
 
     public static class InternalActivity extends ConfirmLockPassword {
     }
@@ -65,28 +57,17 @@
         return false;
     }
 
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        // Disable IME on our window since we provide our own keyboard
-        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
-                //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
-        super.onCreate(savedInstanceState);
-        CharSequence msg = getText(R.string.lockpassword_confirm_your_password_header);
-        setTitle(msg);
-    }
-
-    public static class ConfirmLockPasswordFragment extends InstrumentedFragment
-            implements OnClickListener, OnEditorActionListener, TextWatcher {
+    public static class ConfirmLockPasswordFragment extends ConfirmDeviceCredentialBaseFragment
+            implements OnClickListener, OnEditorActionListener {
         private static final String KEY_NUM_WRONG_CONFIRM_ATTEMPTS
                 = "confirm_lock_password_fragment.key_num_wrong_confirm_attempts";
         private static final long ERROR_MESSAGE_TIMEOUT = 3000;
         private TextView mPasswordEntry;
         private LockPatternUtils mLockPatternUtils;
-        private TextView mHeaderText;
+        private TextView mHeaderTextView;
+        private TextView mDetailsTextView;
+        private TextView mErrorTextView;
         private Handler mHandler = new Handler();
-        private PasswordEntryKeyboardHelper mKeyboardHelper;
-        private PasswordEntryKeyboardView mKeyboardView;
-        private Button mContinueButton;
         private int mNumWrongConfirmAttempts;
         private CountDownTimer mCountdownTimer;
         private boolean mIsAlpha;
@@ -111,51 +92,35 @@
                 Bundle savedInstanceState) {
             final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
             View view = inflater.inflate(R.layout.confirm_lock_password, null);
-            // Disable IME on our window since we provide our own keyboard
-
-            view.findViewById(R.id.cancel_button).setOnClickListener(this);
-            mContinueButton = (Button) view.findViewById(R.id.next_button);
-            mContinueButton.setOnClickListener(this);
-            mContinueButton.setEnabled(false); // disable until the user enters at least one char
 
             mPasswordEntry = (TextView) view.findViewById(R.id.password_entry);
             mPasswordEntry.setOnEditorActionListener(this);
-            mPasswordEntry.addTextChangedListener(this);
 
-            mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard);
-            mHeaderText = (TextView) view.findViewById(R.id.headerText);
+            mHeaderTextView = (TextView) view.findViewById(R.id.headerText);
+            mDetailsTextView = (TextView) view.findViewById(R.id.detailsText);
+            mErrorTextView = (TextView) view.findViewById(R.id.errorText);
             mIsAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
                     || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
                     || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality;
 
             Intent intent = getActivity().getIntent();
             if (intent != null) {
-                CharSequence headerMessage = intent.getCharSequenceExtra(HEADER_TEXT);
+                CharSequence headerMessage = intent.getCharSequenceExtra(
+                        ConfirmDeviceCredentialBaseFragment.HEADER_TEXT);
+                CharSequence detailsMessage = intent.getCharSequenceExtra(
+                        ConfirmDeviceCredentialBaseFragment.DETAILS_TEXT);
                 if (TextUtils.isEmpty(headerMessage)) {
                     headerMessage = getString(getDefaultHeader());
                 }
-                mHeaderText.setText(headerMessage);
+                if (TextUtils.isEmpty(detailsMessage)) {
+                    detailsMessage = getString(getDefaultDetails());
+                }
+                mHeaderTextView.setText(headerMessage);
+                mDetailsTextView.setText(detailsMessage);
             }
-
-            final Activity activity = getActivity();
-            mKeyboardHelper = new PasswordEntryKeyboardHelper(activity,
-                    mKeyboardView, mPasswordEntry);
-            mKeyboardHelper.setKeyboardMode(mIsAlpha ?
-                    PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
-                    : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
-            mKeyboardView.requestFocus();
-
             int currentType = mPasswordEntry.getInputType();
             mPasswordEntry.setInputType(mIsAlpha ? currentType
                     : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
-
-            if (activity instanceof SettingsActivity) {
-                final SettingsActivity sa = (SettingsActivity) activity;
-                int id = getDefaultHeader();
-                CharSequence title = getText(id);
-                sa.setTitle(title);
-            }
-
             return view;
         }
 
@@ -164,10 +129,19 @@
                     : R.string.lockpassword_confirm_your_pin_header;
         }
 
+        private int getDefaultDetails() {
+            return mIsAlpha ? R.string.lockpassword_confirm_your_password_generic
+                    : R.string.lockpassword_confirm_your_pin_generic;
+        }
+
+        private int getErrorMessage() {
+            return mIsAlpha ? R.string.lockpassword_invalid_password
+                    : R.string.lockpassword_invalid_pin;
+        }
+
         @Override
         public void onPause() {
             super.onPause();
-            mKeyboardView.requestFocus();
             if (mCountdownTimer != null) {
                 mCountdownTimer.cancel();
                 mCountdownTimer = null;
@@ -181,9 +155,7 @@
 
         @Override
         public void onResume() {
-            // TODO Auto-generated method stub
             super.onResume();
-            mKeyboardView.requestFocus();
             long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
             if (deadline != 0) {
                 handleAttemptLockout(deadline);
@@ -196,33 +168,35 @@
             outState.putInt(KEY_NUM_WRONG_CONFIRM_ATTEMPTS, mNumWrongConfirmAttempts);
         }
 
+        @Override
+        protected void authenticationSucceeded(@Nullable String password) {
+            Intent intent = new Intent();
+            if (getActivity() instanceof ConfirmLockPassword.InternalActivity) {
+                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
+                        mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD
+                                : StorageManager.CRYPT_TYPE_PIN);
+                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
+            }
+            getActivity().setResult(RESULT_OK, intent);
+            getActivity().finish();
+        }
+
         private void handleNext() {
             final String pin = mPasswordEntry.getText().toString();
             if (mLockPatternUtils.checkPassword(pin)) {
-
-                Intent intent = new Intent();
-                if (getActivity() instanceof ConfirmLockPassword.InternalActivity) {
-                    intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
-                                    mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD
-                                             : StorageManager.CRYPT_TYPE_PIN);
-                    intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pin);
-                }
-
-                getActivity().setResult(RESULT_OK, intent);
-                getActivity().finish();
+                authenticationSucceeded(pin);
             } else {
                 if (++mNumWrongConfirmAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) {
                     long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
                     handleAttemptLockout(deadline);
                 } else {
-                    showError(R.string.lockpattern_need_to_unlock_wrong);
+                    showError(getErrorMessage());
                 }
             }
         }
 
         private void handleAttemptLockout(long elapsedRealtimeDeadline) {
             long elapsedRealtime = SystemClock.elapsedRealtime();
-            showError(R.string.lockpattern_too_many_failed_confirmation_attempts_header, 0);
             mPasswordEntry.setEnabled(false);
             mCountdownTimer = new CountDownTimer(
                     elapsedRealtimeDeadline - elapsedRealtime,
@@ -231,15 +205,15 @@
                 @Override
                 public void onTick(long millisUntilFinished) {
                     final int secondsCountdown = (int) (millisUntilFinished / 1000);
-                    mHeaderText.setText(getString(
-                            R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
-                            secondsCountdown));
+                    showError(getString(
+                            R.string.lockpattern_too_many_failed_confirmation_attempts,
+                            secondsCountdown), 0);
                 }
 
                 @Override
                 public void onFinish() {
                     mPasswordEntry.setEnabled(true);
-                    mHeaderText.setText(getDefaultHeader());
+                    mErrorTextView.setText("");
                     mNumWrongConfirmAttempts = 0;
                 }
             }.start();
@@ -264,13 +238,13 @@
 
         private final Runnable mResetErrorRunnable = new Runnable() {
             public void run() {
-                mHeaderText.setText(getDefaultHeader());
+                mErrorTextView.setText("");
             }
         };
 
-        private void showError(int msg, long timeout) {
-            mHeaderText.setText(msg);
-            mHeaderText.announceForAccessibility(mHeaderText.getText());
+        private void showError(CharSequence msg, long timeout) {
+            mErrorTextView.setText(msg);
+            mErrorTextView.announceForAccessibility(mErrorTextView.getText());
             mPasswordEntry.setText(null);
             mHandler.removeCallbacks(mResetErrorRunnable);
             if (timeout != 0) {
@@ -278,6 +252,10 @@
             }
         }
 
+        private void showError(int msg, long timeout) {
+            showError(getText(msg), timeout);
+        }
+
         // {@link OnEditorActionListener} methods.
         public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
             // Check if this was the result of hitting the enter or "done" key
@@ -289,16 +267,5 @@
             }
             return false;
         }
-
-        // {@link TextWatcher} methods.
-        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-        }
-
-        public void onTextChanged(CharSequence s, int start, int before, int count) {
-        }
-
-        public void afterTextChanged(Editable s) {
-            mContinueButton.setEnabled(mPasswordEntry.getText().length() > 0);
-        }
     }
 }
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index b5d444b..8c4fabc 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -22,13 +22,14 @@
 import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
 import com.android.internal.widget.LockPatternView.Cell;
 
+import android.annotation.Nullable;
 import android.app.Activity;
-import android.app.Fragment;
 import android.content.Intent;
 import android.os.CountDownTimer;
 import android.os.SystemClock;
 import android.os.Bundle;
 import android.os.storage.StorageManager;
+import android.view.MenuItem;
 import android.widget.TextView;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -42,23 +43,11 @@
  * Sets an activity result of {@link Activity#RESULT_OK} when the user
  * successfully confirmed their pattern.
  */
-public class ConfirmLockPattern extends SettingsActivity {
+public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
 
     public static class InternalActivity extends ConfirmLockPattern {
     }
 
-    /**
-     * Names of {@link CharSequence} fields within the originating {@link Intent}
-     * that are used to configure the keyguard confirmation view's labeling.
-     * The view will use the system-defined resource strings for any labels that
-     * the caller does not supply.
-     */
-    public static final String PACKAGE = "com.android.settings";
-    public static final String HEADER_TEXT = PACKAGE + ".ConfirmLockPattern.header";
-    public static final String FOOTER_TEXT = PACKAGE + ".ConfirmLockPattern.footer";
-    public static final String HEADER_WRONG_TEXT = PACKAGE + ".ConfirmLockPattern.header_wrong";
-    public static final String FOOTER_WRONG_TEXT = PACKAGE + ".ConfirmLockPattern.footer_wrong";
-
     private enum Stage {
         NeedToUnlock,
         NeedToUnlockWrong,
@@ -66,13 +55,6 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        CharSequence msg = getText(R.string.lockpassword_confirm_your_pattern_header);
-        setTitle(msg);
-    }
-
-    @Override
     public Intent getIntent() {
         Intent modIntent = new Intent(super.getIntent());
         modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPatternFragment.class.getName());
@@ -85,7 +67,7 @@
         return false;
     }
 
-    public static class ConfirmLockPatternFragment extends InstrumentedFragment {
+    public static class ConfirmLockPatternFragment extends ConfirmDeviceCredentialBaseFragment {
 
         // how long we wait to clear a wrong pattern
         private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
@@ -98,13 +80,14 @@
         private CountDownTimer mCountdownTimer;
 
         private TextView mHeaderTextView;
-        private TextView mFooterTextView;
+        private TextView mDetailsTextView;
+        private TextView mErrorTextView;
+        private View mLeftSpacerLandscape;
+        private View mRightSpacerLandscape;
 
         // caller-supplied text for various prompts
         private CharSequence mHeaderText;
-        private CharSequence mFooterText;
-        private CharSequence mHeaderWrongText;
-        private CharSequence mFooterWrongText;
+        private CharSequence mDetailsText;
 
         // required constructor for fragments
         public ConfirmLockPatternFragment() {
@@ -123,7 +106,10 @@
             View view = inflater.inflate(R.layout.confirm_lock_pattern, null);
             mHeaderTextView = (TextView) view.findViewById(R.id.headerText);
             mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
-            mFooterTextView = (TextView) view.findViewById(R.id.footerText);
+            mDetailsTextView = (TextView) view.findViewById(R.id.detailsText);
+            mErrorTextView = (TextView) view.findViewById(R.id.errorText);
+            mLeftSpacerLandscape = view.findViewById(R.id.leftSpacer);
+            mRightSpacerLandscape = view.findViewById(R.id.rightSpacer);
 
             // make it so unhandled touch events within the unlock screen go to the
             // lock pattern view.
@@ -133,10 +119,10 @@
 
             Intent intent = getActivity().getIntent();
             if (intent != null) {
-                mHeaderText = intent.getCharSequenceExtra(HEADER_TEXT);
-                mFooterText = intent.getCharSequenceExtra(FOOTER_TEXT);
-                mHeaderWrongText = intent.getCharSequenceExtra(HEADER_WRONG_TEXT);
-                mFooterWrongText = intent.getCharSequenceExtra(FOOTER_WRONG_TEXT);
+                mHeaderText = intent.getCharSequenceExtra(
+                        ConfirmDeviceCredentialBaseFragment.HEADER_TEXT);
+                mDetailsText = intent.getCharSequenceExtra(
+                        ConfirmDeviceCredentialBaseFragment.DETAILS_TEXT);
             }
 
             mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
@@ -199,28 +185,21 @@
                     if (mHeaderText != null) {
                         mHeaderTextView.setText(mHeaderText);
                     } else {
-                        mHeaderTextView.setText(R.string.lockpattern_need_to_unlock);
+                        mHeaderTextView.setText(R.string.lockpassword_confirm_your_pattern_header);
                     }
-                    if (mFooterText != null) {
-                        mFooterTextView.setText(mFooterText);
+                    if (mDetailsText != null) {
+                        mDetailsTextView.setText(mDetailsText);
                     } else {
-                        mFooterTextView.setText(R.string.lockpattern_need_to_unlock_footer);
+                        mDetailsTextView.setText(
+                                R.string.lockpassword_confirm_your_pattern_generic);
                     }
+                    mErrorTextView.setText("");
 
                     mLockPatternView.setEnabled(true);
                     mLockPatternView.enableInput();
                     break;
                 case NeedToUnlockWrong:
-                    if (mHeaderWrongText != null) {
-                        mHeaderTextView.setText(mHeaderWrongText);
-                    } else {
-                        mHeaderTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
-                    }
-                    if (mFooterWrongText != null) {
-                        mFooterTextView.setText(mFooterWrongText);
-                    } else {
-                        mFooterTextView.setText(R.string.lockpattern_need_to_unlock_wrong_footer);
-                    }
+                    mErrorTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
 
                     mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
                     mLockPatternView.setEnabled(true);
@@ -252,6 +231,28 @@
             mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
         }
 
+        @Override
+        protected void authenticationSucceeded(@Nullable String password) {
+            Intent intent = new Intent();
+            if (getActivity() instanceof ConfirmLockPattern.InternalActivity) {
+                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
+                        StorageManager.CRYPT_TYPE_PATTERN);
+                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
+            }
+            getActivity().setResult(Activity.RESULT_OK, intent);
+            getActivity().finish();
+        }
+
+        @Override
+        public void onFingerprintIconVisibilityChanged(boolean visible) {
+            if (mLeftSpacerLandscape != null && mRightSpacerLandscape != null) {
+
+                // In landscape, adjust spacing depending on fingerprint icon visibility.
+                mLeftSpacerLandscape.setVisibility(visible ? View.GONE : View.VISIBLE);
+                mRightSpacerLandscape.setVisibility(visible ? View.GONE : View.VISIBLE);
+            }
+        }
+
         /**
          * The pattern listener that responds according to a user confirming
          * an existing lock pattern.
@@ -273,17 +274,7 @@
 
             public void onPatternDetected(List<LockPatternView.Cell> pattern) {
                 if (mLockPatternUtils.checkPattern(pattern)) {
-
-                    Intent intent = new Intent();
-                    if (getActivity() instanceof ConfirmLockPattern.InternalActivity) {
-                        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
-                                        StorageManager.CRYPT_TYPE_PATTERN);
-                        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD,
-                                        LockPatternUtils.patternToString(pattern));
-                    }
-
-                    getActivity().setResult(Activity.RESULT_OK, intent);
-                    getActivity().finish();
+                    authenticationSucceeded(LockPatternUtils.patternToString(pattern));
                 } else {
                     if (pattern.size() >= LockPatternUtils.MIN_PATTERN_REGISTER_FAIL &&
                             ++mNumWrongConfirmAttempts
@@ -308,10 +299,9 @@
 
                 @Override
                 public void onTick(long millisUntilFinished) {
-                    mHeaderTextView.setText(R.string.lockpattern_too_many_failed_confirmation_attempts_header);
                     final int secondsCountdown = (int) (millisUntilFinished / 1000);
-                    mFooterTextView.setText(getString(
-                            R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
+                    mErrorTextView.setText(getString(
+                            R.string.lockpattern_too_many_failed_confirmation_attempts,
                             secondsCountdown));
                 }
 
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index 45d3d11..8506964 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -439,9 +439,8 @@
     private boolean confirmKeyGuard() {
         Resources res = getResources();
         boolean launched = new ChooseLockSettingsHelper(this)
-                .launchConfirmationActivity(CONFIRM_KEY_GUARD_REQUEST, null,
-                                            res.getText(R.string.credentials_install_gesture_explanation),
-                                            true);
+                .launchConfirmationActivity(CONFIRM_KEY_GUARD_REQUEST,
+                        res.getText(R.string.credentials_title), true);
         return launched;
     }
 
diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java
index 3fb60e3..2e4aeb8 100644
--- a/src/com/android/settings/CryptKeeperSettings.java
+++ b/src/com/android/settings/CryptKeeperSettings.java
@@ -166,9 +166,8 @@
             return true;
         }
 
-        return helper.launchConfirmationActivity(request, null,
-                res.getText(R.string.crypt_keeper_confirm_encrypt),
-                true);
+        return helper.launchConfirmationActivity(request,
+                res.getText(R.string.crypt_keeper_encrypt_title), true);
     }
 
     @Override
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 5fafc92..5c7e0e9 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -1610,10 +1610,8 @@
     }
 
     private boolean showKeyguardConfirmation(Resources resources, int requestCode) {
-        return new ChooseLockSettingsHelper(getActivity(), this)
-                .launchConfirmationActivity(requestCode,
-                        resources.getString(R.string.oem_unlock_enable_pin_prompt),
-                        resources.getString(R.string.oem_unlock_enable_pin_description));
+        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
+                requestCode, resources.getString(R.string.oem_unlock_enable));
     }
 
     @Override
diff --git a/src/com/android/settings/FingerprintUiHelper.java b/src/com/android/settings/FingerprintUiHelper.java
new file mode 100644
index 0000000..20ad7fc
--- /dev/null
+++ b/src/com/android/settings/FingerprintUiHelper.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.CancellationSignal;
+import android.os.Vibrator;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * Small helper class to manage text/icon around fingerprint authentication UI.
+ */
+public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
+
+    private static final long ERROR_TIMEOUT = 1300;
+    private static final long[] FP_ERROR_VIBRATE_PATTERN = new long[] {0, 30, 100, 30};
+    private static final long[] FP_SUCCESS_VIBRATE_PATTERN = new long[] {0, 30};
+
+    private ImageView mIcon;
+    private TextView mErrorTextView;
+    private CancellationSignal mCancellationSignal;
+
+    private Callback mCallback;
+    private FingerprintManager mFingerprintManager;
+
+    public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback) {
+        mFingerprintManager = icon.getContext().getSystemService(FingerprintManager.class);
+        mIcon = icon;
+        mErrorTextView = errorTextView;
+        mCallback = callback;
+    }
+
+    public void startListening() {
+        if (mFingerprintManager.getEnrolledFingerprints().size() > 0) {
+            mCancellationSignal = new CancellationSignal();
+            mFingerprintManager.authenticate(null, mCancellationSignal, this, 0 /* flags */);
+            setFingerprintIconVisibility(true);
+            mIcon.setImageResource(R.drawable.ic_fingerprint);
+        }
+    }
+
+    public void stopListening() {
+        mCancellationSignal.cancel();
+        mCancellationSignal = null;
+    }
+
+    private void setFingerprintIconVisibility(boolean visible) {
+        mIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+        mCallback.onFingerprintIconVisibilityChanged(visible);
+    }
+
+    @Override
+    public void onAuthenticationError(int errMsgId, CharSequence errString) {
+        showError(errString);
+        setFingerprintIconVisibility(false);
+    }
+
+    @Override
+    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
+        showError(helpString);
+    }
+
+    @Override
+    public void onAuthenticationFailed() {
+        showError(mIcon.getResources().getString(
+                R.string.fingerprint_not_recognized));
+    }
+
+    @Override
+    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
+        vibrateFingerprintSuccess();
+        mCallback.onAuthenticated();
+    }
+
+    private void showError(CharSequence error) {
+        vibrateFingerprintError();
+        mIcon.setImageResource(R.drawable.ic_fingerprint_error);
+        mErrorTextView.setText(error);
+        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
+        mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT);
+    }
+
+    private void vibrateFingerprintError() {
+        mIcon.getContext().getSystemService(Vibrator.class).vibrate(FP_ERROR_VIBRATE_PATTERN, -1);
+    }
+
+    private void vibrateFingerprintSuccess() {
+        mIcon.getContext().getSystemService(Vibrator.class).vibrate(FP_SUCCESS_VIBRATE_PATTERN, -1);
+    }
+
+    private Runnable mResetErrorTextRunnable = new Runnable() {
+        @Override
+        public void run() {
+            mErrorTextView.setText("");
+            mIcon.setImageResource(R.drawable.ic_fingerprint);
+        }
+    };
+
+    public interface Callback {
+        void onAuthenticated();
+        void onFingerprintIconVisibilityChanged(boolean visible);
+    }
+}
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 1b6468f..23f6812 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -75,8 +75,8 @@
      */
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
-                null, res.getText(R.string.master_clear_gesture_explanation));
+        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
+                request, res.getText(R.string.master_clear_title));
     }
 
     @Override
diff --git a/src/com/android/settings/MediaFormat.java b/src/com/android/settings/MediaFormat.java
index 20dac8e..517ec2d 100644
--- a/src/com/android/settings/MediaFormat.java
+++ b/src/com/android/settings/MediaFormat.java
@@ -72,9 +72,8 @@
      * component as a subactivity
      */
     private boolean runKeyguardConfirmation(int request) {
-        return new ChooseLockSettingsHelper(this)
-                .launchConfirmationActivity(request, null,
-                        getText(R.string.media_format_gesture_explanation));
+        return new ChooseLockSettingsHelper(this).launchConfirmationActivity(request,
+                getText(R.string.media_format_title));
     }
 
     @Override
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index a3376d3..587b8e8 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -78,8 +78,8 @@
      */
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
-                null, res.getText(R.string.reset_network_gesture_explanation));
+        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
+                request, res.getText(R.string.reset_network_title));
     }
 
     @Override
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index c74c90a..30b7590 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -362,7 +362,7 @@
     private void addTrustAgentSettings(PreferenceGroup securityCategory) {
         final boolean hasSecurity = mLockPatternUtils.isSecure();
         ArrayList<TrustAgentComponentInfo> agents =
-                getActiveTrustAgents(getPackageManager(), mLockPatternUtils);
+                getActiveTrustAgents(getPackageManager(), mLockPatternUtils, mDPM);
         for (int i = 0; i < agents.size(); i++) {
             final TrustAgentComponentInfo agent = agents.get(i);
             Preference trustAgentPreference =
@@ -377,7 +377,11 @@
             trustAgentPreference.setIntent(intent);
             // Add preference to the settings menu.
             securityCategory.addPreference(trustAgentPreference);
-            if (!hasSecurity) {
+
+            if (agent.disabledByAdministrator) {
+                trustAgentPreference.setEnabled(false);
+                trustAgentPreference.setSummary(R.string.trust_agent_disabled_device_admin);
+            } else if (!hasSecurity) {
                 trustAgentPreference.setEnabled(false);
                 trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security);
             }
@@ -422,11 +426,15 @@
     }
 
     private static ArrayList<TrustAgentComponentInfo> getActiveTrustAgents(
-            PackageManager pm, LockPatternUtils utils) {
+            PackageManager pm, LockPatternUtils utils, DevicePolicyManager dpm) {
         ArrayList<TrustAgentComponentInfo> result = new ArrayList<TrustAgentComponentInfo>();
         List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
                 PackageManager.GET_META_DATA);
         List<ComponentName> enabledTrustAgents = utils.getEnabledTrustAgents();
+
+        boolean disableTrustAgents = (dpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0;
+
         if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
             for (int i = 0; i < resolveInfos.size(); i++) {
                 ResolveInfo resolveInfo = resolveInfos.get(i);
@@ -438,6 +446,10 @@
                         !enabledTrustAgents.contains(
                                 TrustAgentUtils.getComponentName(resolveInfo)) ||
                         TextUtils.isEmpty(trustAgentComponentInfo.title)) continue;
+                if (disableTrustAgents && dpm.getTrustAgentConfiguration(
+                        null, TrustAgentUtils.getComponentName(resolveInfo)) == null) {
+                    trustAgentComponentInfo.disabledByAdministrator = true;
+                }
                 result.add(trustAgentComponentInfo);
                 if (ONLY_ONE_TRUST_AGENT) break;
             }
@@ -603,8 +615,9 @@
             ChooseLockSettingsHelper helper =
                     new ChooseLockSettingsHelper(this.getActivity(), this);
             mTrustAgentClickIntent = preference.getIntent();
-            if (!helper.launchConfirmationActivity(CHANGE_TRUST_AGENT_SETTINGS, null, null) &&
-                    mTrustAgentClickIntent != null) {
+            boolean confirmationLaunched = helper.launchConfirmationActivity(
+                    CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
+            if (!confirmationLaunched&&  mTrustAgentClickIntent != null) {
                 // If this returns false, it means no password confirmation is required.
                 startActivity(mTrustAgentClickIntent);
                 mTrustAgentClickIntent = null;
@@ -771,7 +784,8 @@
             final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
             if (lockPatternUtils.isSecure()) {
                 ArrayList<TrustAgentComponentInfo> agents =
-                        getActiveTrustAgents(context.getPackageManager(), lockPatternUtils);
+                        getActiveTrustAgents(context.getPackageManager(), lockPatternUtils,
+                                context.getSystemService(DevicePolicyManager.class));
                 for (int i = 0; i < agents.size(); i++) {
                     final TrustAgentComponentInfo agent = agents.get(i);
                     data = new SearchIndexableRaw(context);
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index fe0df59..ba08036 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -98,6 +98,7 @@
     public static class ZenModePrioritySettingsActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeAutomationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeScheduleRuleSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class ZenModeExternalRuleSettingsActivity extends SettingsActivity { /* empty */ }
     public static class NotificationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class NotificationAppListActivity extends SettingsActivity { /* empty */ }
     public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 7bfd249..e8be34a 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -95,11 +95,12 @@
 import com.android.settings.nfc.AndroidBeam;
 import com.android.settings.nfc.PaymentSettings;
 import com.android.settings.notification.AppNotificationSettings;
-import com.android.settings.notification.ConditionProviderSettings;
 import com.android.settings.notification.NotificationAccessSettings;
 import com.android.settings.notification.NotificationSettings;
 import com.android.settings.notification.NotificationStation;
 import com.android.settings.notification.OtherSoundSettings;
+import com.android.settings.notification.ZenModeExternalRuleSettings;
+import com.android.settings.notification.ZenModePrioritySettings;
 import com.android.settings.notification.ZenModeSettings;
 import com.android.settings.notification.ZenModeScheduleRuleSettings;
 import com.android.settings.print.PrintJobSettingsFragment;
@@ -320,7 +321,6 @@
             DreamSettings.class.getName(),
             UserSettings.class.getName(),
             NotificationAccessSettings.class.getName(),
-            ConditionProviderSettings.class.getName(),
             PrintSettingsFragment.class.getName(),
             PrintJobSettingsFragment.class.getName(),
             TrustedCredentialsSettings.class.getName(),
@@ -336,7 +336,9 @@
             OtherSoundSettings.class.getName(),
             ApnSettings.class.getName(),
             WifiCallingSettings.class.getName(),
+            ZenModePrioritySettings.class.getName(),
             ZenModeScheduleRuleSettings.class.getName(),
+            ZenModeExternalRuleSettings.class.getName(),
     };
 
 
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index bf41c80..130e29d 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -158,6 +158,11 @@
         unregisterObserverIfNeeded();
     }
 
+    public void showLoadingWhenEmpty() {
+        View loading = getView().findViewById(R.id.loading_container);
+        getListView().setEmptyView(loading);
+    }
+
     public void registerObserverIfNeeded() {
         if (!mIsDataSetObserverRegistered) {
             if (mCurrentRootAdapter != null) {
diff --git a/src/com/android/settings/TrustAgentSettings.java b/src/com/android/settings/TrustAgentSettings.java
index 1427d5f..4c6b4ee 100644
--- a/src/com/android/settings/TrustAgentSettings.java
+++ b/src/com/android/settings/TrustAgentSettings.java
@@ -18,6 +18,7 @@
 
 import java.util.List;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -38,9 +39,11 @@
 public class TrustAgentSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener {
     private static final String SERVICE_INTERFACE = TrustAgentService.SERVICE_INTERFACE;
+
     private ArrayMap<ComponentName, AgentInfo> mAvailableAgents;
     private final ArraySet<ComponentName> mActiveAgents = new ArraySet<ComponentName>();
     private LockPatternUtils mLockPatternUtils;
+    private DevicePolicyManager mDpm;
 
     public static final class AgentInfo {
         CharSequence label;
@@ -69,6 +72,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        mDpm = getActivity().getSystemService(DevicePolicyManager.class);
         addPreferencesFromResource(R.xml.trust_agent_settings);
     }
 
@@ -89,6 +93,10 @@
         PreferenceGroup category =
                 (PreferenceGroup) getPreferenceScreen().findPreference("trust_agents");
         category.removeAll();
+
+        boolean disabledByDevicePolicy = (mDpm.getKeyguardDisabledFeatures(null)
+                & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0;
+
         final int count = mAvailableAgents.size();
         for (int i = 0; i < count; i++) {
             AgentInfo agent = mAvailableAgents.valueAt(i);
@@ -100,6 +108,13 @@
             preference.setPersistent(false);
             preference.setOnPreferenceChangeListener(this);
             preference.setChecked(mActiveAgents.contains(agent.component));
+
+            if (disabledByDevicePolicy
+                    && mDpm.getTrustAgentConfiguration(null, agent.component) == null) {
+                preference.setEnabled(false);
+                preference.setSummary(R.string.trust_agent_disabled_device_admin);
+            }
+
             category.addPreference(agent.preference);
         }
     }
diff --git a/src/com/android/settings/TrustAgentUtils.java b/src/com/android/settings/TrustAgentUtils.java
index 31a073c..109663a 100644
--- a/src/com/android/settings/TrustAgentUtils.java
+++ b/src/com/android/settings/TrustAgentUtils.java
@@ -57,6 +57,7 @@
         ComponentName componentName;
         String title;
         String summary;
+        boolean disabledByAdministrator;
     }
 
     public static ComponentName getComponentName(ResolveInfo resolveInfo) {
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 23b2c85..dc4b484 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -39,8 +39,8 @@
 import android.content.pm.Signature;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
-import android.content.res.TypedArray;
 import android.content.res.Resources.NotFoundException;
+import android.content.res.TypedArray;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -74,6 +74,9 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationUtils;
 import android.widget.ListView;
 import android.widget.TabWidget;
 
@@ -1158,4 +1161,39 @@
                 ? R.string.launch_defaults_some
                 : R.string.launch_defaults_none);
     }
+
+    public static void handleLoadingContainer(View loading, View doneLoading, boolean done,
+            boolean animate) {
+        setViewShown(loading, !done, animate);
+        setViewShown(doneLoading, done, animate);
+    }
+
+    private static void setViewShown(final View view, boolean shown, boolean animate) {
+        if (animate) {
+            Animation animation = AnimationUtils.loadAnimation(view.getContext(),
+                    shown ? android.R.anim.fade_in : android.R.anim.fade_out);
+            if (shown) {
+                view.setVisibility(View.VISIBLE);
+            } else {
+                animation.setAnimationListener(new AnimationListener() {
+                    @Override
+                    public void onAnimationStart(Animation animation) {
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation animation) {
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animation animation) {
+                        view.setVisibility(View.INVISIBLE);
+                    }
+                });
+            }
+            view.startAnimation(animation);
+        } else {
+            view.clearAnimation();
+            view.setVisibility(shown ? View.VISIBLE : View.INVISIBLE);
+        }
+    }
 }
diff --git a/src/com/android/settings/VoiceSettingsActivity.java b/src/com/android/settings/VoiceSettingsActivity.java
deleted file mode 100644
index b5e8ede..0000000
--- a/src/com/android/settings/VoiceSettingsActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2014 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;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-/**
- * Activity for modifying a setting using the Voice Interaction API. This activity
- * MUST only modify the setting if the intent was sent using
- * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity startVoiceActivity}.
- */
-abstract public class VoiceSettingsActivity extends Activity {
-
-    private static final String TAG = "VoiceSettingsActivity";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        if (isVoiceInteraction()) {
-            // Only permit if this is a voice interaction.
-            onVoiceSettingInteraction(getIntent());
-        } else {
-            Log.v(TAG, "Cannot modify settings without voice interaction");
-        }
-        finish();
-    }
-
-    /**
-     * Modify the setting as a voice interaction. The activity will finish
-     * after this method is called.
-     */
-    abstract protected void onVoiceSettingInteraction(Intent intent);
-}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index b0b35ab..4acbedb 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -358,6 +358,7 @@
         updateOptionsMenu();
         if (mApplications != null) {
             mApplications.resume(mSortOrder);
+            mApplications.updateLoading();
         }
     }
 
@@ -746,17 +747,20 @@
             }
             notifyDataSetChanged();
 
-            if (entries == null) {
-                mManageApplications.mListContainer.setVisibility(View.INVISIBLE);
-                mManageApplications.mLoadingContainer.setVisibility(View.VISIBLE);
-            } else {
-                mManageApplications.mListContainer.setVisibility(View.VISIBLE);
-                mManageApplications.mLoadingContainer.setVisibility(View.GONE);
+            if (mEntries.size() != 0
+                    && mManageApplications.mListContainer.getVisibility() != View.VISIBLE) {
+                Utils.handleLoadingContainer(mManageApplications.mLoadingContainer,
+                        mManageApplications.mListContainer, true, true);
             }
 
             mManageApplications.setHasDisabled(hasDisabledApps());
         }
 
+        private void updateLoading() {
+            Utils.handleLoadingContainer(mManageApplications.mLoadingContainer,
+                    mManageApplications.mListContainer, mEntries.size() != 0, false);
+        }
+
         private boolean hasDisabledApps() {
             ArrayList<AppEntry> allApps = mSession.getAllApps();
             for (int i = 0; i < allApps.size(); i++) {
diff --git a/src/com/android/settings/applications/ManagePermissions.java b/src/com/android/settings/applications/ManagePermissions.java
index 8fb3e62..a6d29c5 100644
--- a/src/com/android/settings/applications/ManagePermissions.java
+++ b/src/com/android/settings/applications/ManagePermissions.java
@@ -36,7 +36,6 @@
 
     private static final String TAG = "ManagePermissions";
 
-    private boolean mLoadComplete;
     private PermissionsInfo mPermissionsInfo;
 
     @Override
@@ -46,6 +45,13 @@
         mPermissionsInfo = new PermissionsInfo(getActivity(), this);
     }
 
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        showLoadingWhenEmpty();
+    }
+
     private void refreshUi() {
         PreferenceScreen screen = getPreferenceScreen();
         if (screen == null) {
diff --git a/src/com/android/settings/applications/RunningServices.java b/src/com/android/settings/applications/RunningServices.java
index a4cd4a7..1841f13 100644
--- a/src/com/android/settings/applications/RunningServices.java
+++ b/src/com/android/settings/applications/RunningServices.java
@@ -23,9 +23,9 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 
 public class RunningServices extends Fragment {
 
@@ -69,12 +69,7 @@
     public void onResume() {
         super.onResume();
         boolean haveData = mRunningProcessesView.doResume(this, mRunningProcessesAvail);
-        if (haveData) {
-            mRunningProcessesView.setVisibility(View.VISIBLE);
-            mLoadingContainer.setVisibility(View.INVISIBLE);
-        } else {
-            mLoadingContainer.setVisibility(View.VISIBLE);
-        }
+        Utils.handleLoadingContainer(mLoadingContainer, mRunningProcessesView, haveData, false);
     }
 
     @Override
@@ -110,19 +105,10 @@
         mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
     }
 
-    private void handleRunningProcessesAvail() {
-        mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),
-                android.R.anim.fade_out));
-        mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(getActivity(),
-                android.R.anim.fade_in));
-        mRunningProcessesView.setVisibility(View.VISIBLE);
-        mLoadingContainer.setVisibility(View.GONE);
-    }
-
     private final Runnable mRunningProcessesAvail = new Runnable() {
         @Override
         public void run() {
-            handleRunningProcessesAvail();
+            Utils.handleLoadingContainer(mLoadingContainer, mRunningProcessesView, true, true);
         }
     };
 
diff --git a/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java b/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java
new file mode 100644
index 0000000..4494887
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatterySaverModeVoiceActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 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.fuelguage;
+
+import static android.provider.Settings.EXTRA_BATTERY_SAVER_MODE_ENABLED;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.provider.Settings;
+import android.util.Log;
+
+import com.android.settings.utils.VoiceSettingsActivity;
+
+/**
+ * Activity for modifying the {@link android.os.PowerManager} power save mode
+ * setting using the Voice Interaction API.
+ */
+public class BatterySaverModeVoiceActivity extends VoiceSettingsActivity {
+    private static final String TAG = "BatterySaverModeVoiceActivity";
+
+    protected boolean onVoiceSettingInteraction(Intent intent) {
+        if (intent.hasExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED)) {
+            PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+            if (powerManager.setPowerSaveMode(
+                    intent.getBooleanExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, false))) {
+                notifySuccess(null);
+            } else {
+                Log.v(TAG, "Unable to set power mode");
+                notifyFailure(null);
+            }
+        } else {
+            Log.v(TAG, "Missing battery saver mode extra");
+        }
+        return true;
+    }
+}
diff --git a/src/com/android/settings/notification/ConditionProviderSettings.java b/src/com/android/settings/notification/ConditionProviderSettings.java
deleted file mode 100644
index 259e53c..0000000
--- a/src/com/android/settings/notification/ConditionProviderSettings.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
-import android.service.notification.ConditionProviderService;
-
-import com.android.settings.R;
-
-public class ConditionProviderSettings extends ManagedServiceSettings {
-    private static final String TAG = ConditionProviderSettings.class.getSimpleName();
-    private static final Config CONFIG = getConditionProviderConfig();
-
-    private static Config getConditionProviderConfig() {
-        final Config c = new Config();
-        c.tag = TAG;
-        c.setting = Settings.Secure.ENABLED_CONDITION_PROVIDERS;
-        c.intentAction = ConditionProviderService.SERVICE_INTERFACE;
-        c.permission = android.Manifest.permission.BIND_CONDITION_PROVIDER_SERVICE;
-        c.noun = "condition provider";
-        c.warningDialogTitle = R.string.condition_provider_security_warning_title;
-        c.warningDialogSummary = R.string.condition_provider_security_warning_summary;
-        c.emptyText = R.string.no_condition_providers;
-        return c;
-    }
-
-    @Override
-    protected Config getConfig() {
-        return CONFIG;
-    }
-
-    public static int getProviderCount(PackageManager pm) {
-        return getServicesCount(CONFIG, pm);
-    }
-
-    public static int getEnabledProviderCount(Context context) {
-        return getEnabledServicesCount(CONFIG, context);
-    }
-}
diff --git a/src/com/android/settings/notification/ManagedServiceSettings.java b/src/com/android/settings/notification/ManagedServiceSettings.java
index 7be644e..cc9e734 100644
--- a/src/com/android/settings/notification/ManagedServiceSettings.java
+++ b/src/com/android/settings/notification/ManagedServiceSettings.java
@@ -16,28 +16,17 @@
 
 package com.android.settings.notification;
 
-import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.app.ListFragment;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.database.ContentObserver;
-import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
-import android.provider.Settings;
-import android.util.Slog;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -49,17 +38,15 @@
 
 import com.android.settings.R;
 
-import java.util.HashSet;
 import java.util.List;
 
 public abstract class ManagedServiceSettings extends ListFragment {
     private static final boolean SHOW_PACKAGE_NAME = false;
 
     private final Config mConfig;
-    private PackageManager mPM;
-    private ContentResolver mCR;
 
-    private final HashSet<ComponentName> mEnabledServices = new HashSet<ComponentName>();
+    private PackageManager mPM;
+    private ServiceListing mServiceListing;
     private ServiceListAdapter mListAdapter;
 
     abstract protected Config getConfig();
@@ -68,19 +55,65 @@
         mConfig = getConfig();
     }
 
-    private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            updateList();
-        }
-    };
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
 
-    private final BroadcastReceiver mPackageReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            updateList();
+        mPM = getActivity().getPackageManager();
+        mServiceListing = new ServiceListing(getActivity(), mConfig);
+        mServiceListing.addCallback(new ServiceListing.Callback() {
+            @Override
+            public void onServicesReloaded(List<ServiceInfo> services) {
+                updateList(services);
+            }
+        });
+        mListAdapter = new ServiceListAdapter(getActivity());
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        View v =  inflater.inflate(R.layout.managed_service_settings, container, false);
+        TextView empty = (TextView) v.findViewById(android.R.id.empty);
+        empty.setText(mConfig.emptyText);
+        return v;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mServiceListing.reload();
+        mServiceListing.setListening(true);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mServiceListing.setListening(false);
+    }
+
+    private void updateList(List<ServiceInfo> services) {
+        mListAdapter.clear();
+        mListAdapter.addAll(services);
+        mListAdapter.sort(new PackageItemInfo.DisplayNameComparator(mPM));
+
+        getListView().setAdapter(mListAdapter);
+    }
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id) {
+        ServiceInfo info = mListAdapter.getItem(position);
+        final ComponentName cn = new ComponentName(info.packageName, info.name);
+        if (mServiceListing.isEnabled(cn)) {
+            // the simple version: disabling
+            mServiceListing.setEnabled(cn, false);
+        } else {
+            // show a scary dialog
+            new ScaryWarningDialogFragment()
+                .setServiceInfo(cn, info.loadLabel(mPM).toString())
+                .show(getFragmentManager(), "dialog");
         }
-    };
+    }
 
     public class ScaryWarningDialogFragment extends DialogFragment {
         static final String KEY_COMPONENT = "c";
@@ -99,7 +132,8 @@
             super.onCreate(savedInstanceState);
             final Bundle args = getArguments();
             final String label = args.getString(KEY_LABEL);
-            final ComponentName cn = ComponentName.unflattenFromString(args.getString(KEY_COMPONENT));
+            final ComponentName cn = ComponentName.unflattenFromString(args
+                    .getString(KEY_COMPONENT));
 
             final String title = getResources().getString(mConfig.warningDialogTitle, label);
             final String summary = getResources().getString(mConfig.warningDialogSummary, label);
@@ -110,8 +144,7 @@
                     .setPositiveButton(android.R.string.ok,
                             new DialogInterface.OnClickListener() {
                                 public void onClick(DialogInterface dialog, int id) {
-                                    mEnabledServices.add(cn);
-                                    saveEnabledServices();
+                                    mServiceListing.setEnabled(cn, true);
                                 }
                             })
                     .setNegativeButton(android.R.string.cancel,
@@ -124,151 +157,6 @@
         }
     }
 
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mPM = getActivity().getPackageManager();
-        mCR = getActivity().getContentResolver();
-        mListAdapter = new ServiceListAdapter(getActivity());
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        View v =  inflater.inflate(R.layout.managed_service_settings, container, false);
-        TextView empty = (TextView) v.findViewById(android.R.id.empty);
-        empty.setText(mConfig.emptyText);
-        return v;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        updateList();
-
-        // listen for package changes
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
-        filter.addDataScheme("package");
-        getActivity().registerReceiver(mPackageReceiver, filter);
-
-        mCR.registerContentObserver(Settings.Secure.getUriFor(mConfig.setting),
-                false, mSettingsObserver);
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        getActivity().unregisterReceiver(mPackageReceiver);
-        mCR.unregisterContentObserver(mSettingsObserver);
-    }
-
-    private void loadEnabledServices() {
-        mEnabledServices.clear();
-        final String flat = Settings.Secure.getString(mCR, mConfig.setting);
-        if (flat != null && !"".equals(flat)) {
-            final String[] names = flat.split(":");
-            for (int i = 0; i < names.length; i++) {
-                final ComponentName cn = ComponentName.unflattenFromString(names[i]);
-                if (cn != null) {
-                    mEnabledServices.add(cn);
-                }
-            }
-        }
-    }
-
-    private void saveEnabledServices() {
-        StringBuilder sb = null;
-        for (ComponentName cn : mEnabledServices) {
-            if (sb == null) {
-                sb = new StringBuilder();
-            } else {
-                sb.append(':');
-            }
-            sb.append(cn.flattenToString());
-        }
-        Settings.Secure.putString(mCR,
-                mConfig.setting,
-                sb != null ? sb.toString() : "");
-    }
-
-    private void updateList() {
-        loadEnabledServices();
-
-        getServices(mConfig, mListAdapter, mPM);
-        mListAdapter.sort(new PackageItemInfo.DisplayNameComparator(mPM));
-
-        getListView().setAdapter(mListAdapter);
-    }
-
-    protected static int getEnabledServicesCount(Config config, Context context) {
-        final String flat = Settings.Secure.getString(context.getContentResolver(), config.setting);
-        if (flat == null || "".equals(flat)) return 0;
-        final String[] components = flat.split(":");
-        return components.length;
-    }
-
-    protected static int getServicesCount(Config c, PackageManager pm) {
-        return getServices(c, null, pm);
-    }
-
-    private static int getServices(Config c, ArrayAdapter<ServiceInfo> adapter, PackageManager pm) {
-        int services = 0;
-        if (adapter != null) {
-            adapter.clear();
-        }
-        final int user = ActivityManager.getCurrentUser();
-
-        List<ResolveInfo> installedServices = pm.queryIntentServicesAsUser(
-                new Intent(c.intentAction),
-                PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
-                user);
-
-        for (int i = 0, count = installedServices.size(); i < count; i++) {
-            ResolveInfo resolveInfo = installedServices.get(i);
-            ServiceInfo info = resolveInfo.serviceInfo;
-
-            if (!c.permission.equals(info.permission)) {
-                Slog.w(c.tag, "Skipping " + c.noun + " service "
-                        + info.packageName + "/" + info.name
-                        + ": it does not require the permission "
-                        + c.permission);
-                continue;
-            }
-            if (adapter != null) {
-                adapter.add(info);
-            }
-            services++;
-        }
-        return services;
-    }
-
-    private boolean isServiceEnabled(ServiceInfo info) {
-        final ComponentName cn = new ComponentName(info.packageName, info.name);
-        return mEnabledServices.contains(cn);
-    }
-
-    @Override
-    public void onListItemClick(ListView l, View v, int position, long id) {
-        ServiceInfo info = mListAdapter.getItem(position);
-        final ComponentName cn = new ComponentName(info.packageName, info.name);
-        if (mEnabledServices.contains(cn)) {
-            // the simple version: disabling
-            mEnabledServices.remove(cn);
-            saveEnabledServices();
-        } else {
-            // show a scary dialog
-            new ScaryWarningDialogFragment()
-                .setServiceInfo(cn, info.loadLabel(mPM).toString())
-                .show(getFragmentManager(), "dialog");
-        }
-    }
-
     private static class ViewHolder {
         ImageView icon;
         TextView name;
@@ -327,7 +215,8 @@
             } else {
                 vh.description.setVisibility(View.GONE);
             }
-            vh.checkbox.setChecked(isServiceEnabled(info));
+            final ComponentName cn = new ComponentName(info.packageName, info.name);
+            vh.checkbox.setChecked(mServiceListing.isEnabled(cn));
         }
     }
 
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index ced71a4..5104d4a 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -46,10 +46,10 @@
     }
 
     public static int getListenersCount(PackageManager pm) {
-        return getServicesCount(CONFIG, pm);
+        return ServiceListing.getServicesCount(CONFIG, pm);
     }
 
     public static int getEnabledListenersCount(Context context) {
-        return getEnabledServicesCount(CONFIG, context);
+        return ServiceListing.getEnabledServicesCount(CONFIG, context);
     }
 }
diff --git a/src/com/android/settings/notification/ServiceListing.java b/src/com/android/settings/notification/ServiceListing.java
new file mode 100644
index 0000000..d296139
--- /dev/null
+++ b/src/com/android/settings/notification/ServiceListing.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2015 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 android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.settings.notification.ManagedServiceSettings.Config;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+public class ServiceListing {
+    private final ContentResolver mContentResolver;
+    private final Context mContext;
+    private final Config mConfig;
+    private final HashSet<ComponentName> mEnabledServices = new HashSet<ComponentName>();
+    private final List<ServiceInfo> mServices = new ArrayList<ServiceInfo>();
+    private final List<Callback> mCallbacks = new ArrayList<Callback>();
+
+    private boolean mListening;
+
+    public ServiceListing(Context context, Config config) {
+        mContext = context;
+        mConfig = config;
+        mContentResolver = context.getContentResolver();
+    }
+
+    public void addCallback(Callback callback) {
+        mCallbacks.add(callback);
+    }
+
+    public void removeCallback(Callback callback) {
+        mCallbacks.remove(callback);
+    }
+
+    public void setListening(boolean listening) {
+        if (mListening == listening) return;
+        mListening = listening;
+        if (mListening) {
+            // listen for package changes
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(Intent.ACTION_PACKAGE_ADDED);
+            filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+            filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+            filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+            filter.addDataScheme("package");
+            mContext.registerReceiver(mPackageReceiver, filter);
+            mContentResolver.registerContentObserver(Settings.Secure.getUriFor(mConfig.setting),
+                    false, mSettingsObserver);
+        } else {
+            mContext.unregisterReceiver(mPackageReceiver);
+            mContentResolver.unregisterContentObserver(mSettingsObserver);
+        }
+    }
+
+    public static int getEnabledServicesCount(Config config, Context context) {
+        final String flat = Settings.Secure.getString(context.getContentResolver(), config.setting);
+        if (flat == null || "".equals(flat)) return 0;
+        final String[] components = flat.split(":");
+        return components.length;
+    }
+
+    public static int getServicesCount(Config c, PackageManager pm) {
+        return getServices(c, null, pm);
+    }
+
+    public static ServiceInfo findService(Context context, Config config, final ComponentName cn) {
+        final ServiceListing listing = new ServiceListing(context, config);
+        final List<ServiceInfo> services = listing.reload();
+        for (ServiceInfo service : services) {
+            final ComponentName serviceCN = new ComponentName(service.packageName, service.name);
+            if (serviceCN.equals(cn)) {
+                return service;
+            }
+        }
+        return null;
+    }
+
+    private static int getServices(Config c, List<ServiceInfo> list, PackageManager pm) {
+        int services = 0;
+        if (list != null) {
+            list.clear();
+        }
+        final int user = ActivityManager.getCurrentUser();
+
+        List<ResolveInfo> installedServices = pm.queryIntentServicesAsUser(
+                new Intent(c.intentAction),
+                PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
+                user);
+
+        for (int i = 0, count = installedServices.size(); i < count; i++) {
+            ResolveInfo resolveInfo = installedServices.get(i);
+            ServiceInfo info = resolveInfo.serviceInfo;
+
+            if (!c.permission.equals(info.permission)) {
+                Slog.w(c.tag, "Skipping " + c.noun + " service "
+                        + info.packageName + "/" + info.name
+                        + ": it does not require the permission "
+                        + c.permission);
+                continue;
+            }
+            if (list != null) {
+                list.add(info);
+            }
+            services++;
+        }
+        return services;
+    }
+
+    private void saveEnabledServices() {
+        StringBuilder sb = null;
+        for (ComponentName cn : mEnabledServices) {
+            if (sb == null) {
+                sb = new StringBuilder();
+            } else {
+                sb.append(':');
+            }
+            sb.append(cn.flattenToString());
+        }
+        Settings.Secure.putString(mContentResolver, mConfig.setting,
+                sb != null ? sb.toString() : "");
+    }
+
+    private void loadEnabledServices() {
+        mEnabledServices.clear();
+        final String flat = Settings.Secure.getString(mContentResolver, mConfig.setting);
+        if (flat != null && !"".equals(flat)) {
+            final String[] names = flat.split(":");
+            for (int i = 0; i < names.length; i++) {
+                final ComponentName cn = ComponentName.unflattenFromString(names[i]);
+                if (cn != null) {
+                    mEnabledServices.add(cn);
+                }
+            }
+        }
+    }
+
+    public List<ServiceInfo> reload() {
+        loadEnabledServices();
+        getServices(mConfig, mServices, mContext.getPackageManager());
+        for (Callback callback : mCallbacks) {
+            callback.onServicesReloaded(mServices);
+        }
+        return mServices;
+    }
+
+    public boolean isEnabled(ComponentName cn) {
+        return mEnabledServices.contains(cn);
+    }
+
+    public void setEnabled(ComponentName cn, boolean enabled) {
+        if (enabled) {
+            mEnabledServices.add(cn);
+        } else {
+            mEnabledServices.remove(cn);
+        }
+        saveEnabledServices();
+    }
+
+    private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            reload();
+        }
+    };
+
+    private final BroadcastReceiver mPackageReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            reload();
+        }
+    };
+
+    public interface Callback {
+        void onServicesReloaded(List<ServiceInfo> services);
+    }
+}
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
index c43d99e..f2ee71d 100644
--- a/src/com/android/settings/notification/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -18,12 +18,16 @@
 
 import static android.service.notification.ZenModeConfig.ALL_DAYS;
 
+import android.content.ComponentName;
 import android.content.Intent;
+import android.content.pm.ServiceInfo;
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceScreen;
+import android.provider.Settings;
 import android.provider.Settings.Global;
+import android.service.notification.ConditionProviderService;
 import android.service.notification.ZenModeConfig;
 import android.service.notification.ZenModeConfig.ScheduleInfo;
 import android.service.notification.ZenModeConfig.ZenRule;
@@ -35,30 +39,39 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
+import com.android.settings.notification.ManagedServiceSettings.Config;
+import com.android.settings.notification.ZenRuleNameDialog.RuleInfo;
 
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
+import java.util.List;
 import java.util.TreeSet;
 
 public class ZenModeAutomationSettings extends ZenModeSettingsBase {
     private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE");
 
+    static final Config CONFIG = getConditionProviderConfig();
+
     private final Calendar mCalendar = Calendar.getInstance();
 
+    private ServiceListing mServiceListing;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-
         setHasOptionsMenu(true);
-
         addPreferencesFromResource(R.xml.zen_mode_automation_settings);
+        mServiceListing = new ServiceListing(mContext, CONFIG);
+        mServiceListing.addCallback(mServiceListingCallback);
+        mServiceListing.reload();
+        mServiceListing.setListening(true);
     }
 
-    private void showRule(String ruleId, String ruleName) {
-        if (DEBUG) Log.d(TAG, "showRule " + ruleId + " name=" + ruleName);
-        mContext.startActivity(new Intent(ZenModeScheduleRuleSettings.ACTION)
-                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
-                .putExtra(ZenModeScheduleRuleSettings.EXTRA_RULE_ID, ruleId));
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mServiceListing.setListening(false);
+        mServiceListing.removeCallback(mServiceListingCallback);
     }
 
     @Override
@@ -75,29 +88,6 @@
         return super.onOptionsItemSelected(item);
     }
 
-    private void showAddRuleDialog() {
-        new ZenRuleNameDialog(mContext, "", mConfig.getAutomaticRuleNames()) {
-            @Override
-            public void onOk(String ruleName) {
-                final ScheduleInfo schedule = new ScheduleInfo();
-                schedule.days = ZenModeConfig.ALL_DAYS;
-                schedule.startHour = 22;
-                schedule.endHour = 7;
-                final ZenRule rule = new ZenRule();
-                rule.name = ruleName;
-                rule.enabled = true;
-                rule.zenMode = Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-                rule.conditionId = ZenModeConfig.toScheduleConditionId(schedule);
-                final ZenModeConfig newConfig = mConfig.copy();
-                final String ruleId = newConfig.newRuleId();
-                newConfig.automaticRules.put(ruleId, rule);
-                if (setZenModeConfig(newConfig)) {
-                    showRule(ruleId, rule.name);
-                }
-            }
-        }.show();
-    }
-
     @Override
     protected void onZenModeChanged() {
         // don't care
@@ -114,15 +104,42 @@
         updateControls();
     }
 
+    private void showAddRuleDialog() {
+        new ZenRuleNameDialog(mContext, mServiceListing, null, mConfig.getAutomaticRuleNames()) {
+            @Override
+            public void onOk(String ruleName, RuleInfo ri) {
+                final ZenRule rule = new ZenRule();
+                rule.name = ruleName;
+                rule.enabled = true;
+                rule.zenMode = Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+                rule.conditionId = ri.defaultConditionId;
+                rule.component = ri.serviceComponent;
+                final ZenModeConfig newConfig = mConfig.copy();
+                final String ruleId = newConfig.newRuleId();
+                newConfig.automaticRules.put(ruleId, rule);
+                if (setZenModeConfig(newConfig)) {
+                    showRule(ri.settingsAction, ri.configurationActivity, ruleId, rule.name);
+                }
+            }
+        }.show();
+    }
+
+    private void showRule(String settingsAction, ComponentName configurationActivity,
+            String ruleId, String ruleName) {
+        if (DEBUG) Log.d(TAG, "showRule " + ruleId + " name=" + ruleName);
+        mContext.startActivity(new Intent(settingsAction)
+                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+                .putExtra(ZenModeRuleSettingsBase.EXTRA_RULE_ID, ruleId));
+    }
+
     private void updateControls() {
         final PreferenceScreen root = getPreferenceScreen();
         root.removeAll();
-
         if (mConfig == null) return;
         for (int i = 0; i < mConfig.automaticRules.size(); i++) {
             final String id = mConfig.automaticRules.keyAt(i);
             final ZenRule rule = mConfig.automaticRules.valueAt(i);
-            if (!ZenModeConfig.isValidScheduleConditionId(rule.conditionId)) continue;
+            final boolean isSchedule = ZenModeConfig.isValidScheduleConditionId(rule.conditionId);
             final Preference p = new Preference(mContext);
             p.setTitle(rule.name);
             p.setSummary(computeRuleSummary(rule));
@@ -130,7 +147,9 @@
             p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                 @Override
                 public boolean onPreferenceClick(Preference preference) {
-                    showRule(id, rule.name);
+                    final String action = isSchedule ? ZenModeScheduleRuleSettings.ACTION
+                            : ZenModeExternalRuleSettings.ACTION;
+                    showRule(action, null, id, rule.name);
                     return true;
                 }
             });
@@ -146,13 +165,16 @@
     private String computeRuleSummary(ZenRule rule) {
         if (rule == null || !rule.enabled) return getString(R.string.switch_off_text);
         final ScheduleInfo schedule = ZenModeConfig.tryParseScheduleConditionId(rule.conditionId);
-        if (schedule == null) return getString(R.string.switch_on_text);
-        final String days = computeContiguousDayRanges(schedule.days);
-        final String start = getTime(schedule.startHour, schedule.startMinute);
-        final String end = getTime(schedule.endHour, schedule.endMinute);
-        final String time = getString(R.string.summary_range_verbal_combination, start, end);
         final String mode = ZenModeSettings.computeZenModeCaption(getResources(), rule.zenMode);
-        return getString(R.string.zen_mode_rule_summary_template, days, time, mode);
+        String summary = getString(R.string.switch_on_text);
+        if (schedule != null) {
+            final String days = computeContiguousDayRanges(schedule.days);
+            final String start = getTime(schedule.startHour, schedule.startMinute);
+            final String end = getTime(schedule.endHour, schedule.endMinute);
+            final String time = getString(R.string.summary_range_verbal_combination, start, end);
+            summary = getString(R.string.zen_mode_rule_summary_combination, days, time);
+        }
+        return getString(R.string.zen_mode_rule_summary_combination, summary, mode);
     }
 
     private String getTime(int hour, int minute) {
@@ -199,4 +221,30 @@
         return DAY_FORMAT.format(mCalendar.getTime());
     }
 
+    private static Config getConditionProviderConfig() {
+        final Config c = new Config();
+        c.tag = TAG;
+        c.setting = Settings.Secure.ENABLED_CONDITION_PROVIDERS;
+        c.intentAction = ConditionProviderService.SERVICE_INTERFACE;
+        c.permission = android.Manifest.permission.BIND_CONDITION_PROVIDER_SERVICE;
+        c.noun = "condition provider";
+        return c;
+    }
+
+    private final ServiceListing.Callback mServiceListingCallback = new ServiceListing.Callback() {
+        @Override
+        public void onServicesReloaded(List<ServiceInfo> services) {
+            for (ServiceInfo service : services) {
+                final RuleInfo ri = ZenModeExternalRuleSettings.getRuleInfo(service);
+                if (ri != null && ri.serviceComponent != null
+                        && ri.settingsAction == ZenModeExternalRuleSettings.ACTION) {
+                    if (!mServiceListing.isEnabled(ri.serviceComponent)) {
+                        Log.i(TAG, "Enabling external condition provider: " + ri.serviceComponent);
+                        mServiceListing.setEnabled(ri.serviceComponent, true);
+                    }
+                }
+            }
+        }
+    };
+
 }
diff --git a/src/com/android/settings/notification/ZenModeExternalRuleSettings.java b/src/com/android/settings/notification/ZenModeExternalRuleSettings.java
new file mode 100644
index 0000000..9f9dc8a
--- /dev/null
+++ b/src/com/android/settings/notification/ZenModeExternalRuleSettings.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 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 android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ServiceInfo;
+import android.net.Uri;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.service.notification.ZenModeConfig.ZenRule;
+import android.util.Log;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.R;
+import com.android.settings.notification.ZenRuleNameDialog.RuleInfo;
+
+public class ZenModeExternalRuleSettings extends ZenModeRuleSettingsBase {
+    private static final String KEY_TYPE = "type";
+    private static final String KEY_CONFIGURE = "configure";
+
+    public static final String ACTION = Settings.ACTION_ZEN_MODE_EXTERNAL_RULE_SETTINGS;
+    private static final int REQUEST_CODE_CONFIGURE = 1;
+
+    private static final String MD_RULE_TYPE = "automatic.ruleType";
+    private static final String MD_DEFAULT_CONDITION_ID = "automatic.defaultConditionId";
+    private static final String MD_CONFIGURATION_ACTIVITY = "automatic.configurationActivity";
+    private static final String EXTRA_CONDITION_ID = "automatic.conditionId";
+
+    private Preference mType;
+    private Preference mConfigure;
+
+    @Override
+    protected boolean setRule(ZenRule rule) {
+        return rule != null;
+    }
+
+    @Override
+    protected String getZenModeDependency() {
+        return null;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        addPreferencesFromResource(R.xml.zen_mode_external_rule_settings);
+        final PreferenceScreen root = getPreferenceScreen();
+        final ServiceInfo si = ServiceListing.findService(mContext,
+                ZenModeAutomationSettings.CONFIG, mRule.component);
+        if (DEBUG) Log.d(TAG, "ServiceInfo: " + si);
+        final RuleInfo ri = getRuleInfo(si);
+        if (DEBUG) Log.d(TAG, "RuleInfo: " + ri);
+        mType = root.findPreference(KEY_TYPE);
+        if (ri == null) {
+            mType.setSummary(R.string.zen_mode_rule_type_unknown);
+        } else {
+            mType.setSummary(ri.caption);
+        }
+
+        mConfigure = root.findPreference(KEY_CONFIGURE);
+        if (ri == null || ri.configurationActivity == null) {
+            mConfigure.setEnabled(false);
+        } else {
+            mConfigure.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                @Override
+                public boolean onPreferenceClick(Preference preference) {
+                    startActivityForResult(new Intent().setComponent(ri.configurationActivity),
+                            REQUEST_CODE_CONFIGURE);
+                    return true;
+                }
+            });
+        }
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == REQUEST_CODE_CONFIGURE) {
+            if (resultCode == Activity.RESULT_OK && data != null) {
+                final Uri conditionId = data.getParcelableExtra(EXTRA_CONDITION_ID);
+                if (conditionId != null && !conditionId.equals(mRule.conditionId)) {
+                    updateRule(conditionId);
+                }
+            }
+        }
+    }
+
+    public static RuleInfo getRuleInfo(ServiceInfo si) {
+        if (si == null || si.metaData == null) return null;
+        final String ruleType = si.metaData.getString(MD_RULE_TYPE);
+        final String defaultConditionId = si.metaData.getString(MD_DEFAULT_CONDITION_ID);
+        final String configurationActivity = si.metaData.getString(MD_CONFIGURATION_ACTIVITY);
+        if (ruleType != null && !ruleType.trim().isEmpty() && defaultConditionId != null) {
+            final RuleInfo ri = new RuleInfo();
+            ri.serviceComponent = new ComponentName(si.packageName, si.name);
+            ri.settingsAction = ZenModeExternalRuleSettings.ACTION;
+            ri.caption = ruleType;
+            ri.defaultConditionId = Uri.parse(defaultConditionId);
+            if (configurationActivity != null) {
+                ri.configurationActivity = ComponentName.unflattenFromString(configurationActivity);
+            }
+            return ri;
+        }
+        return null;
+    }
+
+    @Override
+    protected void updateControlsInternal() {
+        // everything done up front
+    }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION_ZEN_MODE_EXTERNAL_RULE;
+    }
+
+}
diff --git a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
new file mode 100644
index 0000000..f6bc75f
--- /dev/null
+++ b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2015 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 android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceScreen;
+import android.provider.Settings.Global;
+import android.service.notification.ZenModeConfig;
+import android.service.notification.ZenModeConfig.ZenRule;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.Switch;
+import android.widget.Toast;
+
+import com.android.settings.DropDownPreference;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.widget.SwitchBar;
+
+public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase
+        implements SwitchBar.OnSwitchChangeListener {
+    protected static final String TAG = ZenModeSettingsBase.TAG;
+    protected static final boolean DEBUG = ZenModeSettingsBase.DEBUG;
+
+    public static final String EXTRA_RULE_ID = "rule_id";
+    private static final String KEY_RULE_NAME = "rule_name";
+    private static final String KEY_ZEN_MODE = "zen_mode";
+
+    protected Context mContext;
+    protected boolean mDisableListeners;
+    protected ZenRule mRule;
+
+    private String mRuleId;
+    private boolean mDeleting;
+    private Preference mRuleName;
+    private SwitchBar mSwitchBar;
+    private DropDownPreference mZenMode;
+
+    abstract protected void onCreateInternal();
+    abstract protected boolean setRule(ZenRule rule);
+    abstract protected String getZenModeDependency();
+    abstract protected void updateControlsInternal();
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mContext = getActivity();
+
+        final Intent intent = getActivity().getIntent();
+        if (DEBUG) Log.d(TAG, "onCreate getIntent()=" + intent);
+        if (intent == null) {
+            Log.w(TAG, "No intent");
+            toastAndFinish();
+            return;
+        }
+
+        mRuleId = intent.getStringExtra(EXTRA_RULE_ID);
+        if (DEBUG) Log.d(TAG, "mRuleId=" + mRuleId);
+        if (refreshRuleOrFinish()) {
+            return;
+        }
+
+        setHasOptionsMenu(true);
+
+        onCreateInternal();
+
+        final PreferenceScreen root = getPreferenceScreen();
+        mRuleName = root.findPreference(KEY_RULE_NAME);
+        mRuleName.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+            @Override
+            public boolean onPreferenceClick(Preference preference) {
+                showRuleNameDialog();
+                return true;
+            }
+        });
+
+        mZenMode = (DropDownPreference) root.findPreference(KEY_ZEN_MODE);
+        mZenMode.addItem(R.string.zen_mode_option_important_interruptions,
+                Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
+        mZenMode.addItem(R.string.zen_mode_option_alarms, Global.ZEN_MODE_ALARMS);
+        mZenMode.addItem(R.string.zen_mode_option_no_interruptions,
+                Global.ZEN_MODE_NO_INTERRUPTIONS);
+        mZenMode.setCallback(new DropDownPreference.Callback() {
+            @Override
+            public boolean onItemSelected(int pos, Object value) {
+                if (mDisableListeners) return true;
+                final int zenMode = (Integer) value;
+                if (zenMode == mRule.zenMode) return true;
+                if (DEBUG) Log.d(TAG, "onPrefChange zenMode=" + zenMode);
+                mRule.zenMode = zenMode;
+                setZenModeConfig(mConfig);
+                return true;
+            }
+        });
+        mZenMode.setOrder(10);  // sort at the bottom of the category
+        mZenMode.setDependency(getZenModeDependency());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateControls();
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final SettingsActivity activity = (SettingsActivity) getActivity();
+        mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
+    }
+
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        if (DEBUG) Log.d(TAG, "onSwitchChanged " + isChecked);
+        if (mDisableListeners) return;
+        final boolean enabled = isChecked;
+        if (enabled == mRule.enabled) return;
+        if (DEBUG) Log.d(TAG, "onSwitchChanged enabled=" + enabled);
+        mRule.enabled = enabled;
+        mRule.snoozing = false;
+        setZenModeConfig(mConfig);
+    }
+
+    protected void updateRule(Uri newConditionId) {
+        mRule.conditionId = newConditionId;
+        mRule.condition = null;
+        mRule.snoozing = false;
+        setZenModeConfig(mConfig);
+    }
+
+    @Override
+    protected void onZenModeChanged() {
+        // noop
+    }
+
+    @Override
+    protected void onZenModeConfigChanged() {
+        if (!refreshRuleOrFinish()) {
+            updateControls();
+        }
+    }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        if (DEBUG) Log.d(TAG, "onCreateOptionsMenu");
+        inflater.inflate(R.menu.zen_mode_rule, menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (DEBUG) Log.d(TAG, "onOptionsItemSelected " + item.getItemId());
+        if (item.getItemId() == R.id.delete) {
+            showDeleteRuleDialog();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void showRuleNameDialog() {
+        new ZenRuleNameDialog(mContext, null, mRule.name, mConfig.getAutomaticRuleNames()) {
+            @Override
+            public void onOk(String ruleName, RuleInfo type) {
+                final ZenModeConfig newConfig = mConfig.copy();
+                final ZenRule rule = newConfig.automaticRules.get(mRuleId);
+                if (rule == null) return;
+                rule.name = ruleName;
+                setZenModeConfig(newConfig);
+            }
+        }.show();
+    }
+
+    private boolean refreshRuleOrFinish() {
+        mRule = mConfig.automaticRules.get(mRuleId);
+        if (DEBUG) Log.d(TAG, "mRule=" + mRule);
+        if (!setRule(mRule)) {
+            toastAndFinish();
+            return true;
+        }
+        return false;
+    }
+
+    private void showDeleteRuleDialog() {
+        new AlertDialog.Builder(mContext)
+                .setMessage(getString(R.string.zen_mode_delete_rule_confirmation, mRule.name))
+                .setNegativeButton(R.string.cancel, null)
+                .setPositiveButton(R.string.zen_mode_delete_rule_button, new OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        mDeleting = true;
+                        mConfig.automaticRules.remove(mRuleId);
+                        setZenModeConfig(mConfig);
+                    }
+                })
+                .show();
+    }
+
+    private void toastAndFinish() {
+        if (!mDeleting) {
+            Toast.makeText(mContext, R.string.zen_mode_rule_not_found_text, Toast.LENGTH_SHORT)
+                    .show();
+        }
+        getActivity().finish();
+    }
+
+    private void updateRuleName() {
+        getActivity().setTitle(mRule.name);
+        mRuleName.setSummary(mRule.name);
+    }
+
+    private void updateControls() {
+        mDisableListeners = true;
+        updateRuleName();
+        updateControlsInternal();
+        mZenMode.setSelectedValue(mRule.zenMode);
+        mDisableListeners = false;
+        if (mSwitchBar != null) {
+            mSwitchBar.setChecked(mRule.enabled);
+        }
+    }
+
+}
diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
index f0f0294..f7015d3 100644
--- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
+++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
@@ -25,141 +25,58 @@
 import android.app.TimePickerDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
 import android.content.DialogInterface.OnDismissListener;
-import android.content.Intent;
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
-import android.provider.Settings.Global;
 import android.service.notification.ZenModeConfig;
 import android.service.notification.ZenModeConfig.ScheduleInfo;
 import android.service.notification.ZenModeConfig.ZenRule;
 import android.text.format.DateFormat;
 import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.widget.Switch;
 import android.widget.TimePicker;
-import android.widget.Toast;
 
 import com.android.internal.logging.MetricsLogger;
-import com.android.settings.DropDownPreference;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.widget.SwitchBar;
 
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Calendar;
 
-public class ZenModeScheduleRuleSettings extends ZenModeSettingsBase
-        implements SwitchBar.OnSwitchChangeListener {
-    private static final String TAG = ZenModeSettingsBase.TAG;
-    private static final boolean DEBUG = ZenModeSettingsBase.DEBUG;
-
-    private static final String KEY_RULE_NAME = "rule_name";
+public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
     private static final String KEY_DAYS = "days";
     private static final String KEY_START_TIME = "start_time";
     private static final String KEY_END_TIME = "end_time";
-    private static final String KEY_ZEN_MODE = "zen_mode";
 
     private static final SimpleDateFormat DAY_FORMAT = new SimpleDateFormat("EEE");
 
     public static final String ACTION = Settings.ACTION_ZEN_MODE_SCHEDULE_RULE_SETTINGS;
-    public static final String EXTRA_RULE_ID = "rule_id";
 
-    private Context mContext;
-    private boolean mDisableListeners;
-    private SwitchBar mSwitchBar;
-    private Preference mRuleName;
     private Preference mDays;
     private TimePickerPreference mStart;
     private TimePickerPreference mEnd;
-    private DropDownPreference mZenMode;
 
-    private String mRuleId;
-    private ZenRule mRule;
     private ScheduleInfo mSchedule;
-    private boolean mDeleting;
 
     @Override
-    protected void onZenModeChanged() {
-        // noop
-    }
-
-    @Override
-    protected void onZenModeConfigChanged() {
-        if (!refreshRuleOrFinish()) {
-            updateControls();
-        }
-    }
-
-    private boolean refreshRuleOrFinish() {
-        mRule = mConfig.automaticRules.get(mRuleId);
-        if (DEBUG) Log.d(TAG, "mRule=" + mRule);
-        mSchedule = mRule != null ? ZenModeConfig.tryParseScheduleConditionId(mRule.conditionId)
+    protected boolean setRule(ZenRule rule) {
+        mSchedule = rule != null ? ZenModeConfig.tryParseScheduleConditionId(rule.conditionId)
                 : null;
-        if (mSchedule == null) {
-            toastAndFinish();
-            return true;
-        }
-        return false;
+        return mSchedule != null;
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (DEBUG) Log.d(TAG, "onCreateOptionsMenu");
-        inflater.inflate(R.menu.zen_mode_rule, menu);
+    protected String getZenModeDependency() {
+        return mDays.getKey();
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (DEBUG) Log.d(TAG, "onOptionsItemSelected " + item.getItemId());
-        if (item.getItemId() == R.id.delete) {
-            showDeleteRuleDialog();
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mContext = getActivity();
-
-        final Intent intent = getActivity().getIntent();
-        if (DEBUG) Log.d(TAG, "onCreate getIntent()=" + intent);
-        if (intent == null) {
-            Log.w(TAG, "No intent");
-            toastAndFinish();
-            return;
-        }
-
-        mRuleId = intent.getStringExtra(EXTRA_RULE_ID);
-        if (DEBUG) Log.d(TAG, "mRuleId=" + mRuleId);
-        if (refreshRuleOrFinish()) {
-            return;
-        }
-
+    protected void onCreateInternal() {
         addPreferencesFromResource(R.xml.zen_mode_schedule_rule_settings);
         final PreferenceScreen root = getPreferenceScreen();
 
-        setHasOptionsMenu(true);
-
-        mRuleName = root.findPreference(KEY_RULE_NAME);
-        mRuleName.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-            @Override
-            public boolean onPreferenceClick(Preference preference) {
-                showRuleNameDialog();
-                return true;
-            }
-        });
-
         mDays = root.findPreference(KEY_DAYS);
         mDays.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             @Override
@@ -186,10 +103,7 @@
                 if (DEBUG) Log.d(TAG, "onPrefChange start h=" + hour + " m=" + minute);
                 mSchedule.startHour = hour;
                 mSchedule.startMinute = minute;
-                mRule.conditionId = ZenModeConfig.toScheduleConditionId(mSchedule);
-                mRule.condition = null;
-                mRule.snoozing = false;
-                setZenModeConfig(mConfig);
+                updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
                 return true;
             }
         });
@@ -211,63 +125,12 @@
                 if (DEBUG) Log.d(TAG, "onPrefChange end h=" + hour + " m=" + minute);
                 mSchedule.endHour = hour;
                 mSchedule.endMinute = minute;
-                mRule.conditionId = ZenModeConfig.toScheduleConditionId(mSchedule);
-                mRule.condition = null;
-                mRule.snoozing = false;
-                setZenModeConfig(mConfig);
+                updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
                 return true;
             }
         });
         root.addPreference(mEnd);
         mEnd.setDependency(mDays.getKey());
-
-        mZenMode = (DropDownPreference) root.findPreference(KEY_ZEN_MODE);
-        mZenMode.addItem(R.string.zen_mode_option_important_interruptions, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
-        mZenMode.addItem(R.string.zen_mode_option_alarms, Global.ZEN_MODE_ALARMS);
-        mZenMode.addItem(R.string.zen_mode_option_no_interruptions, Global.ZEN_MODE_NO_INTERRUPTIONS);
-        mZenMode.setCallback(new DropDownPreference.Callback() {
-            @Override
-            public boolean onItemSelected(int pos, Object value) {
-                if (mDisableListeners) return true;
-                final int zenMode = (Integer) value;
-                if (zenMode == mRule.zenMode) return true;
-                if (DEBUG) Log.d(TAG, "onPrefChange zenMode=" + zenMode);
-                mRule.zenMode = zenMode;
-                setZenModeConfig(mConfig);
-                return true;
-            }
-        });
-        mZenMode.setOrder(10);  // sort at the bottom of the category
-        mZenMode.setDependency(mDays.getKey());
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        final SettingsActivity activity = (SettingsActivity) getActivity();
-        mSwitchBar = activity.getSwitchBar();
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
-    }
-
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
-    }
-
-    @Override
-    public void onSwitchChanged(Switch switchView, boolean isChecked) {
-        if (DEBUG) Log.d(TAG, "onSwitchChanged " + isChecked);
-        if (mDisableListeners) return;
-        final boolean enabled = isChecked;
-        if (enabled == mRule.enabled) return;
-        if (DEBUG) Log.d(TAG, "onSwitchChanged enabled=" + enabled);
-        mRule.enabled = enabled;
-        mRule.snoozing = false;
-        setZenModeConfig(mConfig);
     }
 
     private void updateDays() {
@@ -308,28 +171,11 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        updateControls();
-    }
-
-    private void updateRuleName() {
-        getActivity().setTitle(mRule.name);
-        mRuleName.setSummary(mRule.name);
-    }
-
-    private void updateControls() {
-        mDisableListeners = true;
-        updateRuleName();
+    protected void updateControlsInternal() {
         updateDays();
         mStart.setTime(mSchedule.startHour, mSchedule.startMinute);
         mEnd.setTime(mSchedule.endHour, mSchedule.endMinute);
-        mZenMode.setSelectedValue(mRule.zenMode);
-        mDisableListeners = false;
         updateEndSummary();
-        if (mSwitchBar != null) {
-            mSwitchBar.setChecked(mRule.enabled);
-        }
     }
 
     @Override
@@ -337,34 +183,6 @@
         return MetricsLogger.NOTIFICATION_ZEN_MODE_SCHEDULE_RULE;
     }
 
-    private void showDeleteRuleDialog() {
-        new AlertDialog.Builder(mContext)
-                .setMessage(getString(R.string.zen_mode_delete_rule_confirmation, mRule.name))
-                .setNegativeButton(R.string.cancel, null)
-                .setPositiveButton(R.string.zen_mode_delete_rule_button, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        mDeleting = true;
-                        mConfig.automaticRules.remove(mRuleId);
-                        setZenModeConfig(mConfig);
-                    }
-                })
-                .show();
-    }
-
-    private void showRuleNameDialog() {
-        new ZenRuleNameDialog(mContext, mRule.name, mConfig.getAutomaticRuleNames()) {
-            @Override
-            public void onOk(String ruleName) {
-                final ZenModeConfig newConfig = mConfig.copy();
-                final ZenRule rule = newConfig.automaticRules.get(mRuleId);
-                if (rule == null) return;
-                rule.name = ruleName;
-                setZenModeConfig(newConfig);
-            }
-        }.show();
-    }
-
     private void showDaysDialog() {
         new AlertDialog.Builder(mContext)
                 .setTitle(R.string.zen_mode_schedule_rule_days)
@@ -375,10 +193,7 @@
                           if (Arrays.equals(days, mSchedule.days)) return;
                           if (DEBUG) Log.d(TAG, "days.onChanged days=" + Arrays.asList(days));
                           mSchedule.days = days;
-                          mRule.conditionId = ZenModeConfig.toScheduleConditionId(mSchedule);
-                          mRule.condition = null;
-                          mRule.snoozing = false;
-                          setZenModeConfig(mConfig);
+                          updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
                       }
                 })
                 .setOnDismissListener(new OnDismissListener() {
@@ -391,14 +206,6 @@
                 .show();
     }
 
-    private void toastAndFinish() {
-        if (!mDeleting) {
-            Toast.makeText(mContext, R.string.zen_mode_rule_not_found_text, Toast.LENGTH_SHORT)
-                    .show();
-        }
-        getActivity().finish();
-    }
-
     private static class TimePickerPreference extends Preference {
         private final Context mContext;
 
@@ -474,4 +281,5 @@
             boolean onSetTime(int hour, int minute);
         }
     }
+
 }
diff --git a/src/com/android/settings/notification/ZenModeVoiceActivity.java b/src/com/android/settings/notification/ZenModeVoiceActivity.java
new file mode 100644
index 0000000..c7c1151
--- /dev/null
+++ b/src/com/android/settings/notification/ZenModeVoiceActivity.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2015 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 android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES;
+import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED;
+
+import com.android.settings.R;
+import com.android.settings.utils.VoiceSelectionAdapter;
+import com.android.settings.utils.VoiceSelection;
+import com.android.settings.utils.VoiceSelectionFragment;
+import com.android.settings.utils.VoiceSettingsActivity;
+
+import android.app.Fragment;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings.Global;
+import android.service.notification.Condition;
+import android.service.notification.ZenModeConfig;
+import android.text.format.DateFormat;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Activity for modifying the Zen mode (Do not disturb) by voice
+ * using the Voice Interaction API.
+ */
+public class ZenModeVoiceActivity extends VoiceSettingsActivity {
+    private static final String TAG = "ZenModeVoiceActivity";
+    private static final int MINUTES_MS = 60 * 1000;
+
+    @Override
+    protected boolean onVoiceSettingInteraction(Intent intent) {
+        setContentView(R.layout.voice_interaction);
+        pickNotificationMode(intent);
+        return false;
+    }
+
+    /**
+     * Start a voice interaction to ask what kind of interruptions should
+     * be permitted. The intent can optionally include extra information about the type
+     * of interruptions desired or how long interruptions should be limited to that are
+     * used as hints.
+     */
+    private void pickNotificationMode(final Intent intent) {
+        boolean enabled = intent.getBooleanExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, false);
+        boolean specified = intent.hasExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED);
+
+        List<VoiceSelection> states = new ArrayList<VoiceSelection>();
+        if (!specified || enabled) {
+            states.add(new ModeSelection(this, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                    R.string.zen_mode_option_important_interruptions,
+                    R.string.zen_mode_option_important_voice_synonyms));
+            states.add(new ModeSelection(this, Global.ZEN_MODE_ALARMS,
+                    R.string.zen_mode_option_alarms,
+                    R.string.zen_mode_option_alarms_voice_synonyms));
+            states.add(new ModeSelection(this, Global.ZEN_MODE_NO_INTERRUPTIONS,
+                    R.string.zen_mode_option_no_interruptions,
+                    R.string.zen_mode_option_no_interruptions_voice_synonyms));
+        }
+        if (!specified || !enabled) {
+            states.add(new ModeSelection(this, Global.ZEN_MODE_OFF,
+                    R.string.zen_mode_option_off,
+                    R.string.zen_mode_option_off_voice_synonyms));
+        }
+        VoiceSelectionFragment fragment = new VoiceSelectionFragment();
+        fragment.setArguments(VoiceSelectionFragment.createArguments(
+                getString(R.string.zen_mode_interruptions_voice_prompt)));
+        fragment.setListAdapter(
+                new VoiceSelectionAdapter(this, R.layout.voice_item_row, states));
+        fragment.setOnItemSelectedHandler(new VoiceSelection.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index, VoiceSelection selection) {
+                int mode = ((ModeSelection) selection).mMode;
+                ConditionSelection conditionSelection = getConditionSelection(
+                        intent.getIntExtra(EXTRA_DO_NOT_DISTURB_MODE_MINUTES, 0));
+                if (mode != Global.ZEN_MODE_OFF) {
+                    if (conditionSelection == null) {
+                        pickDuration(selection.getLabel(), mode);
+                        return;
+                    }
+                }
+                setZenModeConfig(mode, conditionSelection.mCondition);
+                notifySuccess(getChangeSummary(mode, conditionSelection));
+                finish();
+            }
+        });
+        showFragment(fragment, "pick_mode_fragment");
+    }
+
+    /**
+     * Start a voice interaction to ask for the zen mode duration.
+     */
+    private void pickDuration(CharSequence label, final int mode) {
+        setTitle(label.toString());
+        List<VoiceSelection> states = new ArrayList<VoiceSelection>();
+        states.add(new ConditionSelection(null, -1,
+              getString(R.string.zen_mode_duration_indefinte_voice_label),
+              getString(R.string.zen_mode_duration_indefinite_voice_synonyms)));
+        for (int i = ZenModeConfig.MINUTE_BUCKETS.length - 1; i >= 0; --i) {
+            states.add(getConditionSelection(ZenModeConfig.MINUTE_BUCKETS[i]));
+        }
+
+        VoiceSelectionFragment fragment = new VoiceSelectionFragment();
+        fragment.setArguments(VoiceSelectionFragment.createArguments(
+                getString(R.string.zen_mode_duration_voice_prompt)));
+        fragment.setListAdapter(
+                new VoiceSelectionAdapter(this, R.layout.voice_item_row, states));
+        fragment.setOnItemSelectedHandler(new VoiceSelection.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index, VoiceSelection item) {
+                ConditionSelection selection = ((ConditionSelection) item);
+                setZenModeConfig(mode, selection.mCondition);
+                notifySuccess(getChangeSummary(mode, selection));
+                finish();
+            }
+        });
+        showFragment(fragment, "pick_duration_fragment");
+    }
+
+    private void showFragment(Fragment fragment, String tag) {
+        getFragmentManager()
+                .beginTransaction()
+                .replace(R.id.fragment_root, fragment, tag)
+                .commit();
+    }
+
+    private void setZenModeConfig(int mode, Condition condition) {
+        if (condition != null) {
+            NotificationManager.from(this).setZenMode(mode, condition.id, TAG);
+        } else {
+            NotificationManager.from(this).setZenMode(mode, null, TAG);
+        }
+    }
+
+    /**
+     * Produce a summary of the Zen mode change to be read aloud as TTS.
+     */
+    private CharSequence getChangeSummary(int mode, ConditionSelection duration) {
+        int indefinite = -1;
+        int byMinute = -1;
+        int byHour = -1;
+
+        switch (mode) {
+            case Global.ZEN_MODE_ALARMS:
+                indefinite = R.string.zen_mode_summary_alarams_only_indefinite;
+                byMinute = R.plurals.zen_mode_summary_alarms_only_by_minute;
+                byHour = R.plurals.zen_mode_summary_alarms_only_by_hour;
+                break;
+            case Global.ZEN_MODE_NO_INTERRUPTIONS:
+                indefinite = R.string.zen_mode_summary_no_interruptions_indefinite;
+                byMinute = R.plurals.zen_mode_summary_no_interruptions_by_minute;
+                byHour = R.plurals.zen_mode_summary_no_interruptions_by_hour;
+                break;
+            case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
+                indefinite = R.string.zen_mode_summary_priority_indefinitely;
+                byMinute = R.plurals.zen_mode_summary_priority_by_minute;
+                byHour = R.plurals.zen_mode_summary_priority_by_hour;
+                break;
+            default:
+            case Global.ZEN_MODE_OFF:
+                indefinite = R.string.zen_mode_summary_always;
+                break;
+        };
+
+        if (duration == null || duration.mCondition == null) {
+            return getString(indefinite);
+        }
+
+        long time = System.currentTimeMillis() + duration.mMinutes * MINUTES_MS;
+        String skeleton = DateFormat.is24HourFormat(this, UserHandle.myUserId()) ? "Hm" : "hma";
+        String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
+        CharSequence formattedTime = DateFormat.format(pattern, time);
+        Resources res = getResources();
+
+        if (duration.mMinutes < 60) {
+            return res.getQuantityString(byMinute,
+                    duration.mMinutes, duration.mMinutes, formattedTime);
+        } else {
+            int hours = duration.mMinutes / 60;
+            return res.getQuantityString(byHour, hours, hours, formattedTime);
+        }
+    }
+
+    private ConditionSelection getConditionSelection(int minutes) {
+        Condition condition = ZenModeConfig.toTimeCondition(this, minutes, UserHandle.myUserId());
+        Resources res = getResources();
+        if (minutes <= 0) {
+            return null;
+        } else if (minutes < 60) {
+            String label = res.getQuantityString(R.plurals.zen_mode_duration_minutes_voice_label,
+                    minutes, minutes);
+            return new ConditionSelection(condition, minutes, label, Integer.toString(minutes));
+        } else {
+            int hours = minutes / 60;
+            String label = res.getQuantityString(R.plurals.zen_mode_duration_hours_voice_label,
+                    hours, hours);
+            return new ConditionSelection(condition, minutes, label, Integer.toString(hours));
+        }
+    }
+
+    private static class ConditionSelection extends VoiceSelection {
+        Condition mCondition;
+        int mMinutes;
+
+        public ConditionSelection(Condition condition, int minutes, CharSequence label,
+                CharSequence synonyms) {
+            super(label, synonyms);
+            mMinutes = minutes;
+            mCondition = condition;
+        }
+    }
+
+    private static class ModeSelection extends VoiceSelection {
+        int mMode;
+
+        public ModeSelection(Context context, int mode, int label, int synonyms) {
+            super(context.getString(label), context.getString(synonyms));
+            mMode = mode;
+        }
+    }
+}
diff --git a/src/com/android/settings/notification/ZenRuleNameDialog.java b/src/com/android/settings/notification/ZenRuleNameDialog.java
index b0eaaec..8b44e46 100644
--- a/src/com/android/settings/notification/ZenRuleNameDialog.java
+++ b/src/com/android/settings/notification/ZenRuleNameDialog.java
@@ -17,35 +17,71 @@
 package com.android.settings.notification;
 
 import android.app.AlertDialog;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
+import android.content.pm.ServiceInfo;
+import android.net.Uri;
+import android.service.notification.ZenModeConfig;
+import android.service.notification.ZenModeConfig.ScheduleInfo;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.ArraySet;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
 
 import com.android.settings.R;
 
+import java.util.List;
+
 public abstract class ZenRuleNameDialog {
+    private static final String TAG = ZenModeSettings.TAG;
+    private static final boolean DEBUG = ZenModeSettings.DEBUG;
+
     private final AlertDialog mDialog;
     private final EditText mEditText;
+    private final RadioGroup mTypes;
     private final ArraySet<String> mExistingNames;
+    private final ServiceListing mServiceListing;
+    private final RuleInfo[] mExternalRules = new RuleInfo[3];
 
-    public ZenRuleNameDialog(Context context, String ruleName, ArraySet<String> existingNames) {
+    public ZenRuleNameDialog(Context context, ServiceListing serviceListing, String ruleName,
+            ArraySet<String> existingNames) {
+        mServiceListing = serviceListing;
         final View v = LayoutInflater.from(context).inflate(R.layout.zen_rule_name, null, false);
         mEditText = (EditText) v.findViewById(R.id.rule_name);
-        mEditText.setText(ruleName);
+        if (ruleName != null) {
+            mEditText.setText(ruleName);
+        }
         mEditText.setSelectAllOnFocus(true);
+        mTypes = (RadioGroup) v.findViewById(R.id.rule_types);
+        if (mServiceListing != null) {
+            bindType(R.id.rule_type_schedule, defaultNewSchedule());
+            bindExternalRules();
+            mServiceListing.addCallback(mServiceListingCallback);
+            mServiceListing.reload();
+        }
         mDialog = new AlertDialog.Builder(context)
                 .setTitle(R.string.zen_mode_rule_name)
                 .setView(v)
                 .setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
-                        onOk(trimmedText());
+                        onOk(trimmedText(), selectedRuleInfo());
+                    }
+                })
+                .setOnDismissListener(new OnDismissListener() {
+                    @Override
+                    public void onDismiss(DialogInterface dialog) {
+                        if (mServiceListing != null) {
+                            mServiceListing.removeCallback(mServiceListingCallback);
+                        }
                     }
                 })
                 .setNegativeButton(R.string.cancel, null)
@@ -72,17 +108,37 @@
         }
     }
 
-    abstract public void onOk(String ruleName);
-
-    private String trimmedText() {
-        return mEditText.getText() == null ? null : mEditText.getText().toString().trim();
-    }
+    abstract public void onOk(String ruleName, RuleInfo ruleInfo);
 
     public void show() {
         mDialog.show();
         updatePositiveButton();
     }
 
+    private void bindType(int id, RuleInfo ri) {
+        final RadioButton rb = (RadioButton) mTypes.findViewById(id);
+        if (ri == null) {
+            rb.setVisibility(View.GONE);
+            return;
+        }
+        rb.setVisibility(View.VISIBLE);
+        if (ri.caption != null) {
+            rb.setText(ri.caption);
+        }
+        rb.setTag(ri);
+    }
+
+    private RuleInfo selectedRuleInfo() {
+        final int id = mTypes.getCheckedRadioButtonId();
+        if (id == -1) return null;
+        final RadioButton rb = (RadioButton) mTypes.findViewById(id);
+        return (RuleInfo) rb.getTag();
+    }
+
+    private String trimmedText() {
+        return mEditText.getText() == null ? null : mEditText.getText().toString().trim();
+    }
+
     private void updatePositiveButton() {
         final String name = trimmedText();
         final boolean validName = !TextUtils.isEmpty(name)
@@ -90,4 +146,51 @@
         mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validName);
     }
 
+    private static RuleInfo defaultNewSchedule() {
+        final ScheduleInfo schedule = new ScheduleInfo();
+        schedule.days = ZenModeConfig.ALL_DAYS;
+        schedule.startHour = 22;
+        schedule.endHour = 7;
+        final RuleInfo rt = new RuleInfo();
+        rt.settingsAction = ZenModeScheduleRuleSettings.ACTION;
+        rt.defaultConditionId = ZenModeConfig.toScheduleConditionId(schedule);
+        return rt;
+    }
+
+    private void bindExternalRules() {
+        bindType(R.id.rule_type_2, mExternalRules[0]);
+        bindType(R.id.rule_type_3, mExternalRules[1]);
+        bindType(R.id.rule_type_4, mExternalRules[2]);
+        // show radio group if we have at least one external rule type
+        mTypes.setVisibility(mExternalRules[0] != null ? View.VISIBLE : View.GONE);
+    }
+
+    private final ServiceListing.Callback mServiceListingCallback = new ServiceListing.Callback() {
+        @Override
+        public void onServicesReloaded(List<ServiceInfo> services) {
+            if (DEBUG) Log.d(TAG, "Services reloaded: count=" + services.size());
+            mExternalRules[0] = mExternalRules[1] = mExternalRules[2] = null;
+            int i = 0;
+            for (ServiceInfo si : services) {
+                final RuleInfo ri = ZenModeExternalRuleSettings.getRuleInfo(si);
+                if (ri != null) {
+                    mExternalRules[i] = ri;
+                    i++;
+                    if (i == mExternalRules.length) {
+                        break;
+                    }
+                }
+            }
+            bindExternalRules();
+        }
+    };
+
+    public static class RuleInfo {
+        public String caption;
+        public String settingsAction;
+        public Uri defaultConditionId;
+        public ComponentName serviceComponent;
+        public ComponentName configurationActivity;
+    }
+
 }
\ No newline at end of file
diff --git a/src/com/android/settings/utils/VoiceSelection.java b/src/com/android/settings/utils/VoiceSelection.java
new file mode 100644
index 0000000..997d2cc
--- /dev/null
+++ b/src/com/android/settings/utils/VoiceSelection.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 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.utils;
+
+import android.app.VoiceInteractor.PickOptionRequest.Option;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+/**
+ * Model for a single item that can be selected by a {@link VoiceSelectionFragment}.
+ * Each item consists of a visual label and several alternative synonyms for the item
+ * that can be used to identify the item by voice.
+ */
+public class VoiceSelection {
+    final CharSequence mLabel;
+    final CharSequence[] mSynonyms;
+
+    /**
+     * Created a new selectable item with a visual label and a set of synonyms.
+     */
+    public VoiceSelection(CharSequence label, CharSequence synonyms) {
+        mLabel = label;
+        mSynonyms = TextUtils.split(synonyms.toString(), ",");
+    }
+
+    /**
+     * Created a new selectable item with a visual label and no synonyms.
+     */
+    public VoiceSelection(CharSequence label) {
+        mLabel = label;
+        mSynonyms = null;
+    }
+
+    public CharSequence getLabel() {
+        return mLabel;
+    }
+
+    public CharSequence[] getSynonyms() {
+        return mSynonyms;
+    }
+
+    Option toOption(int index) {
+        Option result = new Option(mLabel);
+        Bundle extras = new Bundle();
+        extras.putInt("index", index);
+        result.setExtras(extras);
+
+        for (CharSequence synonym : mSynonyms) {
+            result.addSynonym(synonym);
+        }
+        return result;
+    }
+
+    /**
+     * Listener interface for when an item is selected.
+     */
+    public interface OnItemSelectedListener {
+        abstract void onItemSelected(int position, VoiceSelection selection);
+    };
+}
diff --git a/src/com/android/settings/utils/VoiceSelectionAdapter.java b/src/com/android/settings/utils/VoiceSelectionAdapter.java
new file mode 100644
index 0000000..2c060c2
--- /dev/null
+++ b/src/com/android/settings/utils/VoiceSelectionAdapter.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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.utils;
+
+import android.content.Context;
+import android.widget.ArrayAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import android.app.Activity;
+import com.android.settings.R;
+
+import java.util.List;
+import android.util.Log;
+
+/**
+ * Array adapter for selecting an item by voice interaction. Each row includes a visual
+ * indication of the 1-indexed position of the item so that a user can easily say
+ * "number 4" to select it.
+ */
+public class VoiceSelectionAdapter extends ArrayAdapter<VoiceSelection> {
+    public VoiceSelectionAdapter(Context context, int resource, List<VoiceSelection> objects) {
+        super(context, resource, objects);
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        VoiceSelection item = getItem(position);
+        View row = convertView;
+        if (row == null) {
+            LayoutInflater inflater = ((Activity) getContext()).getLayoutInflater();
+            row = inflater.inflate(R.layout.voice_item_row, parent, false);
+        }
+
+        TextView label = (TextView) row.findViewById(R.id.voice_item_label);
+        if (label != null) {
+            label.setText(item.getLabel());
+        }
+
+        TextView positionLabel = (TextView) row.findViewById(R.id.voice_item_position);
+        if (positionLabel != null) {
+            positionLabel.setText(Integer.toString(position + 1));
+        }
+
+        return row;
+    }
+};
diff --git a/src/com/android/settings/utils/VoiceSelectionFragment.java b/src/com/android/settings/utils/VoiceSelectionFragment.java
new file mode 100644
index 0000000..c2e80d3
--- /dev/null
+++ b/src/com/android/settings/utils/VoiceSelectionFragment.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 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.utils;
+
+import android.app.ListFragment;
+import android.app.VoiceInteractor;
+import android.app.VoiceInteractor.PickOptionRequest;
+import android.app.VoiceInteractor.PickOptionRequest.Option;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+import java.util.List;
+
+/**
+ * An Activity fragment that presents a set of options as a visual list and also allows
+ * items to be selected by the users voice.
+ */
+public class VoiceSelectionFragment extends ListFragment {
+    private static final String EXTRA_SELECTION_PROMPT = "selection_prompt";
+
+    private CharSequence mPrompt = null;
+    private VoiceInteractor.Request mRequest = null;
+    private VoiceInteractor mVoiceInteractor = null;
+    private VoiceSelection.OnItemSelectedListener mOnItemSelectedListener = null;
+
+    /**
+     * No-args ctor required for fragment.
+     */
+    public VoiceSelectionFragment() {}
+
+    @Override
+    public void onCreate(Bundle args) {
+        super.onCreate(args);
+        mPrompt = getArguments().getCharSequence(EXTRA_SELECTION_PROMPT);
+    }
+
+    /**
+     * Set the prompt spoken when the fragment is presented.
+     */
+    static public Bundle createArguments(CharSequence prompt) {
+        Bundle args = new Bundle();
+        args.putCharSequence(EXTRA_SELECTION_PROMPT, prompt);
+        return args;
+    }
+
+    private VoiceSelection getSelectionAt(int position) {
+        return ((ArrayAdapter<VoiceSelection>) getListAdapter()).getItem(position);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        final int numItems = getListAdapter().getCount();
+        if (numItems <= 0) {
+            return;
+        }
+
+        Option[] options = new Option[numItems];
+        for (int idx = 0; idx < numItems; idx++) {
+            options[idx] = getSelectionAt(idx).toOption(idx);
+        }
+        mRequest = new PickOptionRequest(mPrompt, options, null) {
+            @Override
+            public void onPickOptionResult(boolean isComplete, Option[] options, Bundle args) {
+                if (!isComplete || options == null) {
+                    return;
+                }
+                if (options.length == 1 && mOnItemSelectedListener != null) {
+                    int idx = options[0].getExtras().getInt("index", -1);
+                    mOnItemSelectedListener.onItemSelected(idx, getSelectionAt(idx));
+                } else {
+                    onCancel();
+                }
+            }
+        };
+        mVoiceInteractor = getActivity().getVoiceInteractor();
+        if (mVoiceInteractor != null) {
+            mVoiceInteractor.submitRequest(mRequest);
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mVoiceInteractor = null;
+    }
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id) {
+        if (mRequest != null) {
+            mRequest.cancel();
+            mRequest = null;
+        }
+
+        if (mOnItemSelectedListener != null) {
+          mOnItemSelectedListener.onItemSelected(position, getSelectionAt(position));
+        }
+    }
+
+
+    /**
+     * Sets the selection handler for an item either by voice or by touch.
+     */
+    public void setOnItemSelectedHandler(VoiceSelection.OnItemSelectedListener listener) {
+        mOnItemSelectedListener = listener;
+    }
+
+    /**
+     * Called when the user cancels the interaction. The default implementation is to
+     * finish the activity.
+     */
+    public void onCancel() {
+        getActivity().finish();
+    }
+};
diff --git a/src/com/android/settings/utils/VoiceSettingsActivity.java b/src/com/android/settings/utils/VoiceSettingsActivity.java
new file mode 100644
index 0000000..ac5b8be
--- /dev/null
+++ b/src/com/android/settings/utils/VoiceSettingsActivity.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2014 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.utils;
+
+import android.app.Activity;
+import android.app.VoiceInteractor;
+import android.app.VoiceInteractor.CompleteVoiceRequest;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Activity for modifying a setting using the Voice Interaction API. This activity
+ * will only allow modifying the setting if the intent was sent using
+ * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity startVoiceActivity}
+ * by the current Voice Interaction Service.
+ */
+abstract public class VoiceSettingsActivity extends Activity {
+
+    private static final String TAG = "VoiceSettingsActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (isVoiceInteraction() || savedInstanceState == null) {
+            // Only permit if this is a voice interaction.
+            if (onVoiceSettingInteraction(getIntent())) {
+                // If it's complete, finish.
+                finish();
+            }
+        } else {
+            Log.v(TAG, "Cannot modify settings without voice interaction");
+            finish();
+        }
+    }
+
+    /**
+     * Modify the setting as a voice interaction. Should return true if the
+     * voice interaction is complete or false if more interaction is required.
+     */
+    abstract protected boolean onVoiceSettingInteraction(Intent intent);
+
+    /**
+     * Send a notification that the interaction was successful. If {@link prompt} is
+     * not null, then it will be read to the user.
+     */
+    protected void notifySuccess(CharSequence prompt) {
+        if (getVoiceInteractor() != null) {
+            getVoiceInteractor().submitRequest(new CompleteVoiceRequest(prompt, null));
+        }
+    }
+
+    /**
+     * Indicates when the setting could not be changed.
+     */
+    protected void notifyFailure(String reason) {
+        getVoiceInteractor().submitRequest(new VoiceInteractor.AbortVoiceRequest(reason, null));
+    }
+}
diff --git a/wrap_alpha.py b/wrap_alpha.py
new file mode 100755
index 0000000..53db4eb
--- /dev/null
+++ b/wrap_alpha.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+import os
+
+# assume everything needs alpha suffixes
+for root, dirs, files in os.walk('.'):
+    if "res/drawable-" not in root: continue
+
+    for before in files:
+        if "_alpha.png" in before: continue
+        if not before.startswith("ic_settings_"): continue
+
+        after = before.replace(".png", "_alpha.png")
+        os.rename(os.path.join(root, before), os.path.join(root, after))
+
+# build xml redirection
+for root, dirs, files in os.walk('.'):
+    if "res/drawable-" not in root: continue
+
+    for src in files:
+        if not src.endswith(".png"): continue
+        src = src[0:-4]
+
+        src_clause = '\n    android:src="@drawable/%s"' % (src)
+
+        alpha = src.endswith("_alpha")
+        if alpha:
+            src = src[0:-6]
+            alpha_clause = '\n    android:tint="?android:attr/colorAccent"'
+        else:
+            alpha_clause = ''
+
+        am = src.endswith("_am")
+        if am:
+            src = src[0:-3]
+            am_clause = '\n    android:autoMirrored="true"'
+        else:
+            am_clause = ''
+
+        with open("res/drawable/%s.xml" % (src), 'w') as xml:
+            xml.write("""<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"%s%s%s />
+""" % (src_clause, alpha_clause, am_clause))