diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index facfeab..bf241d3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3104,13 +3104,6 @@
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" />
         </activity>
-
-        <activity android:name="Settings$LegacySupportActivity"
-                  android:label="@string/page_tab_title_support">
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-            android:value="com.android.settings.dashboard.SupportFragment"/>
-        </activity>
-
         <!-- Information architecture host activities -->
 
         <!-- Alias for battery settings in new IA. Remove and merge metadata into TargetActivity -->
diff --git a/res/layout/choose_lock_password_footer.xml b/res/layout/choose_lock_password_footer.xml
index 41306e9..0b7791c 100644
--- a/res/layout/choose_lock_password_footer.xml
+++ b/res/layout/choose_lock_password_footer.xml
@@ -21,12 +21,13 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
 
-    <!-- left : cancel -->
-    <Button android:id="@+id/cancel_button"
+    <!-- left : skip -->
+    <Button android:id="@+id/skip_button"
         style="@style/SuwGlifButton.Secondary"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/lockpassword_cancel_label" />
+        android:text="@string/skip_label"
+        android:visibility="gone" />
 
 
     <!-- left : clear -->
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 949d130..6aee0f9 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -107,6 +107,14 @@
             android:textSize="14sp"
             android:visibility="gone"/>
 
+        <Button
+            android:id="@+id/screen_lock_options"
+            style="@style/SuwGlifButton.Tertiary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/setup_lock_settings_options_button_label"
+            android:visibility="gone" />
+
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 
 </com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/preference_widget_master_checkbox.xml b/res/layout/preference_widget_master_checkbox.xml
new file mode 100644
index 0000000..e61839d
--- /dev/null
+++ b/res/layout/preference_widget_master_checkbox.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<CheckBox
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/checkboxWidget"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:layout_marginStart="?android:attr/listPreferredItemPaddingEnd"
+    android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:clickable="false" />
diff --git a/res/layout/private_dns_mode_dialog.xml b/res/layout/private_dns_mode_dialog.xml
index 16152a4..652bc63 100644
--- a/res/layout/private_dns_mode_dialog.xml
+++ b/res/layout/private_dns_mode_dialog.xml
@@ -14,43 +14,56 @@
      limitations under the License.
 -->
 
-<RadioGroup
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/private_dns_radio_group"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:padding="8dip">
+    android:orientation="vertical"
+    android:padding="8dp">
 
-    <RadioButton
-        android:id="@+id/private_dns_mode_off"
-        android:text="@string/private_dns_mode_off"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="8dip"/>
+    <RadioGroup
+        android:id="@+id/private_dns_radio_group"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
 
-    <RadioButton
-        android:id="@+id/private_dns_mode_opportunistic"
-        android:text="@string/private_dns_mode_opportunistic"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="8dip"/>
+        <RadioButton
+            android:id="@+id/private_dns_mode_off"
+            android:text="@string/private_dns_mode_off"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"/>
 
-    <RadioButton
-        android:id="@+id/private_dns_mode_provider"
-        android:text="@string/private_dns_mode_provider"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="8dip"/>
+        <RadioButton
+            android:id="@+id/private_dns_mode_opportunistic"
+            android:text="@string/private_dns_mode_opportunistic"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"/>
 
-    <EditText
-        android:id="@+id/private_dns_mode_provider_hostname"
-        android:hint="@string/private_dns_mode_provider_hostname_hint"
-        style="@android:style/Widget.CompoundButton.RadioButton"
-        android:imeOptions="actionDone"
-        android:inputType="textFilter|textUri"
+        <RadioButton
+            android:id="@+id/private_dns_mode_provider"
+            android:text="@string/private_dns_mode_provider"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"/>
+
+        <EditText
+            android:id="@+id/private_dns_mode_provider_hostname"
+            android:hint="@string/private_dns_mode_provider_hostname_hint"
+            style="@android:style/Widget.CompoundButton.RadioButton"
+            android:imeOptions="actionDone"
+            android:inputType="textFilter|textUri"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="40dp"
+            android:layout_marginEnd="8dp"/>
+    </RadioGroup>
+
+    <TextView
+        android:id="@+id/private_dns_help_info"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginStart="40dip"
-        android:layout_marginEnd="8dip"/>
-
-</RadioGroup>
+        android:layout_marginTop="16dp"
+        android:paddingStart="16dp"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+</LinearLayout>
diff --git a/res/layout/support_account_spinner_item.xml b/res/layout/support_account_spinner_item.xml
deleted file mode 100644
index fe37a85..0000000
--- a/res/layout/support_account_spinner_item.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/text1"
-    style="?android:attr/spinnerItemStyle"
-    android:singleLine="true"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:ellipsize="marquee"
-    android:textAppearance="?android:attr/textAppearanceSmall"
-    android:textAlignment="inherit"/>
diff --git a/res/layout/support_disclaimer_content.xml b/res/layout/support_disclaimer_content.xml
deleted file mode 100644
index 1e81f1a..0000000
--- a/res/layout/support_disclaimer_content.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<ScrollView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:padding="24dp">
-
-        <com.android.settingslib.widget.LinkTextView
-            android:id="@+id/support_disclaimer_text"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingBottom="24dp"/>
-
-        <CheckBox
-            android:id="@+id/support_disclaimer_do_not_show_again"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/support_disclaimer_do_not_show"
-            android:textColor="?android:attr/textColorSecondary"/>
-    </LinearLayout>
-</ScrollView>
diff --git a/res/layout/support_escalation_options.xml b/res/layout/support_escalation_options.xml
deleted file mode 100644
index ae208f1..0000000
--- a/res/layout/support_escalation_options.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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"
-    style="@style/SupportEscalationCard"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-    <TextView
-        android:id="@+id/tile_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:textAppearance="@style/TextAppearance.SupportTitle"/>
-    <TextView
-        android:id="@+id/tile_summary"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:paddingTop="8dp"
-        android:paddingBottom="30dp"
-        android:textAppearance="?android:attr/textAppearanceSmall"/>
-    <TextView
-        android:id="@+id/account_request_prefix"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:text="@string/support_account_request_prefix"
-        android:textAppearance="?android:attr/textAppearanceSmall"/>
-    <Spinner
-        android:id="@+id/account_spinner"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="5dp"
-        android:layout_marginStart="16dp"
-        android:gravity="center_horizontal"/>
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="30dp"
-        android:gravity="center_horizontal"
-        android:orientation="horizontal">
-        <LinearLayout
-            android:layout_width="0dp"
-            android:layout_weight="1"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="8dp"
-            android:gravity="center_horizontal"
-            android:orientation="vertical">
-            <Button
-                android:id="@android:id/text1"
-                style="@style/ActionPrimaryButton"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_margin="8dp"/>
-            <TextView
-                android:id="@+id/summary1"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="14dp"
-                android:textAppearance="?android:attr/textAppearanceSmall"/>
-        </LinearLayout>
-        <LinearLayout
-            android:layout_width="0dp"
-            android:layout_weight="1"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="8dp"
-            android:gravity="center_horizontal"
-            android:orientation="vertical">
-            <Button
-                android:id="@android:id/text2"
-                style="@style/ActionPrimaryButton"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_margin="8dp"/>
-            <TextView
-                android:id="@+id/summary2"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="14dp"
-                android:textAppearance="?android:attr/textAppearanceSmall"/>
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/support_fragment.xml b/res/layout/support_fragment.xml
deleted file mode 100644
index 6864d32..0000000
--- a/res/layout/support_fragment.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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:clipChildren="false"
-    android:clipToPadding="false"
-    android:focusable="false"
-    android:paddingStart="@dimen/dashboard_padding_start"
-    android:paddingEnd="@dimen/dashboard_padding_end">
-    <android.support.v7.widget.RecyclerView
-        android:id="@+id/support_items"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"/>
-</FrameLayout>
diff --git a/res/layout/support_offline_escalation_options.xml b/res/layout/support_offline_escalation_options.xml
deleted file mode 100644
index 09863d3..0000000
--- a/res/layout/support_offline_escalation_options.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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"
-    style="@style/SupportEscalationCard"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-    <TextView
-        android:id="@+id/tile_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:textAppearance="@style/TextAppearance.SupportTitle"/>
-    <TextView
-        android:id="@+id/tile_summary"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:paddingTop="8dp"
-        android:paddingBottom="10dp"
-        android:textAppearance="@style/TextAppearance.Small"
-        android:textColor="?android:attr/textColorSecondary"/>
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <TextView
-            android:id="@+id/support_text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingEnd="8dp"
-            android:text="@string/support_country_list_title"
-            android:textAppearance="@style/TextAppearance.Small"
-            android:textColor="?android:attr/textColorSecondary"/>
-        <Spinner
-            android:id="@+id/spinner"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:dropDownWidth="196dp"/>
-    </LinearLayout>
-    <Button
-        android:id="@android:id/text1"
-        style="@style/ActionPrimaryButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="8dp"
-        android:layoutDirection="ltr"/>
-    <Button
-        android:id="@android:id/text2"
-        style="@style/SupportSecondaryButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:minHeight="48dp"
-        android:visibility="gone"/>
-</LinearLayout>
diff --git a/res/layout/support_phone_dialog_content.xml b/res/layout/support_phone_dialog_content.xml
deleted file mode 100644
index ce6d2bb..0000000
--- a/res/layout/support_phone_dialog_content.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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="wrap_content"
-    android:orientation="vertical"
-    android:paddingStart="24dp"
-    android:paddingEnd="24dp"
-    android:paddingTop="12dp"
-    android:paddingBottom="12dp">
-    <TextView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingBottom="16dp"
-        android:text="@string/support_international_phone_summary"/>
-    <LinearLayout
-        android:id="@+id/phone_number_container"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="?android:attr/selectableItemBackground"
-        android:gravity="center_vertical"
-        android:minHeight="48dp"
-        android:orientation="horizontal">
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingEnd="32dp"
-            android:src="@drawable/ic_call_24dp"/>
-        <TextView
-            android:id="@+id/phone_number"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textAppearance="@style/TextAppearance.TileTitle"/>
-    </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/support_sign_in_button.xml b/res/layout/support_sign_in_button.xml
deleted file mode 100644
index 5bea068..0000000
--- a/res/layout/support_sign_in_button.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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"
-    style="@style/SupportEscalationCard"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-    <TextView
-        android:id="@+id/tile_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:textAppearance="@style/TextAppearance.SupportTitle"/>
-    <TextView
-        android:id="@+id/tile_summary"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:paddingTop="8dp"
-        android:paddingBottom="30dp"
-        android:textAppearance="@style/TextAppearance.Small"
-        android:textColor="?android:attr/textColorSecondary"/>
-    <Button
-        android:id="@android:id/text1"
-        style="@style/ActionPrimaryButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="8dp"/>
-    <Button
-        android:id="@android:id/text2"
-        style="@style/SupportSecondaryButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
-        android:minHeight="48dp"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/support_tile.xml b/res/layout/support_tile.xml
deleted file mode 100644
index a42faf0..0000000
--- a/res/layout/support_tile.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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="wrap_content"
-    android:background="?android:attr/selectableItemBackground"
-    android:gravity="center_vertical"
-    android:minHeight="@dimen/support_tile_min_height"
-    android:orientation="horizontal">
-    <ImageView
-        android:id="@android:id/icon"
-        android:layout_width="@dimen/dashboard_tile_image_size"
-        android:layout_height="@dimen/dashboard_tile_image_size"
-        android:scaleType="centerInside"
-        android:layout_marginStart="@dimen/dashboard_tile_image_margin"
-        android:layout_marginEnd="@dimen/dashboard_tile_image_margin"/>
-    <TextView
-        android:id="@+id/tile_title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:maxLines="2"
-        android:textAppearance="@style/TextAppearance.TileTitle"
-        android:ellipsize="end"
-        android:fadingEdge="horizontal"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/support_tile_spacer.xml b/res/layout/support_tile_spacer.xml
deleted file mode 100644
index aa86e1e..0000000
--- a/res/layout/support_tile_spacer.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2016 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.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/support_spacer_height"/>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index aa8a586..dbcfee1 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -309,6 +309,24 @@
         <item>Never time out</item>
     </string-array>
 
+    <!-- Bluetooth developer settings: Titles for maximum number of connected audio devices -->
+    <string-array name="bluetooth_max_connected_audio_devices">
+        <item>1 (Default)</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+    </string-array>
+
+    <!-- Bluetooth developer settings: Values for maximum number of connected audio devices -->
+    <string-array name="bluetooth_max_connected_audio_devices_values">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+    </string-array>
+
     <!-- Match this with drawable.wifi_signal. --> <skip />
     <!-- Wi-Fi settings. The signal strength a Wi-Fi network has. -->
     <string-array name="wifi_signal">
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 6df9d6c..687d5bd 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -80,4 +80,7 @@
 
     <!-- Whether accessibility shortcut preference should be shown or not. -->
     <bool name="config_show_accessibility_shortcut_preference">true</bool>
+
+    <!-- Whether assist_and_voice_input should be shown or not. -->
+    <bool name="config_show_assist_and_voice_input">true</bool>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ef4d269..557318b 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -279,17 +279,8 @@
     <dimen name="gestures_play_button_size">36dp</dimen>
     <dimen name="gesture_animation_padding">0dp</dimen>
 
-    <!-- Support tile minimum height -->
-    <dimen name="support_tile_min_height">48dp</dimen>
-    <!-- support spacer layout height -->
-    <dimen name="support_spacer_height">8dp</dimen>
-
     <dimen name="password_requirement_textsize">14sp</dimen>
 
-    <!-- Padding for the escalation card in normal dimens -->
-    <dimen name="support_escalation_card_padding_start">40dp</dimen>
-    <dimen name="support_escalation_card_padding_end">40dp</dimen>
-
     <!-- Padding between the donut and the storage summary. -->
     <dimen name="storage_summary_padding_end">16dp</dimen>
     <!-- Text size of the big number in the donut. -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ace024b..74737ad 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -396,6 +396,11 @@
     <!-- Summary for bluetooth item in connection detail page -->
     <string name="bluetooth_pref_summary">Allow device to pair and connect to bluetooth devices</string>
 
+    <!-- Setting Checkbox title for disabling Bluetooth inband ringing in Development Settings -->
+    <string name="bluetooth_disable_inband_ringing">Disable in-band ringing</string>
+    <!-- Summary of checkbox for disabling Bluetooth inband ringing in Development Settings -->
+    <string name="bluetooth_disable_inband_ringing_summary">Don’t play custom phone ringtones on Bluetooth headsets</string>
+
     <!-- Title for connected device group [CHAR LIMIT=none]-->
     <string name="connected_device_connected_title">Currently connected</string>
     <!-- Title for connected device group [CHAR LIMIT=none]-->
@@ -1624,6 +1629,11 @@
     <!-- Bluetooth settings.  Dock Setting Dialog - Remember setting and don't ask user again -->
     <string name="bluetooth_dock_settings_remember">Remember settings</string>
 
+    <!-- Bluetooth developer settings: Maximum number of connected audio devices -->
+    <string name="bluetooth_max_connected_audio_devices_string">Maximum connected Bluetooth audio devices</string>
+    <!-- Bluetooth developer settings: Maximum number of connected audio devices -->
+    <string name="bluetooth_max_connected_audio_devices_dialog_title">Select maximum number of connected Bluetooth audio devices</string>
+
     <!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
     <string name="wifi_display_settings_title">Cast</string>
     <!-- Wifi Display settings. The title of a menu item to enable wireless display [CHAR LIMIT=40] -->
@@ -2264,7 +2274,8 @@
     <string name="emergency_address_title">Emergency Address</string>
     <!-- Summary of Update Emergency Address preference, explaining usage of emergency address [CHAR LIMIT=NONE] -->
     <string name="emergency_address_summary">Used as your location when you make an emergency call over Wi\u2011Fi</string>
-
+    <!-- Message of private dns that provides a help link. [CHAR LIMIT=NONE] -->
+    <string name="private_dns_help_message"><annotation id="url">Learn more</annotation> about Private DNS features</string>
 
     <!-- Sound and alerts settings -->
     <skip/>
@@ -6336,6 +6347,7 @@
     <string name="help_url_icc_lock" translatable="false"></string>
     <string name="help_uri_process_stats_summary" translatable="false"></string>
     <string name="help_uri_process_stats_apps" translatable="false"></string>
+    <string name="help_uri_private_dns" translatable="false"></string>
 
     <!-- User account title [CHAR LIMIT=30] -->
     <string name="user_account_title">Account for content</string>
@@ -8643,93 +8655,6 @@
     <!-- [CHAR LIMIT=60] Name of dev option to enable extra quick settings tiles -->
     <string name="quick_settings_developer_tiles">Quick settings developer tiles</string>
 
-    <!-- Title text for connecting to customer support [CHAR LIMIT=80]-->
-    <string name="support_escalation_title">We\'re here to help</string>
-
-    <!-- Title text for connecting to 24/7 available customer support [CHAR LIMIT=80]-->
-    <string name="support_escalation_24_7_title">We\'re here for you 24/7</string>
-
-    <!-- Content description for connecting customer support. The "24 7" part indicates
-    support is available 24 hours a day, 7 days a week. It's used by screenreaders so it
-    cannot contain any symbol other that space. [CHAR LIMIT=80]-->
-    <string name="support_escalation_24_7_content_description">We\'re here for you 24 7</string>
-
-    <!-- Summary text for connecting to customer support [CHAR LIMIT=NONE]-->
-    <string name="support_escalation_summary">Our support team is here to help address any issue</string>
-
-    <!-- Summary text for connecting to 24/7 customer support [CHAR LIMIT=NONE]-->
-    <string name="support_escalation_24_7_summary">Our support team is available all day, every day</string>
-
-    <!-- Summary text when customer support is closed. [CHAR LIMIT=NONE]-->
-    <string name="support_escalation_closed_summary">Search help or come back during support hours (local time):&lt;br&gt;&lt;b&gt;<xliff:g id="operation_hours">%s</xliff:g>&lt;/b&gt;</string>
-
-    <!-- Summary text to call customer support when there is no internet. [CHAR LIMIT=NONE]-->
-    <string name="support_escalation_no_internet_summary">Phone support hours (local time)&lt;br&gt;&lt;b&gt;<xliff:g id="operation_hours">%s</xliff:g>&lt;/b&gt;</string>
-
-    <!-- Summary text when customer support is unavailable in the region. [CHAR LIMIT=NONE]-->
-    <string name="support_escalation_unavailable_summary">Search help or explore tips &amp; tricks</string>
-
-    <!-- Template for formatting support hours eg Mon - Fri, 8:00 AM - 19:30 PM. [CHAR LIMIT=NONE]-->
-    <string name="support_hour_format" translatable="false">
-        <xliff:g id="start_day">%1$s</xliff:g> - <xliff:g id="end_day">%2$s</xliff:g>, <xliff:g id="start_time">%3$s</xliff:g> - <xliff:g id="end_time">%4$s</xliff:g>&lt;br&gt;
-    </string>
-
-    <!-- Button label for choosing country for phone support. [CHAR LIMIT=40]-->
-    <string name="support_country_list_title">Support for:</string>
-
-    <!-- Template for formatting country and language. eg Canada - French [CHAR LIMIT=NONE]-->
-    <string name="support_country_format"><xliff:g id="country" example="Canada">%1$s</xliff:g> - <xliff:g id="language" example="French">%2$s</xliff:g></string>
-
-    <!-- Template for formatting phone number and language. eg English (800-000-0000) [CHAR LIMIT=NONE]-->
-    <string name ="support_phone_international_format">
-        <xliff:g id="language" example="English">%1$s</xliff:g> (<xliff:g id="phone" example="800-000-0000">%2$s</xliff:g>)
-    </string>
-
-    <!-- Title text for a list of international support phone numbers. [CHAR LIMIT=60]-->
-    <string name="support_international_phone_title">Traveling abroad?</string>
-
-    <!-- Description text warning international phone charge may apply when dialing support numbers. [CHAR LIMIT=NONE]-->
-    <string name="support_international_phone_summary">International charges may apply</string>
-
-    <!-- Button label for contacting customer support by phone [CHAR LIMIT=20]-->
-    <string name="support_escalation_by_phone">Phone</string>
-
-    <!-- Button label for contacting customer support by chat [CHAR LIMIT=20]-->
-    <string name="support_escalation_by_chat">Chat</string>
-
-    <!-- Button label for visiting the tips & tricks site [CHAR LIMIT=60]-->
-    <string name="support_tips_and_tricks_title">Explore tips &amp; tricks</string>
-
-    <!-- Button label for visiting help and/or send feedback [CHAR LIMIT=60]-->
-    <string name="support_help_feedback_title">Search help &amp; send feedback</string>
-
-    <!-- Title text that indicates user needs to sign in to get customer support. [CHAR LIMIT=80]-->
-    <string name="support_sign_in_required_title">Contact support</string>
-
-    <!-- Summary text that indicates user needs to sign-in to get real time customer support. [CHAR LIMIT=NONE]-->
-    <string name="support_sign_in_required_summary" translatable="false"></string>
-
-    <!-- Button label for signing in an account [CHAR LIMIT=40]-->
-    <string name="support_sign_in_button_text">Sign in</string>
-
-    <!-- Button label that redirects user who needs help for signin to help screen [CHAR LIMIT=NONE]-->
-    <string name="support_sign_in_required_help">Can\'t sign in?</string>
-
-    <!-- Dialog title displayed before initiating real time support [CHAR LIMIT=80]-->
-    <string name="support_disclaimer_title">Send system information</string>
-
-    <!-- Checkbox text, when checked dialog will not show again [CHAR LIMIT=80] -->
-    <string name="support_disclaimer_do_not_show">Do not show again</string>
-
-    <!-- Prefix text for the account picker, e.g. "Requesting as user@gmail.com" [CHAR LIMIT=60] -->
-    <string name="support_account_request_prefix">Requesting as</string>
-
-    <!-- Spinner dropdown text, when selected will try to add account [CHAR LIMIT=60] -->
-    <string name="support_account_picker_add_account">Add account</string>
-
-    <!-- Title for the dialog containing system information shown [CHAR LIMIT=30] -->
-    <string name="support_system_information_title">System information</string>
-
     <!-- [CHAR LIMIT=60] Title of work profile setting page -->
     <string name="managed_profile_settings_title">Work profile settings</string>
     <!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
@@ -8755,9 +8680,6 @@
         <item quantity="other"><xliff:g id="number" example="7">%s</xliff:g> seconds</item>
     </plurals>
 
-    <!-- Estimated wait time range for real time supports -->
-    <string name="support_estimated_wait_time">~<xliff:g id="ESTIMATE" example="2 minutes">%1$s</xliff:g> wait</string>
-
     <!-- Used as title on the automatic storage manager settings. [CHAR LIMIT=60] -->
     <string name="automatic_storage_manager_settings">Manage storage</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a07bade..579ee48 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -330,19 +330,6 @@
         <item name="android:textColor">?android:attr/colorError</item>
     </style>
 
-    <style name="TextAppearance.SupportTitle"
-           parent="@android:style/TextAppearance.Material.Subhead">
-        <item name="android:textColor">?android:attr/colorAccent</item>
-        <item name="android:textSize">24sp</item>
-    </style>
-
-    <style name="TextAppearance.SupportSummary" parent="TextAppearance.CategoryTitle"/>
-
-    <style name="SupportSecondaryButton"
-           parent="android:Widget.DeviceDefault.Button.Borderless.Colored">
-        <item name="android:textSize">12sp</item>
-    </style>
-
     <style name="FingerprintLayoutTheme">
         <item name="android:icon">@drawable/ic_fingerprint_header</item>
     </style>
@@ -386,14 +373,6 @@
         <item name="android:textAppearance">@android:style/TextAppearance.Material.Subhead</item>
     </style>
 
-    <style name="SupportEscalationCard">
-        <item name="android:background">?android:attr/colorSecondary</item>
-        <item name="android:gravity">center</item>
-        <item name="android:minHeight">368dp</item>
-        <item name="android:paddingStart">@dimen/support_escalation_card_padding_start</item>
-        <item name="android:paddingEnd">@dimen/support_escalation_card_padding_end</item>
-    </style>
-
     <style name="FingerprintHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
         <item name="android:paddingTop">16dp</item>
         <item name="android:textColor">@color/primary_dark_material_light</item>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 60efcab..aad5d23 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -240,9 +240,9 @@
             android:summary="@string/bluetooth_disable_absolute_volume_summary"/>
 
         <SwitchPreference
-            android:key="bluetooth_enable_inband_ringing"
-            android:title="@string/bluetooth_enable_inband_ringing"
-            android:summary="@string/bluetooth_enable_inband_ringing_summary"/>
+            android:key="bluetooth_disable_inband_ringing"
+            android:title="@string/bluetooth_disable_inband_ringing"
+            android:summary="@string/bluetooth_disable_inband_ringing_summary"/>
 
         <ListPreference
             android:key="bluetooth_select_avrcp_version"
@@ -286,6 +286,13 @@
             android:entries="@array/bluetooth_a2dp_codec_ldac_playback_quality_titles"
             android:entryValues="@array/bluetooth_a2dp_codec_ldac_playback_quality_values" />
 
+        <ListPreference
+                android:key="bluetooth_max_connected_audio_devices"
+                android:title="@string/bluetooth_max_connected_audio_devices_string"
+                android:dialogTitle="@string/bluetooth_max_connected_audio_devices_dialog_title"
+                android:entries="@array/bluetooth_max_connected_audio_devices"
+                android:entryValues="@array/bluetooth_max_connected_audio_devices_values" />
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="debug_input_category"
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index 0aec18f..5d6c9e9 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -31,23 +31,7 @@
         android:layout="@layout/preference_category_no_title"/>
 
     <PreferenceCategory
-        android:key="device_usage_list">
-
-        <com.android.settings.fuelgauge.PowerGaugePreference
-            android:key="last_full_charge"
-            android:title="@string/battery_last_full_charge"
-            android:selectable="false"/>
-
-        <com.android.settings.fuelgauge.PowerGaugePreference
-            android:key="screen_usage"
-            android:title="@string/device_screen_usage"
-            android:selectable="false"/>
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="power_management"
-        android:title="@string/battery_power_management">
+        android:key="power_management">
 
         <com.android.settings.widget.MasterSwitchPreference
             android:fragment="com.android.settings.fuelgauge.BatterySaverSettings"
@@ -59,26 +43,20 @@
             android:title="@string/battery_percentage"
             android:summary="@string/battery_percentage_description"/>
 
-        <!-- Cross-listed item, if you change this, also change it in display_settings.xml -->
-        <SwitchPreference
-            android:key="auto_brightness_battery"
-            android:title="@string/auto_brightness_title"
-            android:summary="@string/auto_brightness_summary"
-            settings:keywords="@string/keywords_display_auto_brightness"/>
+    </PreferenceCategory>
 
-        <!-- Cross-listed item, if you change this, also change it in display_settings.xml -->
-        <com.android.settings.TimeoutListPreference
-            android:key="screen_timeout_battery"
-            android:title="@string/screen_timeout"
-            android:summary="@string/screen_timeout_summary"
-            android:entries="@array/screen_timeout_entries"
-            android:entryValues="@array/screen_timeout_values"/>
+    <PreferenceCategory
+        android:key="device_usage_list">
 
-        <!-- Cross-listed item, if you change this, also change it in display_settings.xml -->
-        <Preference
-            android:key="ambient_display_battery"
-            android:title="@string/ambient_display_screen_title"
-            android:fragment="com.android.settings.display.AmbientDisplaySettings" />
+        <com.android.settings.fuelgauge.PowerGaugePreference
+            android:key="last_full_charge"
+            android:title="@string/battery_last_full_charge"
+            android:selectable="false"/>
+
+        <com.android.settings.fuelgauge.PowerGaugePreference
+            android:key="screen_usage"
+            android:title="@string/device_screen_usage"
+            android:selectable="false"/>
 
     </PreferenceCategory>
 
diff --git a/res/xml/security_settings_v2.xml b/res/xml/security_settings_v2.xml
index 86f542c..571e51f 100644
--- a/res/xml/security_settings_v2.xml
+++ b/res/xml/security_settings_v2.xml
@@ -47,6 +47,7 @@
         <Preference
             android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
+            android:summary="@string/summary_placeholder"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment" />
 
         <Preference
@@ -77,6 +78,7 @@
 
         <SwitchPreference
             android:key="visiblepattern_profile"
+            android:summary="@string/summary_placeholder"
             android:title="@string/lockpattern_settings_enable_visible_pattern_title_profile" />
 
         <Preference
@@ -95,8 +97,8 @@
         <Preference
             android:key="location"
             android:title="@string/location_settings_title"
-            android:fragment="com.android.settings.location.LocationSettings">
-        </Preference>
+            android:summary="@string/summary_placeholder"
+            android:fragment="com.android.settings.location.LocationSettings" />
 
         <SwitchPreference
             android:key="show_password"
@@ -109,15 +111,17 @@
         android:order="40"
         android:key="security_settings_device_admin_category">
 
-        <Preference android:key="manage_device_admin"
-                    android:title="@string/manage_device_admin"
-                    android:persistent="false"
-                    android:fragment="com.android.settings.DeviceAdminSettings" />
+        <Preference
+            android:key="manage_device_admin"
+            android:title="@string/manage_device_admin"
+            android:summary="@string/summary_placeholder"
+            android:fragment="com.android.settings.DeviceAdminSettings" />
 
-        <Preference android:key="enterprise_privacy"
-                    android:title="@string/enterprise_privacy_settings"
-                    android:persistent="false"
-                    android:fragment="com.android.settings.enterprise.EnterprisePrivacySettings" />
+        <Preference
+            android:key="enterprise_privacy"
+            android:title="@string/enterprise_privacy_settings"
+            android:summary="@string/summary_placeholder"
+            android:fragment="com.android.settings.enterprise.EnterprisePrivacySettings" />
 
     </PreferenceCategory>
 
@@ -144,7 +148,7 @@
         android:order="70"
         android:key="manage_trust_agents"
         android:title="@string/manage_trust_agents"
-        android:persistent="false"
+        android:summary="@string/summary_placeholder"
         android:fragment="com.android.settings.security.trustagent.TrustAgentSettings" />
 
     <Preference
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index d21a061..505977d 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -162,7 +162,6 @@
         }
     }
     public static class WebViewAppPickerActivity extends SettingsActivity { /* empty */ }
-    public static class LegacySupportActivity extends SettingsActivity{ /* empty */ }
 
     // Top level categories for new IA
     public static class NetworkDashboardActivity extends SettingsActivity {}
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 6b0a5b8..cd64799 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1222,7 +1222,7 @@
 
     public static FingerprintManager getFingerprintManagerOrNull(Context context) {
         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
-            return context.getSystemService(FingerprintManager.class);
+            return (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
         } else {
             return null;
         }
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
index cba08c8..f78548b 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
@@ -26,6 +26,7 @@
 import android.support.annotation.VisibleForTesting;
 
 import com.android.internal.app.AssistUtils;
+import com.android.settings.R;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
 
@@ -73,7 +74,7 @@
 
     @Override
     public boolean isAvailable() {
-        return true;
+        return mContext.getResources().getBoolean(R.bool.config_show_assist_and_voice_input);
     }
 
     @Override
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 4c861fb..664dda8 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -59,7 +59,6 @@
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
-import com.android.settings.dashboard.SupportFragment;
 import com.android.settings.datausage.DataPlanUsageSummary;
 import com.android.settings.datausage.DataUsageList;
 import com.android.settings.datausage.DataUsageSummary;
@@ -242,7 +241,6 @@
             NightDisplaySettings.class.getName(),
             ManageDomainUrls.class.getName(),
             AutomaticStorageManagerSettings.class.getName(),
-            SupportFragment.class.getName(),
             StorageDashboardFragment.class.getName(),
             SystemDashboardFragment.class.getName(),
             NetworkDashboardFragment.class.getName(),
@@ -270,6 +268,7 @@
             Settings.PowerUsageSummaryLegacyActivity.class.getName(),
             Settings.UserAndAccountDashboardActivity.class.getName(),
             Settings.SecuritySettingsActivity.class.getName(),
+            Settings.SecuritySettingsActivityV2.class.getName(),
             Settings.AccessibilitySettingsActivity.class.getName(),
             Settings.SystemDashboardActivity.class.getName(),
             SupportDashboardActivity.class.getName(),
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 9ef38b8..048f6ed 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -218,6 +218,10 @@
             preference.setSummary(tile.summary);
         } else if (tile.metaData != null
                 && tile.metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
+            // Set a placeholder summary before  starting to fetch real summary, this is necessary
+            // to avoid preference height change.
+            preference.setSummary(R.string.summary_placeholder);
+
             ThreadUtils.postOnBackgroundThread(() -> {
                 final Map<String, IContentProvider> providerMap = new ArrayMap<>();
                 final String uri = tile.metaData.getString(META_DATA_PREFERENCE_SUMMARY_URI);
diff --git a/src/com/android/settings/dashboard/SupportFragment.java b/src/com/android/settings/dashboard/SupportFragment.java
deleted file mode 100644
index fcc9f78..0000000
--- a/src/com/android/settings/dashboard/SupportFragment.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2016 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.dashboard;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.OnAccountsUpdateListener;
-import android.app.Activity;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.NetworkRequest;
-import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.InstrumentedFragment;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.overlay.SupportFeatureProvider;
-import com.android.settingslib.utils.ThreadUtils;
-
-/**
- * Fragment for support tab in SettingsGoogle.
- */
-public final class SupportFragment extends InstrumentedFragment implements View.OnClickListener,
-        OnAccountsUpdateListener {
-
-    private final ConnectivityManager.NetworkCallback mNetworkCallback =
-            new ConnectivityManager.NetworkCallback() {
-
-                @Override
-                public void onCapabilitiesChanged(Network network,
-                        NetworkCapabilities capabilities) {
-                    postConnectivityChanged();
-                }
-
-                @Override
-                public void onAvailable(Network network) {
-                    postConnectivityChanged();
-                }
-
-                @Override
-                public void onLost(Network network) {
-                    postConnectivityChanged();
-                }
-            };
-
-    private Activity mActivity;
-    private View mContent;
-    private RecyclerView mRecyclerView;
-    private SupportItemAdapter mSupportItemAdapter;
-    private AccountManager mAccountManager;
-    private SupportFeatureProvider mSupportFeatureProvider;
-    private ConnectivityManager mConnectivityManager;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.SUPPORT_FRAGMENT;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setHasOptionsMenu(true);
-        mActivity = getActivity();
-        mAccountManager = AccountManager.get(mActivity);
-        mSupportFeatureProvider =
-                FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity);
-        mSupportItemAdapter = new SupportItemAdapter(mActivity, savedInstanceState,
-                mSupportFeatureProvider, mMetricsFeatureProvider, this /* itemClickListener */);
-        mConnectivityManager =
-                (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        mContent = inflater.inflate(R.layout.support_fragment, container, false);
-        mRecyclerView = (RecyclerView) mContent.findViewById(R.id.support_items);
-        mRecyclerView.setLayoutManager(new LinearLayoutManager(
-                getActivity(), LinearLayoutManager.VERTICAL, false /* reverseLayout */));
-        mRecyclerView.setAdapter(mSupportItemAdapter);
-        return mContent;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        // Monitor account change.
-        mAccountManager.addOnAccountsUpdatedListener(
-                this /* listener */, null /* handler */, true /* updateImmediately */);
-        // Monitor connectivity
-        mConnectivityManager.registerNetworkCallback(
-                new NetworkRequest.Builder()
-                        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                        .build(),
-                mNetworkCallback);
-        mSupportItemAdapter.setHasInternet(hasInternet());
-        mSupportItemAdapter.refreshData();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        // Stop monitor account change.
-        mAccountManager.removeOnAccountsUpdatedListener(this /* listener */);
-        // Stop monitor connectivity.
-        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        mSupportItemAdapter.onSaveInstanceState(outState);
-    }
-
-    @Override
-    public void onAccountsUpdated(Account[] accounts) {
-        // Account changed, update support items.
-        mSupportItemAdapter.setAccounts(
-                mSupportFeatureProvider.getSupportEligibleAccounts(mActivity));
-    }
-
-    @Override
-    public void onClick(View v) {
-        final SupportItemAdapter.ViewHolder vh =
-                (SupportItemAdapter.ViewHolder) mRecyclerView.getChildViewHolder(v);
-        mSupportItemAdapter.onItemClicked(vh.getAdapterPosition());
-    }
-
-    private void postConnectivityChanged() {
-        ThreadUtils.postOnMainThread(() -> {
-            if (mSupportItemAdapter != null) {
-                mSupportItemAdapter.setHasInternet(hasInternet());
-            }
-        });
-    }
-
-    private boolean hasInternet() {
-        final NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo();
-        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
-    }
-}
diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java
deleted file mode 100644
index 54c5ae6..0000000
--- a/src/com/android/settings/dashboard/SupportItemAdapter.java
+++ /dev/null
@@ -1,823 +0,0 @@
-/*
- * Copyright (C) 2016 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.dashboard;
-
-import android.accounts.Account;
-import android.annotation.DrawableRes;
-import android.annotation.LayoutRes;
-import android.annotation.StringRes;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.util.ArrayUtils;
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.overlay.SupportFeatureProvider;
-import com.android.settings.support.SupportDisclaimerDialogFragment;
-import com.android.settings.support.SupportPhone;
-import com.android.settings.support.SupportPhoneDialogFragment;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static com.android.settings.overlay.SupportFeatureProvider.SupportType.CHAT;
-import static com.android.settings.overlay.SupportFeatureProvider.SupportType.PHONE;
-
-/**
- * Item adapter for support tiles.
- */
-public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAdapter.ViewHolder> {
-
-    private static final String STATE_SELECTED_COUNTRY = "STATE_SELECTED_COUNTRY";
-    private static final String ACCOUNT_SELECTED_INDEX = "ACCOUNT_SELECTED_INDEX";
-    private static final int TYPE_ESCALATION_OPTIONS = R.layout.support_escalation_options;
-    private static final int TYPE_ESCALATION_OPTIONS_OFFLINE =
-            R.layout.support_offline_escalation_options;
-    private static final int TYPE_SUPPORT_TILE = R.layout.support_tile;
-    private static final int TYPE_SUPPORT_TILE_SPACER = R.layout.support_tile_spacer;
-    private static final int TYPE_SIGN_IN_BUTTON = R.layout.support_sign_in_button;
-
-    private final Activity mActivity;
-    private final EscalationClickListener mEscalationClickListener;
-    private final OfflineSpinnerItemSelectListener mOfflineSpinnerItemSelectListener;
-    private final OnlineSpinnerItemSelectListener mOnlineSpinnerItemSelectListener;
-    private final SupportFeatureProvider mSupportFeatureProvider;
-    private final MetricsFeatureProvider mMetricsFeatureProvider;
-    private final View.OnClickListener mItemClickListener;
-    private final List<SupportData> mSupportData;
-
-    private String mSelectedCountry;
-    private boolean mHasInternet;
-    private Account[] mAccounts;
-    private int mSelectedAccountIndex;
-
-    public SupportItemAdapter(Activity activity, Bundle savedInstanceState,
-            SupportFeatureProvider supportFeatureProvider,
-            MetricsFeatureProvider metricsFeatureProvider,
-            View.OnClickListener itemClickListener) {
-        mActivity = activity;
-        mSupportFeatureProvider = supportFeatureProvider;
-        mMetricsFeatureProvider = metricsFeatureProvider;
-        mItemClickListener = itemClickListener;
-        mEscalationClickListener = new EscalationClickListener();
-        mOfflineSpinnerItemSelectListener = new OfflineSpinnerItemSelectListener();
-        mOnlineSpinnerItemSelectListener = new OnlineSpinnerItemSelectListener();
-        mSupportData = new ArrayList<>();
-        // Optimistically assume we have Internet access. It will be updated later to correct value.
-        mHasInternet = true;
-        if (savedInstanceState != null) {
-            mSelectedCountry = savedInstanceState.getString(STATE_SELECTED_COUNTRY);
-            mSelectedAccountIndex = savedInstanceState.getInt(ACCOUNT_SELECTED_INDEX);
-        } else {
-            mSelectedCountry = mSupportFeatureProvider.getCurrentCountryCodeIfHasConfig(PHONE);
-            mSelectedAccountIndex = 0;
-        }
-
-        mAccounts = mSupportFeatureProvider.getSupportEligibleAccounts(mActivity);
-        refreshData();
-    }
-
-    @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
-                viewType, parent, false));
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        final SupportData data = mSupportData.get(position);
-        switch (holder.getItemViewType()) {
-            case TYPE_SIGN_IN_BUTTON:
-                bindSignInPromoTile(holder, (EscalationData) data);
-                break;
-            case TYPE_ESCALATION_OPTIONS:
-                bindEscalationOptions(holder, (EscalationData) data);
-                break;
-            case TYPE_ESCALATION_OPTIONS_OFFLINE:
-                bindOfflineEscalationOptions(holder, (OfflineEscalationData) data);
-                break;
-            case TYPE_SUPPORT_TILE_SPACER:
-                break;
-            default:
-                bindSupportTile(holder, data);
-                break;
-        }
-    }
-
-    @Override
-    public int getItemViewType(int position) {
-        return mSupportData.get(position).type;
-    }
-
-    @Override
-    public int getItemCount() {
-        return mSupportData.size();
-    }
-
-    /**
-     * Called when a support item is clicked.
-     */
-    public void onItemClicked(int position) {
-        if (position >= 0 && position < mSupportData.size()) {
-            final SupportData data = mSupportData.get(position);
-            if (data.intent != null &&
-                    mActivity.getPackageManager().resolveActivity(data.intent, 0) != null) {
-                if (data.metricsEvent >= 0) {
-                    mMetricsFeatureProvider.action(mActivity, data.metricsEvent);
-                }
-                mActivity.startActivityForResult(data.intent, 0);
-            }
-        }
-    }
-
-    public void setHasInternet(boolean hasInternet) {
-        if (mHasInternet != hasInternet) {
-            mHasInternet = hasInternet;
-            refreshEscalationCards();
-        }
-    }
-
-    public void setAccounts(Account accounts[]) {
-        if (!Arrays.equals(mAccounts, accounts)) {
-            if (mAccounts.length == 0) {
-                mSelectedAccountIndex = 0;
-            } else {
-                final int index = ArrayUtils.indexOf(accounts, mAccounts[mSelectedAccountIndex]);
-                mSelectedAccountIndex = index != -1 ? index : 0;
-            }
-
-            mAccounts = accounts;
-            mSupportFeatureProvider.refreshOperationRules();
-            refreshEscalationCards();
-        }
-    }
-
-    public void onSaveInstanceState(Bundle outState) {
-        outState.putString(STATE_SELECTED_COUNTRY, mSelectedCountry);
-        outState.putInt(ACCOUNT_SELECTED_INDEX, mSelectedAccountIndex);
-    }
-
-    /**
-     * Create data for the adapter. If there is already data in the adapter, they will be
-     * destroyed and recreated.
-     */
-    void refreshData() {
-        mSupportData.clear();
-        addEscalationCards();
-        addMoreHelpItems();
-        notifyDataSetChanged();
-    }
-
-    /**
-     * Adds 1 escalation card. Based on current phone state, the escalation card can display
-     * different content.
-     */
-    private void addEscalationCards() {
-        if (mAccounts.length == 0) {
-            addSignInPromo();
-        } else if (mHasInternet) {
-            addOnlineEscalationCards();
-        } else {
-            addOfflineEscalationCards();
-        }
-    }
-
-    /**
-     * Finds and refreshes escalation card data.
-     */
-    private void refreshEscalationCards() {
-        if (getItemCount() > 0) {
-            final int itemType = getItemViewType(0 /* position */);
-            if (itemType == TYPE_SIGN_IN_BUTTON
-                    || itemType == TYPE_ESCALATION_OPTIONS
-                    || itemType == TYPE_ESCALATION_OPTIONS_OFFLINE) {
-                mSupportData.remove(0 /* position */);
-                addEscalationCards();
-                notifyItemChanged(0 /* position */);
-            }
-        }
-    }
-
-    private void addOnlineEscalationCards() {
-        final boolean hasPhoneOperation =
-                mSupportFeatureProvider.isSupportTypeEnabled(mActivity, PHONE);
-        final boolean hasChatOperation =
-                mSupportFeatureProvider.isSupportTypeEnabled(mActivity, CHAT);
-        final EscalationData.Builder builder = new EscalationData.Builder(mActivity);
-        if (!hasPhoneOperation && !hasChatOperation) {
-            // No support at all.
-            builder.setTileTitle(R.string.support_escalation_title)
-                    .setTileSummary(R.string.support_escalation_unavailable_summary);
-        } else if (mSupportFeatureProvider.isAlwaysOperating(PHONE, null /* countryCode */)
-                || mSupportFeatureProvider.isAlwaysOperating(CHAT, null /* countryCode */)) {
-            // Support is available.
-            builder.setTileTitle(R.string.support_escalation_24_7_title)
-                    .setTileTitleDescription(R.string.support_escalation_24_7_content_description)
-                    .setTileSummary(mActivity.getString(R.string.support_escalation_24_7_summary));
-        } else if (mSupportFeatureProvider.isOperatingNow(PHONE)
-                || mSupportFeatureProvider.isOperatingNow(CHAT)) {
-            // Support is available now.
-            builder.setTileTitle(R.string.support_escalation_title)
-                    .setTileSummary(R.string.support_escalation_summary);
-        } else {
-            // Support is now temporarily unavailable.
-            builder.setTileTitle(R.string.support_escalation_title)
-                    .setTileSummary(
-                            mSupportFeatureProvider.getOperationHours(mActivity, PHONE, null,
-                                    true /* hasInternet */));
-        }
-        if (hasPhoneOperation) {
-            builder.setText1(R.string.support_escalation_by_phone)
-                    .setSummary1(mSupportFeatureProvider.getEstimatedWaitTime(mActivity, PHONE))
-                    .setEnabled1(mSupportFeatureProvider.isOperatingNow(PHONE));
-        }
-        if (hasChatOperation) {
-            builder.setText2(R.string.support_escalation_by_chat)
-                    .setSummary2(mSupportFeatureProvider.getEstimatedWaitTime(mActivity, CHAT))
-                    .setEnabled2(mSupportFeatureProvider.isOperatingNow(CHAT));
-        }
-        mSupportData.add(0 /* index */, builder.build());
-    }
-
-    private void addOfflineEscalationCards() {
-        final CharSequence operatingHours;
-        final boolean isPhoneSupportAlwaysOperating =
-                mSupportFeatureProvider.isAlwaysOperating(PHONE, mSelectedCountry);
-        if (isPhoneSupportAlwaysOperating) {
-            operatingHours = mActivity.getString(R.string.support_escalation_24_7_summary);
-        } else {
-            operatingHours = mSupportFeatureProvider.getOperationHours(mActivity,
-                    PHONE, mSelectedCountry, false /* hasInternet */);
-        }
-        mSupportData.add(0 /* index */, new OfflineEscalationData.Builder(mActivity)
-                .setCountries(mSupportFeatureProvider.getPhoneSupportCountries())
-                .setTollFreePhone(mSupportFeatureProvider.getSupportPhones(
-                        mSelectedCountry, true /* isTollFree */))
-                .setTolledPhone(mSupportFeatureProvider.getSupportPhones(
-                        mSelectedCountry, false /* isTollFree */))
-                .setTileTitle(isPhoneSupportAlwaysOperating
-                        ? R.string.support_escalation_24_7_title
-                        : R.string.support_escalation_title)
-                .setTileTitleDescription(isPhoneSupportAlwaysOperating
-                        ? R.string.support_escalation_24_7_content_description
-                        : R.string.support_escalation_title)
-                .setTileSummary(operatingHours)
-                .build());
-    }
-
-    private void addSignInPromo() {
-        mSupportData.add(0 /* index */, new EscalationData.Builder(mActivity, TYPE_SIGN_IN_BUTTON)
-                .setText1(R.string.support_sign_in_button_text)
-                .setText2(R.string.support_sign_in_required_help)
-                .setTileTitle(R.string.support_sign_in_required_title)
-                .setTileSummary(R.string.support_sign_in_required_summary)
-                .build());
-    }
-
-    private void addMoreHelpItems() {
-        mSupportData.add(new SupportData.Builder(mActivity, TYPE_SUPPORT_TILE_SPACER).build());
-        PackageManager packageManager = mActivity.getPackageManager();
-        Intent intent = mSupportFeatureProvider.getHelpIntent(mActivity);
-        if (packageManager.resolveActivity(intent, 0) != null) {
-            mSupportData.add(new SupportData.Builder(mActivity, TYPE_SUPPORT_TILE)
-                    .setIcon(R.drawable.ic_help_24dp)
-                    .setTileTitle(R.string.support_help_feedback_title)
-                    .setIntent(intent)
-                    .setMetricsEvent(MetricsProto.MetricsEvent.ACTION_SUPPORT_HELP_AND_FEEDBACK)
-                    .build());
-        }
-        intent = mSupportFeatureProvider.getTipsAndTricksIntent(mActivity);
-        if (packageManager.resolveActivity(intent, 0) != null) {
-            mSupportData.add(new SupportData.Builder(mActivity, TYPE_SUPPORT_TILE)
-                    .setIcon(R.drawable.ic_lightbulb_outline_24)
-                    .setTileTitle(R.string.support_tips_and_tricks_title)
-                    .setIntent(intent)
-                    .setMetricsEvent(MetricsProto.MetricsEvent.ACTION_SUPPORT_TIPS_AND_TRICKS)
-                    .build());
-        }
-    }
-
-    private void bindEscalationOptions(ViewHolder holder, EscalationData data) {
-        holder.tileTitleView.setText(data.tileTitle);
-        holder.tileTitleView.setContentDescription(data.tileTitleDescription);
-        holder.tileSummaryView.setText(data.tileSummary);
-        if (data.text1 == 0) {
-            holder.text1View.setVisibility(View.GONE);
-        } else {
-            holder.text1View.setText(data.text1);
-            holder.text1View.setOnClickListener(mEscalationClickListener);
-            holder.text1View.setEnabled(data.enabled1 && mHasInternet);
-            holder.text1View.setVisibility(View.VISIBLE);
-        }
-        if (TextUtils.isEmpty(data.text2)) {
-            holder.text2View.setVisibility(View.GONE);
-        } else {
-            holder.text2View.setText(data.text2);
-            holder.text2View.setOnClickListener(mEscalationClickListener);
-            holder.text2View.setEnabled(data.enabled2 && mHasInternet);
-            holder.text2View.setVisibility(View.VISIBLE);
-        }
-        if (holder.summary1View != null) {
-            holder.summary1View.setText(data.summary1);
-            holder.summary1View.setVisibility(mHasInternet && !TextUtils.isEmpty(data.summary1)
-                    ? View.VISIBLE : View.GONE);
-        }
-        if (holder.summary2View != null) {
-            holder.summary2View.setText(data.summary2);
-            holder.summary2View.setVisibility(mHasInternet && !TextUtils.isEmpty(data.summary2)
-                    ? View.VISIBLE : View.GONE);
-        }
-
-        bindAccountPicker(holder);
-    }
-
-    @VisibleForTesting
-    public void bindAccountPicker(ViewHolder holder) {
-        final Spinner spinner = (Spinner) holder.itemView.findViewById(R.id.account_spinner);
-
-        final ArrayAdapter<String> adapter = new ArrayAdapter(
-                mActivity, R.layout.support_account_spinner_item,
-                extractAccountNames(mAccounts));
-        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-        spinner.setAdapter(adapter);
-        spinner.setOnItemSelectedListener(mOnlineSpinnerItemSelectListener);
-        spinner.setSelection(mSelectedAccountIndex);
-    }
-
-    private void bindOfflineEscalationOptions(ViewHolder holder, OfflineEscalationData data) {
-        // Bind Title
-        holder.tileTitleView.setText(data.tileTitle);
-        holder.tileTitleView.setContentDescription(data.tileTitleDescription);
-        holder.tileSummaryView.setText(data.tileSummary);
-        // Bind spinner
-        final Spinner spinner = (Spinner) holder.itemView.findViewById(R.id.spinner);
-        final ArrayAdapter<String> adapter = new ArrayAdapter(
-                mActivity, android.R.layout.simple_spinner_dropdown_item, data.countries);
-        spinner.setAdapter(adapter);
-        final List<String> countryCodes = mSupportFeatureProvider.getPhoneSupportCountryCodes();
-        for (int i = 0; i < countryCodes.size(); i++) {
-            if (TextUtils.equals(countryCodes.get(i), mSelectedCountry)) {
-                spinner.setSelection(i);
-                break;
-            }
-        }
-        spinner.setOnItemSelectedListener(mOfflineSpinnerItemSelectListener);
-        // Bind buttons
-        if (data.tollFreePhone != null) {
-            holder.text1View.setText(data.tollFreePhone.number);
-            holder.text1View.setVisibility(View.VISIBLE);
-            holder.text1View.setOnClickListener(mEscalationClickListener);
-        } else {
-            holder.text1View.setVisibility(View.GONE);
-        }
-        if (data.tolledPhone != null) {
-            holder.text2View.setText(
-                    mActivity.getString(R.string.support_international_phone_title));
-            holder.text2View.setVisibility(View.VISIBLE);
-            holder.text2View.setOnClickListener(mEscalationClickListener);
-        } else {
-            holder.text2View.setVisibility(View.GONE);
-        }
-
-        if (ActivityManager.isUserAMonkey()) {
-            holder.text1View.setVisibility(View.GONE);
-            holder.text2View.setVisibility(View.GONE);
-            spinner.setVisibility(View.GONE);
-            holder.itemView.findViewById(R.id.support_text).setVisibility(View.GONE);
-        }
-    }
-
-    private void bindSignInPromoTile(ViewHolder holder, EscalationData data) {
-        holder.tileTitleView.setText(data.tileTitle);
-        holder.tileTitleView.setContentDescription(data.tileTitleDescription);
-        holder.tileSummaryView.setText(data.tileSummary);
-        holder.text1View.setText(data.text1);
-        holder.text2View.setText(data.text2);
-        holder.text1View.setOnClickListener(mEscalationClickListener);
-        holder.text2View.setOnClickListener(mEscalationClickListener);
-    }
-
-    private void bindSupportTile(ViewHolder holder, SupportData data) {
-        if (holder.iconView != null) {
-            holder.iconView.setImageResource(data.icon);
-        }
-        if (holder.tileTitleView != null) {
-            holder.tileTitleView.setText(data.tileTitle);
-            holder.tileTitleView.setContentDescription(data.tileTitleDescription);
-        }
-        if (holder.tileSummaryView != null) {
-            holder.tileSummaryView.setText(data.tileSummary);
-        }
-        holder.itemView.setOnClickListener(mItemClickListener);
-    }
-
-    /**
-     * Show a disclaimer dialog and start support action after disclaimer has been acknowledged.
-     */
-    private void tryStartDisclaimerAndSupport(final @SupportFeatureProvider.SupportType int type) {
-        if (mSupportFeatureProvider.shouldShowDisclaimerDialog(mActivity)) {
-            DialogFragment fragment = SupportDisclaimerDialogFragment.newInstance(
-                    mAccounts[mSelectedAccountIndex], type);
-            fragment.show(mActivity.getFragmentManager(), SupportDisclaimerDialogFragment.TAG);
-            return;
-        }
-        mSupportFeatureProvider.startSupport(mActivity, mAccounts[mSelectedAccountIndex], type);
-    }
-
-    private String[] extractAccountNames(Account[] accounts) {
-        String[] accountNames = new String[accounts.length+1];
-        for (int i = 0; i < accounts.length; i++) {
-            accountNames[i] = accounts[i].name;
-        }
-        accountNames[accounts.length] = mActivity.getString(
-                R.string.support_account_picker_add_account);
-
-        return accountNames;
-    }
-
-    /**
-     * Click handler for starting escalation options.
-     */
-    private final class EscalationClickListener implements View.OnClickListener {
-        @Override
-        public void onClick(final View v) {
-            if (mAccounts.length == 0) {
-                switch (v.getId()) {
-                    case android.R.id.text1:
-                        mMetricsFeatureProvider.action(mActivity,
-                                MetricsProto.MetricsEvent.ACTION_SUPPORT_SIGN_IN);
-                        mActivity.startActivityForResult(
-                                mSupportFeatureProvider.getAccountLoginIntent(),
-                                0 /* requestCode */);
-                        break;
-                    case android.R.id.text2:
-                        mActivity.startActivityForResult(
-                                mSupportFeatureProvider.getSignInHelpIntent(mActivity),
-                                0 /* requestCode */);
-                        break;
-                }
-            } else if (mHasInternet) {
-                switch (v.getId()) {
-                    case android.R.id.text1:
-                        mMetricsFeatureProvider.action(mActivity,
-                                MetricsProto.MetricsEvent.ACTION_SUPPORT_PHONE);
-                        tryStartDisclaimerAndSupport(PHONE);
-                        break;
-                    case android.R.id.text2:
-                        mMetricsFeatureProvider.action(mActivity,
-                                MetricsProto.MetricsEvent.ACTION_SUPPORT_CHAT);
-                        tryStartDisclaimerAndSupport(CHAT);
-                        break;
-                }
-            } else {
-                switch (v.getId()) {
-                    case android.R.id.text1: {
-                        final SupportPhone phone = mSupportFeatureProvider
-                                .getSupportPhones(mSelectedCountry, true /* isTollFree */);
-                        if (phone != null) {
-                            final Intent intent = phone.getDialIntent();
-                            final boolean canDial = !mActivity.getPackageManager()
-                                    .queryIntentActivities(intent, 0)
-                                    .isEmpty();
-                            if (canDial) {
-                                mMetricsFeatureProvider.action(mActivity,
-                                        MetricsProto.MetricsEvent.ACTION_SUPPORT_DAIL_TOLLFREE);
-                                mActivity.startActivity(intent);
-                            }
-                        }
-                        break;
-                    }
-                    case android.R.id.text2: {
-                        final SupportPhone phone = mSupportFeatureProvider
-                                .getSupportPhones(mSelectedCountry, false /* isTollFree */);
-                        final SupportPhoneDialogFragment fragment =
-                                SupportPhoneDialogFragment.newInstance(phone);
-                        mMetricsFeatureProvider.action(mActivity,
-                                MetricsProto.MetricsEvent.ACTION_SUPPORT_VIEW_TRAVEL_ABROAD_DIALOG);
-                        fragment.show(mActivity.getFragmentManager(),
-                                SupportPhoneDialogFragment.TAG);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    private final class OfflineSpinnerItemSelectListener
-            implements AdapterView.OnItemSelectedListener {
-
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-            final List<String> countryCodes = mSupportFeatureProvider.getPhoneSupportCountryCodes();
-            final String selectedCountry = countryCodes.get(position);
-            if (!TextUtils.equals(selectedCountry, mSelectedCountry)) {
-                mSelectedCountry = selectedCountry;
-                refreshEscalationCards();
-            }
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-            // Do nothing.
-        }
-    }
-
-    private final class OnlineSpinnerItemSelectListener
-            implements AdapterView.OnItemSelectedListener {
-
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-            if (position == mAccounts.length) {
-                mActivity.startActivity(mSupportFeatureProvider.getAccountLoginIntent());
-                // Make sure "Add account" is not shown as selected item
-                parent.setSelection(mSelectedAccountIndex);
-            } else if (position != mSelectedAccountIndex) {
-                mSelectedAccountIndex = position;
-            }
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-            // Do nothing.
-        }
-    }
-
-    /**
-     * {@link RecyclerView.ViewHolder} for support items.
-     */
-    static final class ViewHolder extends RecyclerView.ViewHolder {
-
-        final ImageView iconView;
-        final TextView tileTitleView;
-        final TextView tileSummaryView;
-        final TextView text1View;
-        final TextView text2View;
-        final TextView summary1View;
-        final TextView summary2View;
-
-        ViewHolder(View itemView) {
-            super(itemView);
-            iconView = (ImageView) itemView.findViewById(android.R.id.icon);
-            tileTitleView = (TextView) itemView.findViewById(R.id.tile_title);
-            tileSummaryView = (TextView) itemView.findViewById(R.id.tile_summary);
-            text1View = (TextView) itemView.findViewById(android.R.id.text1);
-            text2View = (TextView) itemView.findViewById(android.R.id.text2);
-            summary1View = (TextView) itemView.findViewById(R.id.summary1);
-            summary2View = (TextView) itemView.findViewById(R.id.summary2);
-        }
-    }
-
-    /**
-     * Data for a single support item.
-     */
-    @VisibleForTesting
-    static class SupportData {
-
-        final Intent intent;
-        final int metricsEvent;
-        @LayoutRes
-        final int type;
-        @DrawableRes
-        final int icon;
-        @StringRes
-        final int tileTitle;
-        final CharSequence tileTitleDescription;
-        final CharSequence tileSummary;
-
-
-        private SupportData(Builder builder) {
-            this.type = builder.mType;
-            this.icon = builder.mIcon;
-            this.tileTitle = builder.mTileTitle;
-            this.tileTitleDescription = builder.mTileTitleDescription;
-            this.tileSummary = builder.mTileSummary;
-            this.intent = builder.mIntent;
-            this.metricsEvent = builder.mMetricsEvent;
-        }
-
-        static class Builder {
-
-            protected final Context mContext;
-            @LayoutRes
-            private final int mType;
-            @DrawableRes
-            private int mIcon;
-            @StringRes
-            private int mTileTitle;
-            private CharSequence mTileTitleDescription;
-            private CharSequence mTileSummary;
-            private Intent mIntent;
-            private int mMetricsEvent = -1;
-
-            Builder(Context context, @LayoutRes int type) {
-                mContext = context;
-                mType = type;
-            }
-
-            Builder setIcon(@DrawableRes int icon) {
-                mIcon = icon;
-                return this;
-            }
-
-            Builder setTileTitle(@StringRes int title) {
-                mTileTitle = title;
-                return this;
-            }
-
-            Builder setTileTitleDescription(@StringRes int titleDescription) {
-                mTileTitleDescription = mContext.getString(titleDescription);
-                return this;
-            }
-
-            Builder setTileSummary(@StringRes int summary) {
-                mTileSummary = mContext.getString(summary);
-                return this;
-            }
-
-            Builder setTileSummary(CharSequence summary) {
-                mTileSummary = summary;
-                return this;
-            }
-
-            Builder setMetricsEvent(int metricsEvent) {
-                mMetricsEvent = metricsEvent;
-                return this;
-            }
-
-            Builder setIntent(Intent intent) {
-                mIntent = intent;
-                return this;
-            }
-
-            SupportData build() {
-                return new SupportData(this);
-            }
-        }
-    }
-
-    /**
-     * Data model for escalation cards.
-     */
-    @VisibleForTesting
-    static class EscalationData extends SupportData {
-
-        @StringRes
-        final int text1;
-        final CharSequence text2;
-        final boolean enabled1;
-        final boolean enabled2;
-        final CharSequence summary1;
-        final CharSequence summary2;
-
-        private EscalationData(Builder builder) {
-            super(builder);
-            this.text1 = builder.mText1;
-            this.text2 = builder.mText2;
-            this.summary1 = builder.mSummary1;
-            this.summary2 = builder.mSummary2;
-            this.enabled1 = builder.mEnabled1;
-            this.enabled2 = builder.mEnabled2;
-        }
-
-        static class Builder extends SupportData.Builder {
-
-            @StringRes
-            private int mText1;
-            private CharSequence mText2;
-            private CharSequence mSummary1;
-            private CharSequence mSummary2;
-            private boolean mEnabled1;
-            private boolean mEnabled2;
-
-            protected Builder(Context context, @LayoutRes int type) {
-                super(context, type);
-            }
-
-            Builder(Context context) {
-                this(context, TYPE_ESCALATION_OPTIONS);
-            }
-
-            Builder setEnabled1(boolean enabled) {
-                mEnabled1 = enabled;
-                return this;
-            }
-
-            Builder setText1(@StringRes int text1) {
-                mText1 = text1;
-                return this;
-            }
-
-            Builder setText2(@StringRes int text2) {
-                mText2 = mContext.getString(text2);
-                return this;
-            }
-
-            Builder setText2(CharSequence text2) {
-                mText2 = text2;
-                return this;
-            }
-
-            Builder setSummary1(String summary1) {
-                mSummary1 = summary1;
-                return this;
-            }
-
-            Builder setEnabled2(boolean enabled) {
-                mEnabled2 = enabled;
-                return this;
-            }
-
-            Builder setSummary2(String summary2) {
-                mSummary2 = summary2;
-                return this;
-            }
-
-            EscalationData build() {
-                return new EscalationData(this);
-            }
-        }
-    }
-
-    /**
-     * Support data for offline mode.
-     */
-    private static final class OfflineEscalationData extends EscalationData {
-
-        final List<String> countries;
-        final SupportPhone tollFreePhone;
-        final SupportPhone tolledPhone;
-
-        private OfflineEscalationData(Builder builder) {
-            super(builder);
-            countries = builder.mCountries;
-            tollFreePhone = builder.mTollFreePhone;
-            tolledPhone = builder.mTolledPhone;
-        }
-
-        static final class Builder extends EscalationData.Builder {
-
-            private List<String> mCountries;
-            private SupportPhone mTollFreePhone;
-            private SupportPhone mTolledPhone;
-
-            Builder(Context context) {
-                super(context, TYPE_ESCALATION_OPTIONS_OFFLINE);
-            }
-
-            Builder setCountries(List<String> countries) {
-                mCountries = countries;
-                return this;
-            }
-
-            Builder setTollFreePhone(SupportPhone phone) {
-                mTollFreePhone = phone;
-                return this;
-            }
-
-            Builder setTolledPhone(SupportPhone phone) {
-                mTolledPhone = phone;
-                return this;
-            }
-
-            OfflineEscalationData build() {
-                return new OfflineEscalationData(this);
-            }
-        }
-    }
-
-    @VisibleForTesting
-    List<SupportData> getSupportData() {
-        return mSupportData;
-    }
-}
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index fb8119c..34d18e9 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -24,8 +24,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
-import android.icu.text.MeasureFormat;
-import android.icu.util.MeasureUnit;
 import android.net.NetworkPolicy;
 import android.net.NetworkTemplate;
 import android.os.Bundle;
@@ -36,7 +34,6 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ArrayAdapter;
 import android.widget.EditText;
 import android.widget.NumberPicker;
 import android.widget.Spinner;
@@ -256,17 +253,6 @@
                     : editor.getPolicyWarningBytes(template);
             final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
 
-            final MeasureFormat formatter = MeasureFormat.getInstance(
-                    getContext().getResources().getConfiguration().locale,
-                    MeasureFormat.FormatWidth.SHORT);
-            final String[] unitNames = new String[] {
-                formatter.getUnitDisplayName(MeasureUnit.MEGABYTE),
-                formatter.getUnitDisplayName(MeasureUnit.GIGABYTE)
-            };
-            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
-                    getContext(), R.layout.data_usage_spinner_item, unitNames);
-            type.setAdapter(adapter);
-
             if (bytes > 1.5f * GB_IN_BYTES) {
                 final String bytesText = formatText(bytes / (float) GB_IN_BYTES);
                 bytesPicker.setText(bytesText);
diff --git a/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java b/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java
index db5a881..809db19 100644
--- a/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothInbandRingingPreferenceController.java
@@ -31,11 +31,11 @@
         DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
         PreferenceControllerMixin {
 
-    private static final String BLUETOOTH_ENABLE_INBAND_RINGING_KEY =
-            "bluetooth_enable_inband_ringing";
+    private static final String BLUETOOTH_DISABLE_INBAND_RINGING_KEY =
+            "bluetooth_disable_inband_ringing";
     @VisibleForTesting
-    static final String BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY =
-            "persist.bluetooth.enableinbandringing";
+    static final String BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY =
+            "persist.bluetooth.disableinbandringing";
 
     private SwitchPreference mPreference;
 
@@ -50,7 +50,7 @@
 
     @Override
     public String getPreferenceKey() {
-        return BLUETOOTH_ENABLE_INBAND_RINGING_KEY;
+        return BLUETOOTH_DISABLE_INBAND_RINGING_KEY;
     }
 
     @Override
@@ -62,16 +62,16 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final boolean isEnabled = (Boolean) newValue;
-        SystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
-                isEnabled ? "true" : "false");
+        final boolean isChecked = (Boolean) newValue;
+        SystemProperties.set(BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY,
+                isChecked ? "true" : "false");
         return true;
     }
 
     @Override
     public void updateState(Preference preference) {
         final boolean isEnabled = SystemProperties.getBoolean(
-                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, true /* default */);
+                BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY, false /* default */);
         mPreference.setChecked(isEnabled);
     }
 
@@ -83,9 +83,8 @@
     @Override
     protected void onDeveloperOptionsSwitchDisabled() {
         mPreference.setEnabled(false);
-        // the default setting for this preference is the enabled state
-        mPreference.setChecked(true);
-        SystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, "true");
+        mPreference.setChecked(false);
+        SystemProperties.set(BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY, "false");
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
new file mode 100644
index 0000000..5512685
--- /dev/null
+++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class BluetoothMaxConnectedAudioDevicesPreferenceController extends
+        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
+        PreferenceControllerMixin {
+
+    private static final String BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_KEY =
+            "bluetooth_max_connected_audio_devices";
+
+    @VisibleForTesting
+    static final String BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY =
+            "persist.bluetooth.maxconnectedaudiodevices";
+
+    private final String[] mListValues;
+    private final String[] mListSummaries;
+    private ListPreference mPreference;
+
+    public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) {
+        super(context);
+
+        mListValues = context.getResources()
+                .getStringArray(R.array.bluetooth_max_connected_audio_devices_values);
+        mListSummaries = context.getResources()
+                .getStringArray(R.array.bluetooth_max_connected_audio_devices);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_KEY;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (ListPreference) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, newValue.toString());
+        updateState(preference);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final String currentValue = SystemProperties.get(
+                BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
+        int index = 0; // Defaults to 1 device
+        for (int i = 0; i < mListValues.length; i++) {
+            if (TextUtils.equals(currentValue, mListValues[i])) {
+                index = i;
+                break;
+            }
+        }
+        mPreference.setValue(mListValues[index]);
+        mPreference.setSummary(mListSummaries[index]);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+        updateState(mPreference);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        mPreference.setEnabled(false);
+        SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, mListValues[0]);
+        mPreference.setValue(mListValues[0]);
+        mPreference.setSummary(mListSummaries[0]);
+    }
+}
+
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index e736798..a404bc0 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -417,6 +417,7 @@
                 bluetoothA2dpConfigStore));
         controllers.add(new BluetoothAudioQualityPreferenceController(context, lifecycle,
                 bluetoothA2dpConfigStore));
+        controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context));
         controllers.add(new ShowTapsPreferenceController(context));
         controllers.add(new PointerLocationPreferenceController(context));
         controllers.add(new ShowSurfaceUpdatesPreferenceController(context));
diff --git a/src/com/android/settings/security/FingerprintProfileStatusPreferenceController.java b/src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceController.java
similarity index 96%
rename from src/com/android/settings/security/FingerprintProfileStatusPreferenceController.java
rename to src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceController.java
index 1c72a46..68d2ade 100644
--- a/src/com/android/settings/security/FingerprintProfileStatusPreferenceController.java
+++ b/src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.security;
+package com.android.settings.fingerprint;
 
 import android.content.Context;
 import android.os.UserHandle;
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index 5d178d2..de7187c 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -25,12 +25,10 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
-import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -41,12 +39,7 @@
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.preference.PreferenceViewHolder;
-import android.text.Annotation;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
 import android.text.TextUtils;
-import android.text.style.URLSpan;
 import android.util.Log;
 import android.view.View;
 import android.view.WindowManager;
@@ -61,6 +54,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.password.ChooseLockGeneric;
 import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.utils.AnnotationSpan;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -103,6 +97,9 @@
 
     private static final long LOCKOUT_DURATION = 30000; // time we have to wait for fp to reset, ms
 
+    public static final String ANNOTATION_URL = "url";
+    public static final String ANNOTATION_ADMIN_DETAILS = "admin_details";
+
     public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
 
     @Override
@@ -162,6 +159,20 @@
         private FingerprintRemoveSidecar mRemovalSidecar;
         private HashMap<Integer, String> mFingerprintsRenaming;
 
+        final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo(
+                ANNOTATION_URL, (view) -> {
+            final Context context = view.getContext();
+            Intent intent = HelpUtils.getHelpIntent(context, getString(getHelpResource()),
+                    context.getClass().getName());
+            if (intent != null) {
+                try {
+                    view.startActivityForResult(intent, 0);
+                } catch (ActivityNotFoundException e) {
+                    Log.w(TAG, "Activity was not found for intent, " + intent.toString());
+                }
+            }
+        });
+
         FingerprintAuthenticateSidecar.Listener mAuthenticateListener =
             new FingerprintAuthenticateSidecar.Listener() {
                 @Override
@@ -346,10 +357,15 @@
             final FooterPreference pref = mFooterPreferenceMixin.createFooterPreference();
             final EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
                     activity, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT, mUserId);
-            pref.setTitle(LearnMoreSpan.linkify(getText(admin != null
-                            ? R.string.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled
+            final AnnotationSpan.LinkInfo adminLinkInfo = new AnnotationSpan.LinkInfo(
+                    ANNOTATION_ADMIN_DETAILS, (view) -> {
+                RestrictedLockUtils.sendShowAdminSupportDetailsIntent(activity, admin);
+            });
+            pref.setTitle(AnnotationSpan.linkify(getText(admin != null
+                            ? R.string
+                            .security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled
                             : R.string.security_settings_fingerprint_enroll_disclaimer),
-                    getString(getHelpResource()), admin));
+                    mUrlLinkInfo, adminLinkInfo));
         }
 
         protected void removeFingerprintPreference(int fingerprintId) {
@@ -906,74 +922,6 @@
         }
     }
 
-    private static class LearnMoreSpan extends URLSpan {
-        private static final String TAG = "LearnMoreSpan";
-        private static final Typeface TYPEFACE_MEDIUM =
-                Typeface.create("sans-serif-medium", Typeface.NORMAL);
-
-        private static final String ANNOTATION_URL = "url";
-        private static final String ANNOTATION_ADMIN_DETAILS = "admin_details";
-
-        private EnforcedAdmin mEnforcedAdmin = null;
-
-        private LearnMoreSpan(String url) {
-            super(url);
-        }
-
-        private LearnMoreSpan(EnforcedAdmin admin) {
-            super((String) null);
-            mEnforcedAdmin = admin;
-        }
-
-        @Override
-        public void onClick(View widget) {
-            Context ctx = widget.getContext();
-            if (mEnforcedAdmin != null) {
-                RestrictedLockUtils.sendShowAdminSupportDetailsIntent(ctx, mEnforcedAdmin);
-            } else {
-                Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName());
-                if (intent == null) {
-                    Log.w(LearnMoreSpan.TAG, "Null help intent.");
-                    return;
-                }
-                try {
-                    widget.startActivityForResult(intent, 0);
-                } catch (ActivityNotFoundException e) {
-                    Log.w(FingerprintSettingsFragment.TAG,
-                            "Actvity was not found for intent, " + intent.toString());
-                }
-            }
-        }
-
-        @Override
-        public void updateDrawState(TextPaint ds) {
-            super.updateDrawState(ds);
-            ds.setUnderlineText(false);
-            ds.setTypeface(TYPEFACE_MEDIUM);
-        }
-
-        public static CharSequence linkify(CharSequence rawText, String uri, EnforcedAdmin admin) {
-            SpannableString msg = new SpannableString(rawText);
-            Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
-            SpannableStringBuilder builder = new SpannableStringBuilder(msg);
-            for (Annotation annotation : spans) {
-                final String key = annotation.getValue();
-                int start = msg.getSpanStart(annotation);
-                int end = msg.getSpanEnd(annotation);
-                LearnMoreSpan link = null;
-                if (ANNOTATION_URL.equals(key)) {
-                    link = new LearnMoreSpan(uri);
-                } else if (ANNOTATION_ADMIN_DETAILS.equals(key)) {
-                    link = new LearnMoreSpan(admin);
-                }
-                if (link != null) {
-                    builder.setSpan(link, start, end, msg.getSpanFlags(link));
-                }
-            }
-            return builder;
-        }
-    }
-
     /**
      * @deprecated in favor of new SecuritySettings.
      */
diff --git a/src/com/android/settings/security/FingerprintStatusPreferenceController.java b/src/com/android/settings/fingerprint/FingerprintStatusPreferenceController.java
similarity index 95%
rename from src/com/android/settings/security/FingerprintStatusPreferenceController.java
rename to src/com/android/settings/fingerprint/FingerprintStatusPreferenceController.java
index 2985f40..19eb4bb 100644
--- a/src/com/android/settings/security/FingerprintStatusPreferenceController.java
+++ b/src/com/android/settings/fingerprint/FingerprintStatusPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.security;
+package com.android.settings.fingerprint;
 
 import android.content.Context;
 import android.content.Intent;
@@ -28,8 +28,6 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.fingerprint.FingerprintEnrollIntroduction;
-import com.android.settings.fingerprint.FingerprintSettings;
 import com.android.settings.overlay.FeatureFactory;
 
 import java.util.List;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index a5b6c08..0315f03 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -84,10 +84,6 @@
 
     private static final String KEY_SCREEN_USAGE = "screen_usage";
     private static final String KEY_TIME_SINCE_LAST_FULL_CHARGE = "last_full_charge";
-
-    private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness_battery";
-    private static final String KEY_SCREEN_TIMEOUT = "screen_timeout_battery";
-    private static final String KEY_AMBIENT_DISPLAY = "ambient_display_battery";
     private static final String KEY_BATTERY_SAVER_SUMMARY = "battery_saver_summary";
 
     @VisibleForTesting
@@ -272,14 +268,9 @@
         mBatteryTipPreferenceController = new BatteryTipPreferenceController(context,
                 KEY_BATTERY_TIP, this);
         controllers.add(mBatteryTipPreferenceController);
-        controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS));
-        controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT));
         controllers.add(new BatterySaverController(context, getLifecycle()));
         controllers.add(new BatteryPercentagePreferenceController(context));
-        controllers.add(new AmbientDisplayPreferenceController(
-                context,
-                new AmbientDisplayConfiguration(context),
-                KEY_AMBIENT_DISPLAY));
+
         return controllers;
     }
 
@@ -544,10 +535,6 @@
                 public List<String> getNonIndexableKeys(Context context) {
                     List<String> niks = super.getNonIndexableKeys(context);
                     niks.add(KEY_BATTERY_SAVER_SUMMARY);
-                    // Duplicates in display
-                    niks.add(KEY_AUTO_BRIGHTNESS);
-                    niks.add(KEY_SCREEN_TIMEOUT);
-                    niks.add(KEY_AMBIENT_DISPLAY);
                     return niks;
                 }
             };
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogFragment.java b/src/com/android/settings/network/PrivateDnsModeDialogFragment.java
index 5704fb9..8b7ccce 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogFragment.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogFragment.java
@@ -22,22 +22,30 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.FragmentManager;
+import android.content.ActivityNotFoundException;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.support.annotation.VisibleForTesting;
 import android.text.Editable;
 import android.text.TextWatcher;
+import android.text.method.LinkMovementMethod;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.RadioGroup;
+import android.widget.TextView;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.utils.AnnotationSpan;
+import com.android.settingslib.HelpUtils;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -48,6 +56,8 @@
 public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment implements
         DialogInterface.OnClickListener, RadioGroup.OnCheckedChangeListener, TextWatcher {
 
+    public static final String ANNOTATION_URL = "url";
+
     private static final String TAG = "PrivateDnsModeDialogFragment";
     // DNS_MODE -> RadioButton id
     private static final Map<String, Integer> PRIVATE_DNS_MAP;
@@ -73,6 +83,21 @@
     @VisibleForTesting
     String mMode;
 
+    private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo(
+            ANNOTATION_URL, (widget) -> {
+        final Context context = widget.getContext();
+        final Intent intent = HelpUtils.getHelpIntent(context,
+                getString(R.string.help_uri_private_dns),
+                context.getClass().getName());
+        if (intent != null) {
+            try {
+                widget.startActivityForResult(intent, 0);
+            } catch (ActivityNotFoundException e) {
+                Log.w(TAG, "Activity was not found for intent, " + intent.toString());
+            }
+        }
+    });
+
     public static void show(FragmentManager fragmentManager) {
         if (fragmentManager.findFragmentByTag(TAG) == null) {
             final PrivateDnsModeDialogFragment fragment = new PrivateDnsModeDialogFragment();
@@ -112,25 +137,30 @@
         mRadioGroup.setOnCheckedChangeListener(this);
         mRadioGroup.check(PRIVATE_DNS_MAP.getOrDefault(mMode, R.id.private_dns_mode_opportunistic));
 
+        final TextView helpTextView = view.findViewById(R.id.private_dns_help_info);
+        helpTextView.setMovementMethod(LinkMovementMethod.getInstance());
+        helpTextView.setText(AnnotationSpan.linkify(
+                context.getText(R.string.private_dns_help_message), mUrlLinkInfo));
+
         return view;
     }
 
     @Override
     public void onClick(DialogInterface dialog, int which) {
-        //TODO(b/34953048): add metric action
         if (mMode.equals(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
             // Only clickable if hostname is valid, so we could save it safely
             Settings.Global.putString(getContext().getContentResolver(), HOSTNAME_KEY,
                     mEditText.getText().toString());
         }
 
+        mMetricsFeatureProvider.action(getContext(),
+                MetricsProto.MetricsEvent.ACTION_PRIVATE_DNS_MODE, mMode);
         Settings.Global.putString(getContext().getContentResolver(), MODE_KEY, mMode);
     }
 
     @Override
     public int getMetricsCategory() {
-        //TODO(b/68030013): add metric id
-        return 0;
+        return MetricsProto.MetricsEvent.DIALOG_PRIVATE_DNS;
     }
 
     @Override
diff --git a/src/com/android/settings/overlay/SupportFeatureProvider.java b/src/com/android/settings/overlay/SupportFeatureProvider.java
index 55d5d0e..ad68a74 100644
--- a/src/com/android/settings/overlay/SupportFeatureProvider.java
+++ b/src/com/android/settings/overlay/SupportFeatureProvider.java
@@ -46,89 +46,27 @@
     }
 
     /**
-     * Returns a intent that will open help & feedback.
-     */
-    Intent getHelpIntent(Context context);
-
-    /**
-     * Whether or not a support type is enabled.
-     */
-    boolean isSupportTypeEnabled(Context context, @SupportType int type);
-
-    /**
      * Refreshes all operation rules.
      */
     void refreshOperationRules();
 
     /**
-     * Whether or not a support type is in operation 24/7. If country is null, use
-     * current country.
-     */
-    boolean isAlwaysOperating(@SupportType int type, String countryCode);
-
-    /**
-     * Whether or not a support type is operating now.
-     */
-    boolean isOperatingNow(@SupportType int type);
-
-    /**
      * Returns the current country code if it has a operation config, otherwise returns null.
      */
     String getCurrentCountryCodeIfHasConfig(@SupportType int type);
 
     /**
-     * Returns localized string for operation hours in specified country. If country is null, use
-     * current country to figure out operation hours.
-     */
-    CharSequence getOperationHours(Context context, @SupportType int type, String countryCode,
-            boolean hasInternet);
-
-    /**
-     * Returns a localized string indicating estimated wait time for a support time.
-     */
-    String getEstimatedWaitTime(Context context, @SupportType int type);
-
-    /**
-     * Returns a list of country codes that have phone support.
-     */
-    List<String> getPhoneSupportCountryCodes();
-
-    /**
-     * Returns a list of countries that have phone support.
-     */
-    List<String> getPhoneSupportCountries();
-
-    /**
      * Returns a support phone for specified country.
      */
     SupportPhone getSupportPhones(String countryCode, boolean isTollfree);
 
     /**
-     * Whether or not a disclaimer dialog should be displayed.
-     */
-    boolean shouldShowDisclaimerDialog(Context context);
-
-    /**
-     * Sets whether or not a disclaimer dialog should be displayed.
-     */
-    void setShouldShowDisclaimerDialog(Context context, boolean shouldShow);
-
-    /**
      * Returns array of {@link Account} that's eligible for support options.
      */
     @NonNull
     Account[] getSupportEligibleAccounts(Context context);
 
     /**
-     * Starts support activity of specified type
-     *
-     * @param activity Calling activity
-     * @param account  A account that selected by user
-     * @param type     The type of support account needs.
-     */
-    void startSupport(Activity activity, Account account, @SupportType int type);
-
-    /**
      * Starts support v2, invokes the support home page. Will no-op if support v2 is not enabled.
      *
      * @param activity Calling activity.
@@ -136,39 +74,6 @@
     void startSupportV2(Activity activity);
 
     /**
-     * Checks if support v2 is enabled for this device.
-     *
-     * @return a boolean indicating if support v2 is enabled.
-     */
-    boolean isSupportV2Enabled();
-
-    /**
-     * Returns an {@link Intent} that opens help and allow user get help on sign in.
-     */
-    Intent getSignInHelpIntent(Context context);
-
-    /**
-     * Returns an intent that will start the add account UI.
-     */
-    Intent getAccountLoginIntent();
-
-    /**
-     * Returns an intent that will launch the tips and tricks UI.
-     */
-    Intent getTipsAndTricksIntent(Context context);
-
-    /**
-     * Returns the string for the disclaimer in the Support dialog.
-     */
-    @StringRes
-    int getDisclaimerStringResId();
-
-    /**
-     * launches the fragment that displays the system information being sent to support agents.
-     */
-    void launchSystemInfoFragment(Bundle args, FragmentManager manager);
-
-    /**
      * Returns a url with information to introduce user to new device.
      */
     String getNewDeviceIntroUrl(Context context);
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 4e54f3c..11efec3 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -210,7 +210,7 @@
         private String mFirstPin;
         private RecyclerView mPasswordRestrictionView;
         protected boolean mIsAlphaMode;
-        protected Button mCancelButton;
+        protected Button mSkipButton;
         private Button mClearButton;
         private Button mNextButton;
         private TextView mMessage;
@@ -377,8 +377,8 @@
             ViewGroup container = view.findViewById(R.id.password_container);
             container.setOpticalInsets(Insets.NONE);
 
-            mCancelButton = (Button) view.findViewById(R.id.cancel_button);
-            mCancelButton.setOnClickListener(this);
+            mSkipButton = (Button) view.findViewById(R.id.skip_button);
+            mSkipButton.setOnClickListener(this);
             mNextButton = (Button) view.findViewById(R.id.next_button);
             mNextButton.setOnClickListener(this);
             mClearButton = view.findViewById(R.id.clear_button);
@@ -774,10 +774,6 @@
                     handleNext();
                     break;
 
-                case R.id.cancel_button:
-                    getActivity().finish();
-                    break;
-
                 case R.id.clear_button:
                     mPasswordEntry.setText("");
                     break;
@@ -901,7 +897,6 @@
             }
 
             mClearButton.setVisibility(toVisibility(mUiStage != Stage.Introduction));
-            mCancelButton.setVisibility(toVisibility(mUiStage == Stage.Introduction));
 
             setNextText(mUiStage.buttonText);
             mPasswordEntryInputDisabler.setInputEnabled(canInput);
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 7cd9db8..746a977 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -290,8 +290,6 @@
          * The states of the left footer button.
          */
         enum LeftButtonMode {
-            Cancel(R.string.cancel, true),
-            CancelDisabled(R.string.cancel, false),
             Retry(R.string.lockpattern_retry_button_text, true),
             RetryDisabled(R.string.lockpattern_retry_button_text, false),
             Gone(ID_EMPTY_MESSAGE, false);
@@ -342,7 +340,7 @@
                     R.string.lock_settings_picker_fingerprint_added_security_message,
                     R.string.lockpassword_choose_your_pattern_message,
                     R.string.lockpattern_recording_intro_header,
-                    LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled,
+                    LeftButtonMode.Gone, RightButtonMode.ContinueDisabled,
                     ID_EMPTY_MESSAGE, true),
             HelpScreen(
                     ID_EMPTY_MESSAGE, ID_EMPTY_MESSAGE, R.string.lockpattern_settings_help_how_to_record,
@@ -360,15 +358,15 @@
                     LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
             NeedToConfirm(
                     ID_EMPTY_MESSAGE, ID_EMPTY_MESSAGE, R.string.lockpattern_need_to_confirm,
-                    LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
+                    LeftButtonMode.Gone, RightButtonMode.ConfirmDisabled,
                     ID_EMPTY_MESSAGE, true),
             ConfirmWrong(
                     ID_EMPTY_MESSAGE, ID_EMPTY_MESSAGE, R.string.lockpattern_need_to_unlock_wrong,
-                    LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
+                    LeftButtonMode.Gone, RightButtonMode.ConfirmDisabled,
                     ID_EMPTY_MESSAGE, true),
             ChoiceConfirmed(
                     ID_EMPTY_MESSAGE, ID_EMPTY_MESSAGE, R.string.lockpattern_pattern_confirmed_header,
-                    LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
+                    LeftButtonMode.Gone, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
 
 
             /**
@@ -413,7 +411,7 @@
 
         private ChooseLockSettingsHelper mChooseLockSettingsHelper;
         private SaveAndFinishWorker mSaveAndFinishWorker;
-        private int mUserId;
+        protected int mUserId;
         private boolean mForFingerprint;
 
         private static final String KEY_UI_STAGE = "uiStage";
@@ -558,8 +556,6 @@
                 mChosenPattern = null;
                 mLockPatternView.clearPattern();
                 updateStage(Stage.Introduction);
-            } else if (mUiStage.leftMode == LeftButtonMode.Cancel) {
-                getActivity().finish();
             } else {
                 throw new IllegalStateException("left footer button pressed, but stage of " +
                         mUiStage + " doesn't make sense");
diff --git a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
index 13dc996..6a66ffb 100644
--- a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
+++ b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.password;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.AlertDialog.Builder;
 import android.app.Dialog;
@@ -24,6 +25,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -33,8 +35,11 @@
 import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
+import com.android.setupwizardlib.util.WizardManagerHelper;
 
 import java.util.List;
 
@@ -60,6 +65,36 @@
 
     public interface OnLockTypeSelectedListener {
         void onLockTypeSelected(ScreenLockType lock);
+
+        default void startChooseLockActivity(ScreenLockType selectedLockType, Activity activity) {
+            Intent activityIntent = activity.getIntent();
+            Intent intent = new Intent(activity, SetupChooseLockGeneric.class);
+            intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+            // Copy the original extras into the new intent
+            if (activityIntent.hasExtra(
+                    ChooseLockGenericFragment.EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS)) {
+                intent.putExtras(activityIntent.getBundleExtra(
+                        ChooseLockGenericFragment.EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS));
+            }
+            intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, selectedLockType.defaultQuality);
+
+            // Propagate the fingerprint challenge
+            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE,
+                    activityIntent.getBooleanExtra(
+                            ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
+            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE,
+                    activityIntent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0));
+
+            // The user is already given the choice of the what screen lock to set up. No need to
+            // show this button again.
+            intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
+
+            WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
+
+            activity.startActivity(intent);
+            activity.finish();
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index 79cfef3..5c70736 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -28,13 +28,9 @@
 import android.widget.Button;
 import android.widget.LinearLayout;
 
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.SetupRedactionInterstitial;
-import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
 import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
-import com.android.setupwizardlib.util.WizardManagerHelper;
 
 /**
  * Setup Wizard's version of ChooseLockPassword screen. It inherits the logic and basic structure
@@ -75,9 +71,6 @@
     public static class SetupChooseLockPasswordFragment extends ChooseLockPasswordFragment
             implements OnLockTypeSelectedListener {
 
-        @VisibleForTesting
-        static final int REQUEST_SCREEN_LOCK_OPTIONS = 1;
-
         @Nullable
         private Button mOptionsButton;
 
@@ -90,8 +83,7 @@
             boolean anyOptionsShown = chooseLockGenericController.getVisibleScreenLockTypes(
                     DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false).size() > 0;
             boolean showOptionsButton = activity.getIntent().getBooleanExtra(
-                    ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
-
+                    ChooseLockGeneric.ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
             if (!anyOptionsShown) {
                 Log.w(TAG, "Visible screen lock types is empty!");
             }
@@ -107,9 +99,10 @@
         public void onClick(View v) {
             switch (v.getId()) {
                 case R.id.screen_lock_options:
-                    launchChooseLockGeneric();
+                    ChooseLockTypeDialogFragment.newInstance(mUserId)
+                            .show(getChildFragmentManager(), null);
                     break;
-                case R.id.cancel_button:
+                case R.id.skip_button:
                     SetupSkipDialog dialog = SetupSkipDialog.newInstance(
                             getActivity().getIntent()
                                     .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
@@ -120,11 +113,6 @@
             }
         }
 
-        private void launchChooseLockGeneric() {
-            ChooseLockTypeDialogFragment.newInstance(mUserId)
-                    .show(getChildFragmentManager(), null);
-        }
-
         @Override
         protected Intent getRedactionInterstitialIntent(Context context) {
             // Setup wizard's redaction interstitial is deferred to optional step. Enable that
@@ -137,57 +125,16 @@
         public void onLockTypeSelected(ScreenLockType lock) {
             ScreenLockType currentLockType = mIsAlphaMode ?
                     ScreenLockType.PASSWORD : ScreenLockType.PIN;
-            if (currentLockType.equals(lock)) {
-                // ignore same lock type.
+            if (lock == currentLockType) {
                 return;
             }
-            Intent activityIntent = getActivity().getIntent();
-            Intent intent = new Intent(getContext(), SetupChooseLockGeneric.class);
-
-            // Copy the original extras into the new intent
-            if (activityIntent
-                    .hasExtra(ChooseLockGenericFragment.EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS)) {
-                intent.putExtras(activityIntent.getBundleExtra(
-                        ChooseLockGenericFragment.EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS));
-            }
-            intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, lock.defaultQuality);
-
-            // Propagate the fingerprint challenge
-            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE,
-                    activityIntent.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE,
-                            false));
-            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE,
-                    activityIntent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0));
-
-            // The user is already given the choice of the what screen lock to set up. No need to
-            // show this button again.
-            intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
-
-            WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
-
-            startActivityForResult(intent, REQUEST_SCREEN_LOCK_OPTIONS);
-        }
-
-        @Override
-        public void onActivityResult(int requestCode, int resultCode, Intent data) {
-            super.onActivityResult(requestCode, resultCode, data);
-            if (requestCode == REQUEST_SCREEN_LOCK_OPTIONS) {
-                if (resultCode != Activity.RESULT_CANCELED) {
-                    Activity activity = getActivity();
-                    activity.setResult(resultCode, data);
-                    activity.finish();
-                }
-            }
+            startChooseLockActivity(lock, getActivity());
         }
 
         @Override
         protected void updateUi() {
             super.updateUi();
-            if (mForFingerprint) {
-                mCancelButton.setVisibility(View.GONE);
-            } else {
-                mCancelButton.setText(R.string.skip_label);
-            }
+            mSkipButton.setVisibility(mForFingerprint ? View.GONE : View.VISIBLE);
 
             if (mOptionsButton != null) {
                 mOptionsButton.setVisibility(
diff --git a/src/com/android/settings/password/SetupChooseLockPattern.java b/src/com/android/settings/password/SetupChooseLockPattern.java
index b1e3d0d..b1c9fac 100644
--- a/src/com/android/settings/password/SetupChooseLockPattern.java
+++ b/src/com/android/settings/password/SetupChooseLockPattern.java
@@ -19,7 +19,11 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
 
+import com.android.settings.R;
 import com.android.settings.SetupRedactionInterstitial;
 
 /**
@@ -46,7 +50,26 @@
         return SetupChooseLockPatternFragment.class;
     }
 
-    public static class SetupChooseLockPatternFragment extends ChooseLockPatternFragment {
+    public static class SetupChooseLockPatternFragment extends ChooseLockPatternFragment
+            implements ChooseLockTypeDialogFragment.OnLockTypeSelectedListener {
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            super.onViewCreated(view, savedInstanceState);
+            Button optionsButton = (Button) view.findViewById(R.id.screen_lock_options);
+            optionsButton.setVisibility(View.VISIBLE);
+            optionsButton.setOnClickListener((btn) ->
+                    ChooseLockTypeDialogFragment.newInstance(mUserId)
+                            .show(getChildFragmentManager(), null));
+        }
+
+        @Override
+        public void onLockTypeSelected(ScreenLockType lock) {
+            if (ScreenLockType.PATTERN == lock) {
+                return;
+            }
+            startChooseLockActivity(lock, getActivity());
+        }
 
         @Override
         protected Intent getRedactionInterstitialIntent(Context context) {
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index c4e178f..0207c94 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -75,7 +75,7 @@
 import com.android.settings.security.EncryptionAndCredential;
 import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.security.ScreenPinningSettings;
-import com.android.settings.security.SecuritySettings;
+import com.android.settings.security.SecuritySettingsV2;
 import com.android.settings.security.screenlock.ScreenLockSettings;
 import com.android.settings.sim.SimSettings;
 import com.android.settings.support.SupportDashboardActivity;
@@ -135,7 +135,7 @@
         addIndex(LocationSettings.class);
         addIndex(LocationMode.class);
         addIndex(ScanningSettings.class);
-        addIndex(SecuritySettings.class);
+        addIndex(SecuritySettingsV2.class);
         addIndex(ScreenLockSettings.class);
         addIndex(EncryptionAndCredential.class);
         addIndex(ScreenPinningSettings.class);
@@ -179,5 +179,7 @@
     private SearchIndexableResources() {
     }
 
-    public static Collection<Class> providerValues() { return sProviders;}
+    public static Collection<Class> providerValues() {
+        return sProviders;
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
index 612dd6d..9a33ec3 100644
--- a/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeProfileScreenLockPreferenceController.java
@@ -30,7 +30,6 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.password.ChooseLockGeneric;
-import com.android.settings.widget.GearPreference;
 
 public class ChangeProfileScreenLockPreferenceController extends
         ChangeScreenLockPreferenceController {
@@ -42,12 +41,6 @@
         super(context, host);
     }
 
-    @Override
-    public void onGearClick(GearPreference p) {
-
-    }
-
-    @Override
     public boolean isAvailable() {
         if (mProfileChallengeUserId == UserHandle.USER_NULL ||
                 !mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 3cd235f..67b78fc 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -79,13 +79,19 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPreference = (RestrictedPreference) screen.findPreference(getPreferenceKey());
-        if (mPreference != null && mPreference instanceof GearPreference) {
-            ((GearPreference) mPreference).setOnGearClickListener(this);
-        }
     }
 
     @Override
     public void updateState(Preference preference) {
+        if (mPreference != null && mPreference instanceof GearPreference) {
+            if (mLockPatternUtils.isSecure(mUserId)
+                    || !mLockPatternUtils.isLockScreenDisabled(mUserId)) {
+                ((GearPreference) mPreference).setOnGearClickListener(this);
+            } else {
+                ((GearPreference) mPreference).setOnGearClickListener(null);
+            }
+        }
+
         updateSummary(preference, mUserId);
         disableIfPasswordQualityManaged(mUserId);
         if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) {
@@ -148,6 +154,7 @@
                     break;
             }
         }
+        mPreference.setEnabled(true);
     }
 
     /**
diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java
index aa35dd3..627cf3e 100644
--- a/src/com/android/settings/security/EncryptionAndCredential.java
+++ b/src/com/android/settings/security/EncryptionAndCredential.java
@@ -66,7 +66,8 @@
             Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         final EncryptionStatusPreferenceController encryptStatusController =
-                new EncryptionStatusPreferenceController(context, PREF_KEY_ENCRYPTION_DETAIL_PAGE);
+                new EncryptionStatusPreferenceController(context,
+                        PREF_KEY_ENCRYPTION_DETAIL_PAGE);
         controllers.add(encryptStatusController);
         controllers.add(new PreferenceCategoryController(context,
                 "encryption_and_credentials_status_category",
diff --git a/src/com/android/settings/security/SecuritySettingsV2.java b/src/com/android/settings/security/SecuritySettingsV2.java
index 7ae6ca7..323c0f4 100644
--- a/src/com/android/settings/security/SecuritySettingsV2.java
+++ b/src/com/android/settings/security/SecuritySettingsV2.java
@@ -1,33 +1,31 @@
 package com.android.settings.security;
 
-import static com.android.settings.security.EncryptionStatusPreferenceController.PREF_KEY_ENCRYPTION_SECURITY_PAGE;
+import static com.android.settings.security.EncryptionStatusPreferenceController
+        .PREF_KEY_ENCRYPTION_SECURITY_PAGE;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
-import android.os.UserHandle;
-import android.os.UserManager;
 import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
 import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
+import com.android.settings.fingerprint.FingerprintProfileStatusPreferenceController;
+import com.android.settings.fingerprint.FingerprintStatusPreferenceController;
 import com.android.settings.location.LocationPreferenceController;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.security.screenlock.LockScreenPreferenceController;
 import com.android.settings.security.trustagent.ManageTrustAgentsPreferenceController;
 import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
+import com.android.settings.widget.PreferenceCategoryController;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -43,60 +41,12 @@
     public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129;
     public static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130;
 
-
-    // Security status
-    private static final String KEY_SECURITY_STATUS = "security_status";
-    private static final String SECURITY_STATUS_KEY_PREFIX = "security_status_";
-
-    private static final int MY_USER_ID = UserHandle.myUserId();
-
-    private DashboardFeatureProvider mDashboardFeatureProvider;
-    private SecurityFeatureProvider mSecurityFeatureProvider;
-    private UserManager mUm;
-
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
-    private LockPatternUtils mLockPatternUtils;
-
-    private int mProfileChallengeUserId;
-
-    private LocationPreferenceController mLocationController;
-    private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
-    private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
-    private EncryptionStatusPreferenceController mEncryptionStatusPreferenceController;
-    private ManageTrustAgentsPreferenceController mManageTrustAgentsPreferenceController;
-    private ScreenPinningPreferenceController mScreenPinningPreferenceController;
-    private SimLockPreferenceController mSimLockPreferenceController;
-    private ShowPasswordPreferenceController mShowPasswordPreferenceController;
-    private TrustAgentListPreferenceController mTrustAgentListPreferenceController;
-    private LockScreenPreferenceController mLockScreenPreferenceController;
-    private ChangeScreenLockPreferenceController mChangeScreenLockPreferenceController;
-    private ChangeProfileScreenLockPreferenceController
-            mChangeProfileScreenLockPreferenceController;
-    private LockUnificationPreferenceController mLockUnificationPreferenceController;
-    private VisiblePatternProfilePreferenceController mVisiblePatternProfilePreferenceController;
-    private FingerprintStatusPreferenceController mFingerprintStatusPreferenceController;
-    private FingerprintProfileStatusPreferenceController
-            mFingerprintProfileStatusPreferenceController;
-
     @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.SECURITY;
     }
 
     @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        mSecurityFeatureProvider = FeatureFactory.getFactory(context).getSecurityFeatureProvider();
-        mLocationController = new LocationPreferenceController(context, getLifecycle());
-        mLockPatternUtils = mSecurityFeatureProvider.getLockPatternUtils(context);
-        mUm = UserManager.get(context);
-        mDashboardFeatureProvider = FeatureFactory.getFactory(context)
-                .getDashboardFeatureProvider(context);
-
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
-    }
-
-    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.security_settings_v2;
     }
@@ -106,7 +56,6 @@
         return TAG;
     }
 
-
     @Override
     public int getHelpResource() {
         return R.string.help_url_security;
@@ -114,161 +63,7 @@
 
     @Override
     protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
-        mManageDeviceAdminPreferenceController
-                = new ManageDeviceAdminPreferenceController(context);
-        mEnterprisePrivacyPreferenceController
-                = new EnterprisePrivacyPreferenceController(context);
-        mManageTrustAgentsPreferenceController = new ManageTrustAgentsPreferenceController(context);
-        mScreenPinningPreferenceController = new ScreenPinningPreferenceController(context);
-        mSimLockPreferenceController = new SimLockPreferenceController(context);
-        mShowPasswordPreferenceController = new ShowPasswordPreferenceController(context);
-        mEncryptionStatusPreferenceController = new EncryptionStatusPreferenceController(
-                context, PREF_KEY_ENCRYPTION_SECURITY_PAGE);
-        mTrustAgentListPreferenceController = new TrustAgentListPreferenceController(getActivity(),
-                this /* host */, getLifecycle());
-        mLockScreenPreferenceController = new LockScreenPreferenceController(context);
-        mChangeScreenLockPreferenceController = new ChangeScreenLockPreferenceController(context,
-                this /* host */);
-        mChangeProfileScreenLockPreferenceController =
-                new ChangeProfileScreenLockPreferenceController(context, this /* host */);
-        mLockUnificationPreferenceController = new LockUnificationPreferenceController(context,
-                this /* host */);
-        mVisiblePatternProfilePreferenceController =
-                new VisiblePatternProfilePreferenceController(context);
-        mFingerprintStatusPreferenceController = new FingerprintStatusPreferenceController(context);
-        mFingerprintProfileStatusPreferenceController =
-                new FingerprintProfileStatusPreferenceController(context);
-        return null;
-    }
-
-    /**
-     * Important!
-     *
-     * Don't forget to update the SecuritySearchIndexProvider if you are doing any change in the
-     * logic or adding/removing preferences here.
-     */
-    private PreferenceScreen createPreferenceHierarchy() {
-        final PreferenceScreen root = getPreferenceScreen();
-        mTrustAgentListPreferenceController.displayPreference(root);
-        mLockScreenPreferenceController.displayPreference(root);
-        mChangeScreenLockPreferenceController.displayPreference(root);
-        mChangeProfileScreenLockPreferenceController.displayPreference(root);
-        mLockUnificationPreferenceController.displayPreference(root);
-        mVisiblePatternProfilePreferenceController.displayPreference(root);
-        mFingerprintStatusPreferenceController.displayPreference(root);
-        mFingerprintProfileStatusPreferenceController.displayPreference(root);
-
-        mSimLockPreferenceController.displayPreference(root);
-        mScreenPinningPreferenceController.displayPreference(root);
-
-        // Advanced Security features
-        mManageTrustAgentsPreferenceController.displayPreference(root);
-
-//        PreferenceGroup securityStatusPreferenceGroup =
-//                (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
-//        final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory(
-//                getActivity(), getPrefContext(), getMetricsCategory(),
-//                CategoryKey.CATEGORY_SECURITY);
-//        int numSecurityStatusPrefs = 0;
-//        if (tilePrefs != null && !tilePrefs.isEmpty()) {
-//            for (Preference preference : tilePrefs) {
-//                if (!TextUtils.isEmpty(preference.getKey())
-//                        && preference.getKey().startsWith(SECURITY_STATUS_KEY_PREFIX)) {
-//                    // Injected security status settings are placed under the Security status
-//                    // category.
-//                    securityStatusPreferenceGroup.addPreference(preference);
-//                    numSecurityStatusPrefs++;
-//                } else {
-//                    // Other injected settings are placed under the Security preference screen.
-//                    root.addPreference(preference);
-//                }
-//            }
-//        }
-//
-//        if (numSecurityStatusPrefs == 0) {
-//            root.removePreference(securityStatusPreferenceGroup);
-//        } else if (numSecurityStatusPrefs > 0) {
-//            // Update preference data with tile data. Security feature provider only updates the
-//            // data if it actually needs to be changed.
-//            mSecurityFeatureProvider.updatePreferences(getActivity(), root,
-//                    mDashboardFeatureProvider.getTilesForCategory(
-//                            CategoryKey.CATEGORY_SECURITY));
-//        }
-
-        mLocationController.displayPreference(root);
-        mManageDeviceAdminPreferenceController.updateState(
-                root.findPreference(mManageDeviceAdminPreferenceController.getPreferenceKey()));
-        mEnterprisePrivacyPreferenceController.displayPreference(root);
-        final Preference enterprisePrivacyPreference = root.findPreference(
-                mEnterprisePrivacyPreferenceController.getPreferenceKey());
-        mEnterprisePrivacyPreferenceController.updateState(enterprisePrivacyPreference);
-
-        return root;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        // Make sure we reload the preference hierarchy since some of these settings
-        // depend on others...
-        createPreferenceHierarchy();
-
-        final Preference visiblePatternProfilePref = getPreferenceScreen().findPreference(
-                mVisiblePatternProfilePreferenceController.getPreferenceKey());
-        if (visiblePatternProfilePref != null) {
-            visiblePatternProfilePref
-                    .setOnPreferenceChangeListener(mVisiblePatternProfilePreferenceController);
-            mVisiblePatternProfilePreferenceController.updateState(visiblePatternProfilePref);
-        }
-
-        final Preference showPasswordPref = getPreferenceScreen().findPreference(
-                mShowPasswordPreferenceController.getPreferenceKey());
-        showPasswordPref.setOnPreferenceChangeListener(mShowPasswordPreferenceController);
-        mShowPasswordPreferenceController.updateState(showPasswordPref);
-
-        final Preference lockUnificationPref = getPreferenceScreen().findPreference(
-                mLockUnificationPreferenceController.getPreferenceKey());
-        lockUnificationPref.setOnPreferenceChangeListener(mLockUnificationPreferenceController);
-        mLockUnificationPreferenceController.updateState(lockUnificationPref);
-
-        final Preference changeDeviceLockPref = getPreferenceScreen().findPreference(
-                mChangeScreenLockPreferenceController.getPreferenceKey());
-        mChangeScreenLockPreferenceController.updateState(changeDeviceLockPref);
-
-        mFingerprintStatusPreferenceController.updateState(
-                getPreferenceScreen().findPreference(
-                        mFingerprintStatusPreferenceController.getPreferenceKey()));
-
-        mFingerprintProfileStatusPreferenceController.updateState(
-                getPreferenceScreen().findPreference(
-                        mFingerprintProfileStatusPreferenceController.getPreferenceKey()));
-
-        final Preference changeProfileLockPref = getPreferenceScreen().findPreference(
-                mChangeProfileScreenLockPreferenceController.getPreferenceKey());
-        mChangeProfileScreenLockPreferenceController.updateState(changeProfileLockPref);
-
-        final Preference encryptionStatusPref = getPreferenceScreen().findPreference(
-                mEncryptionStatusPreferenceController.getPreferenceKey());
-        mEncryptionStatusPreferenceController.updateState(encryptionStatusPref);
-        mTrustAgentListPreferenceController.onResume();
-        mLocationController.updateSummary();
-    }
-
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (mTrustAgentListPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mChangeScreenLockPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mChangeProfileScreenLockPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        // If we didn't handle it, let preferences handle it.
-        return super.onPreferenceTreeClick(preference);
+        return buildPreferenceControllers(context, getLifecycle(), this /* host*/);
     }
 
     /**
@@ -276,50 +71,85 @@
      */
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (getPreferenceController(TrustAgentListPreferenceController.class)
+                .handleActivityResult(requestCode, resultCode)) {
+            return;
+        }
+        if (getPreferenceController(LockUnificationPreferenceController.class)
+                .handleActivityResult(requestCode, resultCode, data)) {
+            return;
+        }
         super.onActivityResult(requestCode, resultCode, data);
-        if (mTrustAgentListPreferenceController.handleActivityResult(requestCode, resultCode)) {
-            return;
-        }
-        if (mLockUnificationPreferenceController.handleActivityResult(
-                requestCode, resultCode, data)) {
-            return;
-        }
-        createPreferenceHierarchy();
+    }
+
+    void launchConfirmDeviceLockForUnification() {
+        getPreferenceController(LockUnificationPreferenceController.class)
+                .launchConfirmDeviceLockForUnification();
+    }
+
+    void unifyUncompliantLocks() {
+        getPreferenceController(LockUnificationPreferenceController.class).unifyUncompliantLocks();
+    }
+
+    void updateUnificationPreference() {
+        getPreferenceController(LockUnificationPreferenceController.class).updateState(null);
+    }
+
+    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
+            Lifecycle lifecycle, SecuritySettingsV2 host) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new LocationPreferenceController(context, lifecycle));
+        controllers.add(new ManageDeviceAdminPreferenceController(context));
+        controllers.add(new EnterprisePrivacyPreferenceController(context));
+        controllers.add(new ManageTrustAgentsPreferenceController(context));
+        controllers.add(new ScreenPinningPreferenceController(context));
+        controllers.add(new SimLockPreferenceController(context));
+        controllers.add(new ShowPasswordPreferenceController(context));
+        controllers.add(new FingerprintStatusPreferenceController(context));
+        controllers.add(new EncryptionStatusPreferenceController(context,
+                PREF_KEY_ENCRYPTION_SECURITY_PAGE));
+        controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle));
+        controllers.add(new LockScreenPreferenceController(context, lifecycle));
+        controllers.add(new ChangeScreenLockPreferenceController(context, host));
+
+        final List<AbstractPreferenceController> profileSecurityControllers = new ArrayList<>();
+        profileSecurityControllers.add(new ChangeProfileScreenLockPreferenceController(
+                context, host));
+        profileSecurityControllers.add(new LockUnificationPreferenceController(context, host));
+        profileSecurityControllers.add(new VisiblePatternProfilePreferenceController(
+                context, lifecycle));
+        profileSecurityControllers.add(new FingerprintProfileStatusPreferenceController(context));
+        controllers.add(new PreferenceCategoryController(context, "security_category_profile",
+                profileSecurityControllers));
+        controllers.addAll(profileSecurityControllers);
+
+        return controllers;
     }
 
     /**
      * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
      */
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new SecuritySearchIndexProvider();
+            new BaseSearchIndexProvider() {
 
-    void launchConfirmDeviceLockForUnification() {
-        mLockUnificationPreferenceController.launchConfirmDeviceLockForUnification();
-    }
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(
+                        Context context, boolean enabled) {
+                    final List<SearchIndexableResource> index = new ArrayList<>();
+                    // Append the rest of the settings
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.security_settings_v2;
+                    index.add(sir);
+                    return index;
+                }
 
-    void unifyUncompliantLocks() {
-        mLockUnificationPreferenceController.unifyUncompliantLocks();
-    }
-
-    void updateUnificationPreference() {
-        mLockUnificationPreferenceController.updateState(null);
-    }
-
-    private static class SecuritySearchIndexProvider extends BaseSearchIndexProvider {
-
-        // TODO (b/68001777) Refactor indexing to include all XML and block other settings.
-
-        @Override
-        public List<SearchIndexableResource> getXmlResourcesToIndex(
-                Context context, boolean enabled) {
-            final List<SearchIndexableResource> index = new ArrayList<>();
-            // Append the rest of the settings
-            final SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.security_settings_v2;
-            index.add(sir);
-            return index;
-        }
-    }
+                @Override
+                public List<AbstractPreferenceController> getPreferenceControllers(Context
+                        context) {
+                    return buildPreferenceControllers(context, null /* lifecycle */,
+                            null /* host*/);
+                }
+            };
 
     static class SummaryProvider implements SummaryLoader.SummaryProvider {
 
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index 39b1916..a9e56f4 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -21,13 +21,19 @@
 import android.content.Context;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.Utils;
 import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnResume;
 
-public class VisiblePatternProfilePreferenceController extends TogglePreferenceController {
+public class VisiblePatternProfilePreferenceController extends TogglePreferenceController
+        implements LifecycleObserver, OnResume {
 
     private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
 
@@ -36,13 +42,18 @@
     private final int mUserId = UserHandle.myUserId();
     private final int mProfileChallengeUserId;
 
-    public VisiblePatternProfilePreferenceController(Context context) {
+    private Preference mPreference;
+
+    public VisiblePatternProfilePreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_VISIBLE_PATTERN_PROFILE);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mLockPatternUtils = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider()
                 .getLockPatternUtils(context);
         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
     }
 
     @Override
@@ -69,4 +80,15 @@
         mLockPatternUtils.setVisiblePatternEnabled(isChecked, mProfileChallengeUserId);
         return true;
     }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void onResume() {
+        mPreference.setVisible(isAvailable());
+    }
 }
diff --git a/src/com/android/settings/security/LockScreenPreferenceController.java b/src/com/android/settings/security/screenlock/LockScreenPreferenceController.java
similarity index 71%
rename from src/com/android/settings/security/LockScreenPreferenceController.java
rename to src/com/android/settings/security/screenlock/LockScreenPreferenceController.java
index 213c39c..d42af2d 100644
--- a/src/com/android/settings/security/LockScreenPreferenceController.java
+++ b/src/com/android/settings/security/screenlock/LockScreenPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.security;
+package com.android.settings.security.screenlock;
 
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
 
@@ -27,18 +27,32 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnResume;
 
-public class LockScreenPreferenceController extends BasePreferenceController {
+public class LockScreenPreferenceController extends BasePreferenceController implements
+        LifecycleObserver, OnResume {
 
     static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
 
     private static final int MY_USER_ID = UserHandle.myUserId();
     private final LockPatternUtils mLockPatternUtils;
+    private Preference mPreference;
 
-    public LockScreenPreferenceController(Context context) {
+    public LockScreenPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_LOCKSCREEN_PREFERENCES);
         mLockPatternUtils = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider().getLockPatternUtils(context);
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
     }
 
     @Override
@@ -54,12 +68,13 @@
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        final Preference lockscreenPreferences = screen.findPreference(getPreferenceKey());
-        if (lockscreenPreferences != null) {
-            lockscreenPreferences.setSummary(
-                    LockScreenNotificationPreferenceController.getSummaryResource(mContext));
-        }
+    public void updateState(Preference preference) {
+        preference.setSummary(
+                LockScreenNotificationPreferenceController.getSummaryResource(mContext));
+    }
+
+    @Override
+    public void onResume() {
+        mPreference.setVisible(isAvailable());
     }
 }
diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
index 8d198e7..99aa6a4 100644
--- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -19,6 +19,7 @@
 import static com.android.settings.security.SecuritySettingsV2.CHANGE_TRUST_AGENT_SETTINGS;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -56,20 +57,18 @@
 
     private final LockPatternUtils mLockPatternUtils;
     private final TrustAgentManager mTrustAgentManager;
-    private final Activity mActivity;
     private final SecuritySettingsV2 mHost;
 
     private Intent mTrustAgentClickIntent;
     private PreferenceCategory mSecurityCategory;
 
-    public TrustAgentListPreferenceController(Activity activity, SecuritySettingsV2 host,
+    public TrustAgentListPreferenceController(Context context, SecuritySettingsV2 host,
             Lifecycle lifecycle) {
-        super(activity);
-        final SecurityFeatureProvider provider = FeatureFactory.getFactory(activity)
+        super(context);
+        final SecurityFeatureProvider provider = FeatureFactory.getFactory(context)
                 .getSecurityFeatureProvider();
-        mActivity = activity;
         mHost = host;
-        mLockPatternUtils = provider.getLockPatternUtils(activity);
+        mLockPatternUtils = provider.getLockPatternUtils(context);
         mTrustAgentManager = provider.getTrustAgentManager();
         if (lifecycle != null) {
             lifecycle.addObserver(this);
@@ -90,6 +89,7 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mSecurityCategory = (PreferenceCategory) screen.findPreference(PREF_KEY_SECURITY_CATEGORY);
+        updateTrustAgents();
     }
 
     @Override
@@ -112,7 +112,8 @@
         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             return super.handlePreferenceTreeClick(preference);
         }
-        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(mActivity, mHost);
+        final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(
+                mHost.getActivity(), mHost);
         mTrustAgentClickIntent = preference.getIntent();
         boolean confirmationLaunched = helper.launchConfirmationActivity(
                 CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
@@ -127,6 +128,10 @@
 
     @Override
     public void onResume() {
+        updateTrustAgents();
+    }
+
+    private void updateTrustAgents() {
         if (mSecurityCategory == null) {
             return;
         }
@@ -167,7 +172,7 @@
 
     public boolean handleActivityResult(int requestCode, int resultCode) {
         if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
-            if (mTrustAgentClickIntent != null){
+            if (mTrustAgentClickIntent != null) {
                 mHost.startActivity(mTrustAgentClickIntent);
                 mTrustAgentClickIntent = null;
             }
diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java
index d3fcf9a..3b5d623 100644
--- a/src/com/android/settings/support/SupportDashboardActivity.java
+++ b/src/com/android/settings/support/SupportDashboardActivity.java
@@ -21,7 +21,6 @@
 import android.os.Bundle;
 
 import com.android.settings.R;
-import com.android.settings.Settings.LegacySupportActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.overlay.SupportFeatureProvider;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -43,12 +42,10 @@
                 .getSupportFeatureProvider(this);
 
         // try to launch support v2 if we have the feature provider
-        if (supportFeatureProvider != null && supportFeatureProvider.isSupportV2Enabled()) {
-            supportFeatureProvider.startSupportV2(this);
-        } else {
-            startActivity(new Intent(this, LegacySupportActivity.class));
+        if (supportFeatureProvider != null) {
+          supportFeatureProvider.startSupportV2(this);
+          finish();
         }
-        finish();
     }
 
     /**
diff --git a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
deleted file mode 100644
index 07a451a..0000000
--- a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (C) 2016 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.support;
-
-import android.accounts.Account;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.text.Annotation;
-import android.text.Spannable;
-import android.text.Spanned;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.text.style.URLSpan;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.TextView;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.overlay.SupportFeatureProvider;
-
-/**
- * {@link DialogFragment} for support disclaimer.
- */
-public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFragment
-        implements DialogInterface.OnClickListener {
-
-    public static final String TAG = "SupportDisclaimerDialog";
-    public static final String EXTRA_TYPE = "extra_type";
-    public static final String EXTRA_ACCOUNT = "extra_account";
-
-    public static SupportDisclaimerDialogFragment newInstance(Account account,
-            @SupportFeatureProvider.SupportType int type) {
-        final SupportDisclaimerDialogFragment fragment = new SupportDisclaimerDialogFragment();
-        final Bundle bundle = new Bundle(2);
-        bundle.putParcelable(SupportDisclaimerDialogFragment.EXTRA_ACCOUNT, account);
-        bundle.putInt(SupportDisclaimerDialogFragment.EXTRA_TYPE, type);
-        fragment.setArguments(bundle);
-        return fragment;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
-                .setTitle(R.string.support_disclaimer_title)
-                .setPositiveButton(android.R.string.ok, this)
-                .setNegativeButton(android.R.string.cancel, this);
-        final View content = LayoutInflater.from(builder.getContext())
-                .inflate(R.layout.support_disclaimer_content, null);
-        final TextView disclaimer = (TextView) content.findViewById(R.id.support_disclaimer_text);
-        final Activity activity = getActivity();
-        final SupportFeatureProvider supportFeatureProvider =
-                FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
-
-        // sets the two links that go to privacy policy and terms of service
-        disclaimer.setText(supportFeatureProvider.getDisclaimerStringResId());
-        Spannable viewText = (Spannable) disclaimer.getText();
-        stripUnderlines(viewText);
-        SystemInformationSpan.linkify(viewText, this);
-        // sets the link that launches a dialog to expose the signals we are sending
-        return builder
-                .setView(content)
-                .create();
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (which == Dialog.BUTTON_NEGATIVE) {
-            mMetricsFeatureProvider.action(getContext(),
-                    MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_CANCEL);
-            return;
-        }
-        final Activity activity = getActivity();
-        final CheckBox doNotShow =
-                (CheckBox) getDialog().findViewById(R.id.support_disclaimer_do_not_show_again);
-        final boolean isChecked = doNotShow.isChecked();
-        final SupportFeatureProvider supportFeatureProvider =
-                FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
-        supportFeatureProvider.setShouldShowDisclaimerDialog(getContext(), !isChecked);
-        final Bundle bundle = getArguments();
-        if (isChecked) {
-            mMetricsFeatureProvider.action(activity,
-                    MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED);
-        }
-        mMetricsFeatureProvider.action(activity,
-                MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_OK);
-        supportFeatureProvider.startSupport(getActivity(),
-                bundle.getParcelable(EXTRA_ACCOUNT), bundle.getInt(EXTRA_TYPE));
-    }
-
-    @Override
-    public void onCancel(DialogInterface dialog) {
-        super.onCancel(dialog);
-        mMetricsFeatureProvider.action(getContext(),
-                MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_CANCEL);
-    }
-
-    /**
-     * Removes the underlines of {@link android.text.style.URLSpan}s.
-     */
-    private static void stripUnderlines(Spannable input) {
-        final URLSpan[] urls = input.getSpans(0, input.length(), URLSpan.class);
-
-        for (URLSpan span : urls) {
-            final int start = input.getSpanStart(span);
-            final int end = input.getSpanEnd(span);
-            if (!TextUtils.isEmpty(span.getURL())) {
-                input.removeSpan(span);
-                input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
-                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-            }
-        }
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.DIALOG_SUPPORT_DISCLAIMER;
-    }
-
-    /**
-     * A {@link URLSpan} that doesn't decorate the link with underline.
-     */
-    public static class NoUnderlineUrlSpan extends URLSpan {
-
-        public NoUnderlineUrlSpan(String url) {
-            super(url);
-        }
-
-        @Override
-        public void updateDrawState(TextPaint ds) {
-            super.updateDrawState(ds);
-            ds.setUnderlineText(false);
-        }
-    }
-
-    /**
-     * A {@link URLSpan} that opens a dialog when clicked
-     */
-    public static class SystemInformationSpan extends URLSpan {
-
-        private static final String ANNOTATION_URL = "url";
-        private final DialogFragment mDialog;
-        private SupportFeatureProvider mSupport;
-
-        public SystemInformationSpan(DialogFragment parent) {
-            // sets the url to empty string so we can prevent the NoUnderlineUrlSpan from stripping
-            // this one
-            super("");
-            mSupport  = FeatureFactory.getFactory(parent.getContext())
-                    .getSupportFeatureProvider(parent.getContext());
-            mDialog = parent;
-        }
-
-        @Override
-        public void onClick(View widget) {
-            Activity activity =  mDialog.getActivity();
-            if (mSupport != null && activity != null) {
-                // launch the system info fragment
-                mSupport.launchSystemInfoFragment(mDialog.getArguments(),
-                        activity.getFragmentManager());
-
-                // dismiss this fragment
-                mDialog.dismiss();
-            }
-        }
-
-        @Override
-        public void updateDrawState(TextPaint ds) {
-            super.updateDrawState(ds);
-            // remove underline
-            ds.setUnderlineText(false);
-        }
-
-        /**
-         * This method takes a string and turns it into a url span that will launch a
-         * SupportSystemInformationDialogFragment
-         * @param msg The text to turn into a link
-         * @param parent The dialog the text is in
-         * @return A CharSequence containing the original text content as a url
-         */
-        public static CharSequence linkify(Spannable msg, DialogFragment parent) {
-            Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
-            for (Annotation annotation : spans) {
-                int start = msg.getSpanStart(annotation);
-                int end = msg.getSpanEnd(annotation);
-                if (ANNOTATION_URL.equals(annotation.getValue())) {
-                    SystemInformationSpan link = new SystemInformationSpan(parent);
-                    msg.removeSpan(annotation);
-                    msg.setSpan(link, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-                }
-            }
-            return msg;
-        }
-
-        @VisibleForTesting
-        public void setSupportProvider(SupportFeatureProvider prov) {
-            mSupport = prov;
-        }
-    }
-}
diff --git a/src/com/android/settings/support/SupportPhoneDialogFragment.java b/src/com/android/settings/support/SupportPhoneDialogFragment.java
deleted file mode 100644
index 8abdae0..0000000
--- a/src/com/android/settings/support/SupportPhoneDialogFragment.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2016 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.support;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-
-import java.util.Locale;
-
-/**
- * A dialog fragment that displays support phone numbers.
- */
-public final class SupportPhoneDialogFragment extends InstrumentedDialogFragment
-        implements View.OnClickListener {
-
-    public static final String TAG = "SupportPhoneDialog";
-    private static final String EXTRA_PHONE = "extra_phone";
-
-    public static SupportPhoneDialogFragment newInstance(SupportPhone phone) {
-        final SupportPhoneDialogFragment fragment = new SupportPhoneDialogFragment();
-        final Bundle bundle = new Bundle(2);
-        bundle.putParcelable(EXTRA_PHONE, phone);
-        fragment.setArguments(bundle);
-        return fragment;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final SupportPhone phone = getArguments().getParcelable(EXTRA_PHONE);
-        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
-                .setTitle(R.string.support_international_phone_title);
-        final View content = LayoutInflater.from(builder.getContext())
-                .inflate(R.layout.support_phone_dialog_content, null);
-        final View phoneNumberContainer = content.findViewById(R.id.phone_number_container);
-        final TextView phoneView = (TextView) content.findViewById(R.id.phone_number);
-        final String formattedPhoneNumber = getContext().getString(
-                R.string.support_phone_international_format,
-                new Locale(phone.language).getDisplayLanguage(), phone.number);
-        phoneView.setText(formattedPhoneNumber);
-        phoneNumberContainer.setOnClickListener(this);
-        return builder
-                .setView(content)
-                .create();
-    }
-
-    @Override
-    public void onClick(View v) {
-        final SupportPhone phone = getArguments().getParcelable(EXTRA_PHONE);
-        final Activity activity = getActivity();
-        final Intent intent = phone.getDialIntent();
-        final boolean canDial = !activity.getPackageManager()
-                .queryIntentActivities(intent, 0)
-                .isEmpty();
-        if (canDial) {
-            mMetricsFeatureProvider.action(getActivity(),
-                    MetricsProto.MetricsEvent.ACTION_SUPPORT_DIAL_TOLLED);
-            getActivity().startActivity(intent);
-        }
-        dismiss();
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.DIALOG_SUPPORT_PHONE;
-    }
-}
diff --git a/src/com/android/settings/utils/AnnotationSpan.java b/src/com/android/settings/utils/AnnotationSpan.java
new file mode 100644
index 0000000..645351d
--- /dev/null
+++ b/src/com/android/settings/utils/AnnotationSpan.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.utils;
+
+import android.text.Annotation;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.TextPaint;
+import android.text.style.URLSpan;
+import android.view.View;
+
+/**
+ * This class is used to add {@link View.OnClickListener} for the text been wrapped by
+ * annotation.
+ */
+public class AnnotationSpan extends URLSpan {
+    private final View.OnClickListener mClickListener;
+
+    private AnnotationSpan(View.OnClickListener lsn) {
+        super((String) null);
+        mClickListener = lsn;
+    }
+
+    @Override
+    public void onClick(View widget) {
+        if (mClickListener != null) {
+            mClickListener.onClick(widget);
+        }
+    }
+
+    @Override
+    public void updateDrawState(TextPaint ds) {
+        super.updateDrawState(ds);
+        ds.setUnderlineText(false);
+    }
+
+    public static CharSequence linkify(CharSequence rawText, LinkInfo... linkInfos) {
+        SpannableString msg = new SpannableString(rawText);
+        Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
+        SpannableStringBuilder builder = new SpannableStringBuilder(msg);
+        for (Annotation annotation : spans) {
+            final String key = annotation.getValue();
+            int start = msg.getSpanStart(annotation);
+            int end = msg.getSpanEnd(annotation);
+            AnnotationSpan link = null;
+            for (LinkInfo linkInfo : linkInfos) {
+                if (linkInfo.annotation.equals(key)) {
+                    link = new AnnotationSpan(linkInfo.listener);
+                    break;
+                }
+            }
+            if (link != null) {
+                builder.setSpan(link, start, end, msg.getSpanFlags(link));
+            }
+        }
+        return builder;
+    }
+
+    /**
+     * Data class to store the annotation and the click action
+     */
+    public static class LinkInfo {
+        public final String annotation;
+        public final View.OnClickListener listener;
+
+        public LinkInfo(String annotation, View.OnClickListener listener) {
+            this.annotation = annotation;
+            this.listener = listener;
+        }
+    }
+}
diff --git a/src/com/android/settings/widget/MasterCheckBoxPreference.java b/src/com/android/settings/widget/MasterCheckBoxPreference.java
new file mode 100644
index 0000000..333c9aa
--- /dev/null
+++ b/src/com/android/settings/widget/MasterCheckBoxPreference.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import android.content.Context;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+
+import com.android.settings.R;
+import com.android.settingslib.TwoTargetPreference;
+
+/**
+ * A custom preference that provides inline checkbox. It has a mandatory field for title, and
+ * optional fields for icon and sub-text.
+ */
+public class MasterCheckBoxPreference extends TwoTargetPreference {
+
+    private CheckBox mCheckBox;
+    private boolean mChecked;
+
+    public MasterCheckBoxPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    public MasterCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public MasterCheckBoxPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MasterCheckBoxPreference(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected int getSecondTargetResId() {
+        return R.layout.preference_widget_master_checkbox;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        final View widgetView = holder.findViewById(android.R.id.widget_frame);
+        if (widgetView != null) {
+            widgetView.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (mCheckBox != null && !mCheckBox.isEnabled()) {
+                        return;
+                    }
+                    setChecked(!mChecked);
+                    if (!callChangeListener(mChecked)) {
+                        setChecked(!mChecked);
+                    } else {
+                        persistBoolean(mChecked);
+                    }
+                }
+            });
+        }
+
+        mCheckBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        if (mCheckBox != null) {
+            mCheckBox.setContentDescription(getTitle());
+            mCheckBox.setChecked(mChecked);
+        }
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        super.setEnabled(enabled);
+        if (mCheckBox != null) {
+            mCheckBox.setEnabled(enabled);
+        }
+    }
+
+    public boolean isChecked() {
+        return mCheckBox != null && mChecked;
+    }
+
+    public void setChecked(boolean checked) {
+        mChecked = checked;
+        if (mCheckBox != null) {
+            mCheckBox.setChecked(checked);
+        }
+    }
+
+    public CheckBox getCheckBox() {
+        return mCheckBox;
+    }
+}
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
index 146893c..6a831b0 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1,3 +1,3 @@
 com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
 com.android.settings.search.indexing.FakeSettingsFragment
-com.android.settings.security.SecuritySettingsV2
\ No newline at end of file
+com.android.settings.security.SecuritySettings
\ No newline at end of file
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 7ae7c1f..e10fee1 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -30,4 +30,5 @@
     <bool name="config_show_wallpaper_attribution">false</bool>
     <bool name="config_show_default_home">false</bool>
     <bool name="config_show_accessibility_shortcut_preference">false</bool>
+    <bool name="config_show_assist_and_voice_input">false</bool>
 </resources>
diff --git a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
index 60972ee..1f701c2 100644
--- a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
@@ -21,9 +21,12 @@
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
 import android.os.UserHandle;
+import android.view.View;
+import android.widget.Button;
 
 import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
 import com.android.settings.password.ChooseLockPattern.IntentBuilder;
@@ -40,6 +43,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowAlertDialog;
 import org.robolectric.shadows.ShadowPackageManager.ComponentState;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -85,6 +89,19 @@
                 .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
     }
 
+    @Test
+    public void screenLockOptions_shouldBeVisible() {
+        Button button = mActivity.findViewById(R.id.screen_lock_options);
+        assertThat(button).isNotNull();
+        assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
+
+        button.performClick();
+        AlertDialog chooserDialog = ShadowAlertDialog.getLatestAlertDialog();
+        assertThat(chooserDialog).isNotNull();
+        int count = Shadows.shadowOf(chooserDialog).getAdapter().getCount();
+        assertThat(count).named("List items shown").isEqualTo(3);
+    }
+
     private ChooseLockPatternFragment findFragment(Activity activity) {
         return (ChooseLockPatternFragment)
                 activity.getFragmentManager().findFragmentById(R.id.main_content);
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index 180abbb..eeaba21 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -50,6 +50,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
@@ -62,26 +63,33 @@
     private static final String TEST_KEY = "test_pref_key";
 
     @Mock
-    private Context mContext;
-    @Mock
     private SearchManager mSearchManager;
     @Mock
     private PackageManager mPackageManager;
+
+    private Context mContext;
     private DefaultAssistPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
         mController = new DefaultAssistPreferenceController(mContext, TEST_KEY,
                 true /* showSetting */);
     }
 
     @Test
-    public void isAlwaysAvailable() {
+    public void testAssistAndVoiceInput_byDefault_shouldBeShown() {
         assertThat(mController.isAvailable()).isTrue();
     }
 
     @Test
+    @Config(qualifiers = "mcc999")
+    public void testAssistAndVoiceInput_ifDisabled_shouldNotBeShown() {
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
     public void getPrefKey_shouldReturnKey() {
         assertThat(mController.getPreferenceKey())
                 .isEqualTo(TEST_KEY);
@@ -91,7 +99,8 @@
     @Config(shadows = {ShadowSecureSettings.class})
     public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() {
         final String flattenKey = "com.android.settings/assist";
-        Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey);
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                flattenKey);
         DefaultAppInfo appInfo = mController.getDefaultAppInfo();
 
         assertThat(appInfo.getKey()).isEqualTo(flattenKey);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
index cda9a22..7ec2c58 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
@@ -17,10 +17,11 @@
 package com.android.settings.dashboard;
 
 import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
 import android.widget.TextView;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-import com.android.settings.dashboard.SupportItemAdapter.ViewHolder;
 import com.android.settingslib.drawer.Tile;
 import org.junit.Before;
 import org.junit.Test;
@@ -68,4 +69,12 @@
                 .animateChange(mViewHolder, mViewHolder, 0, 1, 0, 1);
         assertThat(hasPendingAnimation).isFalse();
     }
+
+    // Sample viewholder to use for test
+    static final class ViewHolder extends RecyclerView.ViewHolder {
+
+        ViewHolder(View itemView) {
+            super(itemView);
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/SupportItemAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/SupportItemAdapterTest.java
deleted file mode 100644
index 3dd5266..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/SupportItemAdapterTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2016 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.dashboard;
-
-import android.accounts.Account;
-import android.app.Activity;
-import android.content.Intent;
-import android.provider.Settings;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Spinner;
-import android.widget.SpinnerAdapter;
-
-import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.dashboard.SupportItemAdapter.EscalationData;
-import com.android.settings.overlay.SupportFeatureProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowActivity;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.robolectric.Shadows.shadowOf;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SupportItemAdapterTest {
-    private static final String ACCOUNT_TYPE = "com.google";
-    private final Account USER_1 = new Account("user1", ACCOUNT_TYPE);
-    private final Account USER_2 = new Account("user2", ACCOUNT_TYPE);
-    private final Account TWO_ACCOUNTS[] = {USER_1, USER_2};
-    private final Account ONE_ACCOUNT[] = {USER_1};
-    private final Account ZERO_ACCOUNT[] = {};
-
-    private ShadowActivity mShadowActivity;
-    private Activity mActivity;
-    private SupportItemAdapter mSupportItemAdapter;
-    private SupportItemAdapter.ViewHolder mViewHolder;
-    @Mock
-    private SupportFeatureProvider mSupportFeatureProvider;
-    @Mock
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mActivity = Robolectric.setupActivity(Activity.class);
-        mShadowActivity = shadowOf(mActivity);
-
-        final View itemView = LayoutInflater.from(mActivity).inflate(
-                R.layout.support_escalation_options, null);
-        mViewHolder = new SupportItemAdapter.ViewHolder(itemView);
-
-        // Mock this to prevent crash in testing
-        when(mSupportFeatureProvider.getAccountLoginIntent()).thenReturn(
-                new Intent(Settings.ACTION_ADD_ACCOUNT));
-    }
-
-    @Test
-    public void testBindAccountPicker_TwoAccounts_ShouldHaveTwoAccounts() {
-        testBindAccountPickerInner(mViewHolder, TWO_ACCOUNTS);
-    }
-
-    @Test
-    public void testBindAccountPicker_OneAccount_ShouldHaveOneAccount() {
-        testBindAccountPickerInner(mViewHolder, ONE_ACCOUNT);
-    }
-
-    @Test
-    public void testOnSpinnerItemClick_AddAccountClicked_AccountLoginIntentInvoked() {
-        bindAccountPickerInner(mViewHolder, TWO_ACCOUNTS);
-
-        final Spinner spinner = (Spinner) mViewHolder.itemView.findViewById(R.id.account_spinner);
-        spinner.setSelection(TWO_ACCOUNTS.length);
-
-        Robolectric.flushForegroundThreadScheduler();
-
-        verify(mSupportFeatureProvider).getAccountLoginIntent();
-    }
-
-    @Test
-    public void testSetAccount_AccountEmpty_NotCrash() {
-        when(mSupportFeatureProvider.getSupportEligibleAccounts(mActivity)).thenReturn(
-                ZERO_ACCOUNT);
-        mSupportItemAdapter = new SupportItemAdapter(mActivity, null, mSupportFeatureProvider,
-                mMetricsFeatureProvider, null);
-
-        // Should not crash in this method
-        mSupportItemAdapter.setAccounts(ONE_ACCOUNT);
-
-        verify(mSupportFeatureProvider).getSupportEligibleAccounts(mActivity);
-    }
-
-    @Test
-    public void testRefreshData_CardUpdatedOnEnteringOrLeavingSupportHours() {
-        // pretend we have support right now
-        when(mSupportFeatureProvider.isSupportTypeEnabled(any(), anyInt()))
-                .thenReturn(true);
-        when(mSupportFeatureProvider.isOperatingNow(anyInt())).thenReturn(true);
-        when(mSupportFeatureProvider.getSupportEligibleAccounts(any())).thenReturn(ONE_ACCOUNT);
-        mSupportItemAdapter = new SupportItemAdapter(mActivity, null, mSupportFeatureProvider,
-                mMetricsFeatureProvider, null);
-
-        // If this doesn't return escalation data something has gone wrong
-        EscalationData data = (EscalationData) mSupportItemAdapter.getSupportData().get(0);
-
-        // precondition, support is enabled
-        assertThat(data.enabled1).isTrue();
-
-        // pretend we support hours are over
-        when(mSupportFeatureProvider.isOperatingNow(anyInt())).thenReturn(false);
-        mSupportItemAdapter.refreshData();
-        data = (EscalationData) mSupportItemAdapter.getSupportData().get(0);
-
-        assertThat(data.enabled1).isFalse();
-
-        // pretend support hours have started again
-        when(mSupportFeatureProvider.isOperatingNow(anyInt())).thenReturn(true);
-        mSupportItemAdapter.refreshData();
-        data = (EscalationData) mSupportItemAdapter.getSupportData().get(0);
-
-        assertThat(data.enabled1).isTrue();
-    }
-
-    /**
-     * Check after {@link SupportItemAdapter#bindAccountPicker(SupportItemAdapter.ViewHolder)} is
-     * invoked, whether the spinner in {@paramref viewHolder} has all the data from {@paramref
-     * accounts}
-     *
-     * @param viewHolder holds the view that contains the spinner to test
-     * @param accounts holds the accounts info to be showed in spinner.
-     */
-    private void testBindAccountPickerInner(SupportItemAdapter.ViewHolder viewHolder,
-            Account accounts[]) {
-        bindAccountPickerInner(viewHolder, accounts);
-
-        final Spinner spinner = (Spinner) viewHolder.itemView.findViewById(R.id.account_spinner);
-        final SpinnerAdapter adapter = spinner.getAdapter();
-
-        // Contains "Add account" option, so should be 'count+1'
-        assertThat(adapter.getCount()).isEqualTo(accounts.length + 1);
-        for (int i = 0; i < accounts.length; i++) {
-            assertThat(adapter.getItem(i)).isEqualTo(accounts[i].name);
-        }
-    }
-
-    /**
-     * Create {@link SupportItemAdapter} and bind the account picker view into
-     * {@paramref viewholder}
-     *
-     * @param viewHolder holds the view that contains the spinner to test
-     * @param accounts holds the accounts info to be showed in spinner.
-     */
-    private void bindAccountPickerInner(SupportItemAdapter.ViewHolder viewHolder,
-            Account accounts[]) {
-        when(mSupportFeatureProvider.getSupportEligibleAccounts(mActivity)).thenReturn(accounts);
-        mSupportItemAdapter = new SupportItemAdapter(mActivity, null, mSupportFeatureProvider,
-                mMetricsFeatureProvider, null);
-
-        mSupportItemAdapter.bindAccountPicker(viewHolder);
-    }
-
-}
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java
index 4074e25..d0552ec 100644
--- a/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/BluetoothInbandRingingPreferenceControllerTest.java
@@ -18,7 +18,7 @@
 
 
 import static com.android.settings.development.BluetoothInbandRingingPreferenceController
-        .BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY;
+        .BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -84,7 +84,7 @@
         mController.onPreferenceChange(mPreference, true /* new value */);
 
         final boolean mode = SettingsShadowSystemProperties.getBoolean(
-                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+                BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY, false /* default */);
 
         assertThat(mode).isTrue();
     }
@@ -94,14 +94,14 @@
         mController.onPreferenceChange(mPreference, false /* new value */);
 
         final boolean mode = SettingsShadowSystemProperties.getBoolean(
-                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+                BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY, false /* default */);
 
         assertThat(mode).isFalse();
     }
 
     @Test
     public void updateState_settingEnabled_preferenceShouldBeChecked() {
-        SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
+        SettingsShadowSystemProperties.set(BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY,
                 Boolean.toString(true));
         mController.updateState(mPreference);
 
@@ -110,7 +110,7 @@
 
     @Test
     public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
-        SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY,
+        SettingsShadowSystemProperties.set(BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY,
                 Boolean.toString(false));
         mController.updateState(mPreference);
 
@@ -122,11 +122,11 @@
         mController.onDeveloperOptionsDisabled();
 
         final boolean mode = SettingsShadowSystemProperties.getBoolean(
-                BLUETOOTH_ENABLE_INBAND_RINGING_PROPERTY, false /* default */);
+                BLUETOOTH_DISABLE_INBAND_RINGING_PROPERTY, false /* default */);
 
-        assertThat(mode).isTrue();
+        assertThat(mode).isFalse();
         verify(mPreference).setEnabled(false);
-        verify(mPreference).setChecked(true);
+        verify(mPreference).setChecked(false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
new file mode 100644
index 0000000..cf892f8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import static com.android.settings.development.BluetoothMaxConnectedAudioDevicesPreferenceController
+        .BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {SettingsShadowSystemProperties.class})
+public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    private Context mContext;
+    private ListPreference mPreference;
+    private BluetoothMaxConnectedAudioDevicesPreferenceController mController;
+
+    /**
+     * 0: 1 device maximum (Default)
+     * 1: 2 devices maximum
+     * 2: 3 devices maximum
+     * 3: 4 devices maximum
+     * 4: 5 devices maximum
+     */
+    private String[] mListValues;
+    private String[] mListSummaries;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new ListPreference(mContext);
+        mListValues = mContext.getResources().getStringArray(
+                R.array.bluetooth_max_connected_audio_devices_values);
+        mListSummaries = mContext.getResources().getStringArray(
+                R.array.bluetooth_max_connected_audio_devices);
+        mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mContext);
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+                mPreference);
+        mController.displayPreference(mPreferenceScreen);
+    }
+
+    @After
+    public void teardown() {
+        SettingsShadowSystemProperties.clear();
+    }
+
+    @Test
+    public void onPreferenceChange_setNumberOfDevices() {
+        for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
+            mController.onPreferenceChange(mPreference, mListValues[numberOfDevices]);
+
+            final String currentValue = SystemProperties.get(
+                    BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
+
+            assertThat(currentValue).isEqualTo(mListValues[numberOfDevices]);
+            assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
+            assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+        }
+    }
+
+    @Test
+    public void updateState_NumberOfDevicesUpdated_shouldSetPreference() {
+        for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
+            SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY,
+                    mListValues[numberOfDevices]);
+
+            mController.updateState(mPreference);
+
+            assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
+            assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+        }
+    }
+
+    @Test
+    public void updateState_noValueSet_shouldSetDefaultTo1device() {
+        SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, "garbage");
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo(mListValues[0]);
+        assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[0]);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+        mController.onDeveloperOptionsSwitchDisabled();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.getValue()).isEqualTo(mListValues[0]);
+        assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[0]);
+        final String currentValue = SystemProperties.get(
+                BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
+        assertThat(currentValue).isEqualTo(mListValues[0]);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
+        for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
+            mController.onDeveloperOptionsSwitchDisabled();
+            assertThat(mPreference.isEnabled()).isFalse();
+
+            SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY,
+                    mListValues[numberOfDevices]);
+            mController.onDeveloperOptionsSwitchEnabled();
+
+            assertThat(mPreference.isEnabled()).isTrue();
+            assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
+            assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollSuggestionActivityTest.java
index e299fd5..66114aa 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollSuggestionActivityTest.java
@@ -58,7 +58,8 @@
                 .thenReturn(mDevicePolicyManager);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt()))
                 .thenReturn(0);
-        when(mContext.getSystemService(FingerprintManager.class)).thenReturn(mFingerprintManager);
+        when(mContext.getSystemService(Context.FINGERPRINT_SERVICE))
+                .thenReturn(mFingerprintManager);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceControllerTest.java
new file mode 100644
index 0000000..9993a95
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintProfileStatusPreferenceControllerTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fingerprint;
+
+import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.UserManager;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class FingerprintProfileStatusPreferenceControllerTest {
+
+    private static final int FAKE_PROFILE_USER_ID = 1234;
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private FingerprintManager mFingerprintManager;
+    @Mock
+    private UserManager mUm;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private FingerprintProfileStatusPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)).thenReturn(true);
+        ShadowApplication.getInstance().setSystemService(Context.FINGERPRINT_SERVICE,
+                mFingerprintManager);
+        ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUm);
+
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        when(mUm.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {1234});
+        mController = new FingerprintProfileStatusPreferenceController(mContext);
+    }
+
+    @Test
+    public void getUserId_shouldReturnProfileId() {
+        assertThat(mController.getUserId()).isEqualTo(FAKE_PROFILE_USER_ID);
+    }
+
+    @Test
+    public void isUserSupported_separateChallengeAllowed_true() {
+        when(mLockPatternUtils.isSeparateProfileChallengeAllowed(anyInt())).thenReturn(true);
+        assertThat(mController.isUserSupported()).isTrue();
+    }
+
+    @Test
+    public void isUserSupported_separateChallengeNotAllowed_false() {
+        when(mLockPatternUtils.isSeparateProfileChallengeAllowed(anyInt())).thenReturn(false);
+
+        assertThat(mController.isUserSupported()).isFalse();
+    }
+
+    @Test
+    public void getAvailabilityStatus_userNotSupported_DISABLED() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        when(mLockPatternUtils.isSeparateProfileChallengeAllowed(anyInt())).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintStatusPreferenceControllerTest.java
new file mode 100644
index 0000000..ab53382
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintStatusPreferenceControllerTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fingerprint;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Arrays;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class FingerprintStatusPreferenceControllerTest {
+
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private FingerprintManager mFingerprintManager;
+    @Mock
+    private UserManager mUm;
+    @Mock
+    private PackageManager mPackageManager;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private FingerprintStatusPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)).thenReturn(true);
+        ShadowApplication.getInstance().setSystemService(Context.FINGERPRINT_SERVICE,
+                mFingerprintManager);
+        ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUm);
+        mPreference = new Preference(mContext);
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        when(mUm.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {1234});
+        mController = new FingerprintStatusPreferenceController(mContext);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noFingerprintManger_DISABLED() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasFingerprintManger_AVAILABLE() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void updateState_notSupported_shouldDoNothing() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void updateState_noFingerprint_shouldShowDefaultSummary() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.security_settings_fingerprint_preference_summary_none));
+        assertThat(mPreference.isVisible()).isTrue();
+        assertThat(mPreference.getOnPreferenceClickListener()).isNotNull();
+    }
+
+    @Test
+    public void updateState_hasFingerprint_shouldShowSummary() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(Arrays.asList(mock(Fingerprint.class)));
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getQuantityString(
+                R.plurals.security_settings_fingerprint_preference_summary, 1, 1));
+        assertThat(mPreference.isVisible()).isTrue();
+        assertThat(mPreference.getOnPreferenceClickListener()).isNotNull();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
index bc5b1d7..45448a9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
@@ -401,18 +401,6 @@
     }
 
     @Test
-    public void testNonIndexableKeys_MatchPreferenceKeys() {
-        final Context context = RuntimeEnvironment.application;
-        final List<String> niks = PowerUsageSummary.SEARCH_INDEX_DATA_PROVIDER
-                .getNonIndexableKeys(context);
-
-        final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context,
-                R.xml.power_usage_summary);
-
-        assertThat(keys).containsAllIn(niks);
-    }
-
-    @Test
     public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
         final Context context = RuntimeEnvironment.application;
         final PowerUsageSummary fragment = new PowerUsageSummary();
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
index f3cc2ca..86fd267 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -59,8 +59,7 @@
         MockitoAnnotations.initMocks(this);
         mController = new SwipeToNotificationPreferenceController(mContext, null, KEY_SWIPE_DOWN);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        // Explicit casting to object due to MockitoCast bug
-        when((Object) mContext.getSystemService(FingerprintManager.class))
+        when(mContext.getSystemService(Context.FINGERPRINT_SERVICE))
                 .thenReturn(mFingerprintManager);
     }
 
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogFragmentTest.java
index f1d7a73..bba689b 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogFragmentTest.java
@@ -50,7 +50,6 @@
     private PrivateDnsModeDialogFragment mFragment;
     private Button mSaveButton;
 
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index 28be616..cd5fcc2 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -135,11 +135,9 @@
         fragment.onLockTypeSelected(ScreenLockType.PATTERN);
 
         ShadowActivity shadowActivity = shadowOf(activity);
-        IntentForResult chooseLockIntent = shadowActivity.getNextStartedActivityForResult();
-        assertThat(chooseLockIntent).isNotNull();
-        assertThat(chooseLockIntent.requestCode)
-                .isEqualTo(SetupChooseLockPasswordFragment.REQUEST_SCREEN_LOCK_OPTIONS);
-        assertThat(chooseLockIntent.intent.getStringExtra("foo")).named("Foo extra")
+        final Intent nextStartedActivity = shadowActivity.getNextStartedActivity();
+        assertThat(nextStartedActivity).isNotNull();
+        assertThat(nextStartedActivity.getStringExtra("foo")).named("Foo extra")
                 .isEqualTo("bar");
     }
 
diff --git a/tests/robotests/src/com/android/settings/security/LockUnificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/LockUnificationPreferenceControllerTest.java
new file mode 100644
index 0000000..7a5a9fa
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/LockUnificationPreferenceControllerTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security;
+
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LockUnificationPreferenceControllerTest {
+
+    private static final int FAKE_PROFILE_USER_ID = 1234;
+
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private UserManager mUm;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private SecuritySettingsV2 mHost;
+
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private LockUnificationPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUm);
+        when(mUm.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {FAKE_PROFILE_USER_ID});
+
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+
+        mController = new LockUnificationPreferenceController(mContext, mHost);
+        when(mScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreference);
+        mPreference = new Preference(mContext);
+    }
+
+    @Test
+    public void isAvailable_noProfile_false() {
+        ReflectionHelpers.setField(mController, "mProfileChallengeUserId", UserHandle.USER_NULL);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_separateChallengeNotAllowed_false() {
+        when(mLockPatternUtils.isSeparateProfileChallengeAllowed(anyInt())).thenReturn(false);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_separateChallengeAllowed_true() {
+        when(mLockPatternUtils.isSeparateProfileChallengeAllowed(anyInt())).thenReturn(true);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java
index 81e1481..3171c3d 100644
--- a/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/security/SecuritySettingsTest.java
@@ -23,13 +23,10 @@
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.hardware.fingerprint.FingerprintManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.UserManager.EnforcingUser;
@@ -87,54 +84,6 @@
     }
 
     @Test
-    public void testSummaryProvider_notListening() {
-        mSummaryProvider.setListening(false);
-
-        verifyNoMoreInteractions(mSummaryLoader);
-    }
-
-    @Test
-    public void testSummaryProvider_hasFingerPrint_hasStaticSummary() {
-        final FingerprintManager fpm = mock(FingerprintManager.class);
-        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
-                .thenReturn(true);
-
-        // Cast to Object to workaround a robolectric casting bug
-        when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm);
-        when(fpm.isHardwareDetected()).thenReturn(true);
-
-        mSummaryProvider.setListening(true);
-
-        verify(mContext).getString(R.string.security_dashboard_summary);
-    }
-
-    @Test
-    public void testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint() {
-        final FingerprintManager fpm = mock(FingerprintManager.class);
-        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
-                .thenReturn(false);
-
-        mSummaryProvider.setListening(true);
-
-        verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
-    }
-
-    @Test
-    public void testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint() {
-        final FingerprintManager fpm = mock(FingerprintManager.class);
-        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
-                .thenReturn(true);
-
-        // Cast to Object to workaround a robolectric casting bug
-        when((Object) mContext.getSystemService(FingerprintManager.class)).thenReturn(fpm);
-        when(fpm.isHardwareDetected()).thenReturn(false);
-
-        mSummaryProvider.setListening(true);
-
-        verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
-    }
-
-    @Test
     public void testInitTrustAgentPreference_secure_shouldSetSummaryToNumberOfTrustAgent() {
         final Preference preference = mock(Preference.class);
         final PreferenceScreen screen = mock(PreferenceScreen.class);
diff --git a/tests/robotests/src/com/android/settings/security/SecuritySettingsV2Test.java b/tests/robotests/src/com/android/settings/security/SecuritySettingsV2Test.java
new file mode 100644
index 0000000..f77903b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/SecuritySettingsV2Test.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SecuritySettingsV2Test {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private SummaryLoader mSummaryLoader;
+    @Mock
+    private FingerprintManager mFingerprintManager;
+    private SecuritySettings.SummaryProvider mSummaryProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getSystemService(Context.FINGERPRINT_SERVICE))
+                .thenReturn(mFingerprintManager);
+
+        mSummaryProvider = new SecuritySettings.SummaryProvider(mContext, mSummaryLoader);
+    }
+
+    @Test
+    public void testSummaryProvider_notListening() {
+        mSummaryProvider.setListening(false);
+
+        verifyNoMoreInteractions(mSummaryLoader);
+    }
+
+    @Test
+    public void testSummaryProvider_hasFingerPrint_hasStaticSummary() {
+        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
+                .thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mContext).getString(R.string.security_dashboard_summary);
+    }
+
+    @Test
+    public void testSummaryProvider_noFpFeature_shouldSetSummaryWithNoFingerprint() {
+        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
+                .thenReturn(false);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
+    }
+
+    @Test
+    public void testSummaryProvider_noFpHardware_shouldSetSummaryWithNoFingerprint() {
+        when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
+                .thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mContext).getString(R.string.security_dashboard_summary_no_fingerprint);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/VisiblePatternProfilePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/VisiblePatternProfilePreferenceControllerTest.java
new file mode 100644
index 0000000..dd98372
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/VisiblePatternProfilePreferenceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security;
+
+
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.UserManager;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class VisiblePatternProfilePreferenceControllerTest {
+
+    private static final int FAKE_PROFILE_USER_ID = 1234;
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private FingerprintManager mFingerprintManager;
+    @Mock
+    private UserManager mUm;
+
+    private Lifecycle mLifecycle;
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private VisiblePatternProfilePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)).thenReturn(true);
+        ShadowApplication.getInstance().setSystemService(Context.FINGERPRINT_SERVICE,
+                mFingerprintManager);
+        ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUm);
+
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        when(mUm.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {FAKE_PROFILE_USER_ID});
+
+        mLifecycle = new Lifecycle(() -> mLifecycle);
+        mController = new VisiblePatternProfilePreferenceController(mContext, mLifecycle);
+    }
+
+    @Test
+    public void getAvailabilityStatus_notSecure_DISABLED() {
+        when(mLockPatternUtils.isSecure(FAKE_PROFILE_USER_ID)).thenReturn(false);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(FAKE_PROFILE_USER_ID))
+                .thenReturn(PASSWORD_QUALITY_UNSPECIFIED);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_secureWithPassword_DISABLED() {
+        when(mLockPatternUtils.isSecure(FAKE_PROFILE_USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(FAKE_PROFILE_USER_ID))
+                .thenReturn(PASSWORD_QUALITY_ALPHABETIC);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_secureWithPattern_AVAILABLE() {
+        when(mLockPatternUtils.isSecure(FAKE_PROFILE_USER_ID)).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(FAKE_PROFILE_USER_ID))
+                .thenReturn(PASSWORD_QUALITY_SOMETHING);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/screenlock/LockScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/screenlock/LockScreenPreferenceControllerTest.java
new file mode 100644
index 0000000..671807b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/screenlock/LockScreenPreferenceControllerTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security.screenlock;
+
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LockScreenPreferenceControllerTest {
+
+    private static final int FAKE_PROFILE_USER_ID = 1234;
+
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private UserManager mUm;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private Lifecycle mLifecycle;
+    private FakeFeatureFactory mFeatureFactory;
+    private Context mContext;
+    private LockScreenPreferenceController mController;
+    private Preference mPreference;
+
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUm);
+
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(mContext))
+                .thenReturn(mLockPatternUtils);
+        when(mUm.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {FAKE_PROFILE_USER_ID});
+        mPreference = new Preference(mContext);
+        when(mScreen.findPreference(anyString())).thenReturn(mPreference);
+        mLifecycle = new Lifecycle(() -> mLifecycle);
+        mController = new LockScreenPreferenceController(mContext, mLifecycle);
+
+    }
+
+    @Test
+    public void getAvailabilityStatus_notSecure_lockscreenDisabled_DISABLED() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_notSecure_lockscreenEnabled_AVAILABLE() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_secure_hasLockScreen_AVAILABLE() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
+                .thenReturn(PASSWORD_QUALITY_ALPHABETIC);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_secure_noLockScreen_DISABLED() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
+                .thenReturn(PASSWORD_QUALITY_UNSPECIFIED);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void onResume_available_shouldShow() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
+                .thenReturn(PASSWORD_QUALITY_ALPHABETIC);
+
+        mController.displayPreference(mScreen);
+        mLifecycle.handleLifecycleEvent(ON_RESUME);
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onResume_unavailable_shouldHide() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
+                .thenReturn(PASSWORD_QUALITY_UNSPECIFIED);
+
+        mController.displayPreference(mScreen);
+        mLifecycle.handleLifecycleEvent(ON_RESUME);
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index a97780b..6913c0c 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -23,6 +23,7 @@
         .PREF_KEY_TRUST_AGENT;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -127,6 +128,6 @@
         mController.displayPreference(mScreen);
         mController.onResume();
 
-        verify(mCategory).addPreference(any(Preference.class));
+        verify(mCategory, atLeastOnce()).addPreference(any(Preference.class));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java b/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java
deleted file mode 100644
index 6aebe36..0000000
--- a/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.android.settings.support;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.directlyOn;
-
-import android.accounts.Account;
-import android.annotation.NonNull;
-import android.annotation.StringRes;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.text.Spannable;
-import android.text.style.URLSpan;
-import android.widget.CheckBox;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.overlay.SupportFeatureProvider;
-import com.android.settings.overlay.SupportFeatureProvider.SupportType;
-import com.android.settings.support.SupportDisclaimerDialogFragmentTest.SupportDisclaimerShadowResources;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.SettingsShadowResources;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.util.FragmentTestUtil;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
-        shadows = {SupportDisclaimerShadowResources.class})
-public class SupportDisclaimerDialogFragmentTest {
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    Context mContext;
-    private FakeFeatureFactory mFakeFeatureFactory;
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-    private SupportFeatureProvider mSupportFeatureProvider;
-
-    private final Account mFakeAccount = new Account("user1", "fake_type");
-
-    private static final int FAKE_RES_ID = -1000;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
-        mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
-        mSupportFeatureProvider = mFakeFeatureFactory.getSupportFeatureProvider(mContext);
-        when(mSupportFeatureProvider.getDisclaimerStringResId())
-                .thenReturn(FAKE_RES_ID);
-    }
-
-    @Test
-    public void onClick_DoNotShowCheckedLogsAction() {
-        SupportDisclaimerDialogFragment fragment =
-                SupportDisclaimerDialogFragment.newInstance(mFakeAccount, SupportType.CHAT);
-        FragmentTestUtil.startFragment(fragment);
-
-        // pretend the user selected to skip the dialog in the future
-        CheckBox doNotShow = (CheckBox) fragment.getDialog()
-                .findViewById(R.id.support_disclaimer_do_not_show_again);
-        doNotShow.setChecked(true);
-
-        // verify we logged the action
-        fragment.onClick(fragment.getDialog(), Dialog.BUTTON_POSITIVE);
-        verify(mMetricsFeatureProvider, times(1)).action(any(),
-                eq(MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED));
-    }
-
-    @Test
-    public void onClick_DoNotShowUncheckedDoesNotLogAction() {
-        SupportDisclaimerDialogFragment fragment =
-                SupportDisclaimerDialogFragment.newInstance(mFakeAccount, SupportType.CHAT);
-        FragmentTestUtil.startFragment(fragment);
-
-        // pretend the user selected to skip the dialog in the future
-        CheckBox doNotShow = (CheckBox) fragment.getDialog()
-                .findViewById(R.id.support_disclaimer_do_not_show_again);
-        doNotShow.setChecked(false);
-
-        // verify we logged the action
-        fragment.onClick(fragment.getDialog(), Dialog.BUTTON_POSITIVE);
-        verify(mMetricsFeatureProvider, never()).action(any(),
-                eq(MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED));
-    }
-
-    @Implements(Resources.class)
-    public static class SupportDisclaimerShadowResources extends SettingsShadowResources {
-
-        @Implementation
-        @NonNull public CharSequence getText(@StringRes int id) throws NotFoundException {
-            if (id == FAKE_RES_ID) {
-                Spannable text = Spannable.Factory.getInstance()
-                        .newSpannable("string with url");
-                text.setSpan(new URLSpan("https://google.com"), 0, 1,
-                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-                return text;
-            }
-            return directlyOn(realResources, Resources.class).getText(id);
-        }
-    }
-
-}
diff --git a/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java
new file mode 100644
index 0000000..e6530d5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/MasterCheckBoxPreferenceTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.CheckBox;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class MasterCheckBoxPreferenceTest {
+
+    private Context mContext;
+    private MasterCheckBoxPreference mPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new MasterCheckBoxPreference(mContext);
+    }
+
+    @Test
+    public void createNewPreference_shouldSetLayout() {
+        assertThat(mPreference.getWidgetLayoutResource())
+                .isEqualTo(R.layout.preference_widget_master_checkbox);
+    }
+
+    @Test
+    public void setChecked_shouldUpdateCheckBoxCheckedState() {
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+                LayoutInflater.from(mContext).inflate(
+                  R.layout.preference_widget_master_checkbox, null));
+        final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        mPreference.onBindViewHolder(holder);
+
+        mPreference.setChecked(true);
+        assertThat(checkBox.isChecked()).isTrue();
+
+        mPreference.setChecked(false);
+        assertThat(checkBox.isChecked()).isFalse();
+    }
+
+    @Test
+    public void setEnabled_shouldUpdateCheckBoxEnabledState() {
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+                LayoutInflater.from(mContext).inflate(
+                  R.layout.preference_widget_master_checkbox, null));
+        final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        mPreference.onBindViewHolder(holder);
+
+        mPreference.setEnabled(true);
+        assertThat(checkBox.isEnabled()).isTrue();
+
+        mPreference.setEnabled(false);
+        assertThat(checkBox.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void clickWidgetView_shouldToggleCheckBox() {
+        final LayoutInflater inflater = LayoutInflater.from(mContext);
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+                inflater.inflate(R.layout.preference_two_target, null));
+        final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
+        inflater.inflate(R.layout.preference_widget_master_checkbox, widgetView, true);
+        final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        mPreference.onBindViewHolder(holder);
+
+        widgetView.performClick();
+        assertThat(checkBox.isChecked()).isTrue();
+
+        widgetView.performClick();
+        assertThat(checkBox.isChecked()).isFalse();
+    }
+
+    @Test
+    public void clickWidgetView_shouldNotToggleCheckBoxIfDisabled() {
+        final LayoutInflater inflater = LayoutInflater.from(mContext);
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+                inflater.inflate(R.layout.preference_two_target, null));
+        final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
+        inflater.inflate(R.layout.preference_widget_master_checkbox, widgetView, true);
+        final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        mPreference.onBindViewHolder(holder);
+        mPreference.setEnabled(false);
+
+        widgetView.performClick();
+        assertThat(checkBox.isChecked()).isFalse();
+    }
+
+    @Test
+    public void clickWidgetView_shouldNotifyPreferenceChanged() {
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+                LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null));
+        final View widgetView = holder.findViewById(android.R.id.widget_frame);
+        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
+        mPreference.setOnPreferenceChangeListener(listener);
+        mPreference.onBindViewHolder(holder);
+
+        mPreference.setChecked(false);
+        widgetView.performClick();
+        verify(listener).onPreferenceChange(mPreference, true);
+
+        mPreference.setChecked(true);
+        widgetView.performClick();
+        verify(listener).onPreferenceChange(mPreference, false);
+    }
+
+    @Test
+    public void onBindViewHolder_checkBoxShouldHaveContentDescription() {
+        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
+            LayoutInflater.from(mContext)
+                .inflate(R.layout.preference_widget_master_checkbox, null));
+        final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget);
+        final String label = "TestButton";
+        mPreference.setTitle(label);
+
+        mPreference.onBindViewHolder(holder);
+
+        assertThat(checkBox.getContentDescription()).isEqualTo(label);
+    }
+}
