diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 57d47fc..64b6b86 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -59,7 +59,7 @@
         android:label="@string/settings_label">
 
         <activity
-            android:name=".HomepageActivity"
+            android:name=".home.HomepageActivity"
             android:label="@string/settings_label"
             android:launchMode="singleTask"
             android:exported="true">
@@ -93,7 +93,7 @@
             android:name=".wifi.WifiSettingsActivity"
             android:label="@string/wifi_settings"
             android:theme="@style/CarSettingTheme"
-            android:icon="@drawable/ic_settings_wireless">
+            android:icon="@drawable/ic_settings_wifi">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.action.SETTINGS"/>
             </intent-filter>
@@ -113,7 +113,7 @@
             android:name=".wifi.WifiDetailActivity"
             android:label="@string/wifi_settings"
             android:theme="@style/CarSettingTheme"
-            android:icon="@drawable/ic_settings_wireless">
+            android:icon="@drawable/ic_settings_wifi">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.action.SETTINGS"/>
             </intent-filter>
@@ -127,7 +127,7 @@
             android:name=".wifi.AddWifiActivity"
             android:label="@string/wifi_settings"
             android:theme="@style/CarSettingTheme"
-            android:icon="@drawable/ic_settings_wireless">
+            android:icon="@drawable/ic_settings_wifi">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.action.SETTINGS"/>
             </intent-filter>
diff --git a/res/drawable/ic_settings_bluetooth_disabled.xml b/res/drawable/ic_settings_bluetooth_disabled.xml
new file mode 100644
index 0000000..20ec624
--- /dev/null
+++ b/res/drawable/ic_settings_bluetooth_disabled.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z"/>
+</vector>
diff --git a/res/drawable/ic_settings_wireless.xml b/res/drawable/ic_settings_wifi.xml
similarity index 100%
rename from res/drawable/ic_settings_wireless.xml
rename to res/drawable/ic_settings_wifi.xml
diff --git a/res/drawable/ic_settings_wifi_disabled.xml b/res/drawable/ic_settings_wifi_disabled.xml
new file mode 100644
index 0000000..30550ea
--- /dev/null
+++ b/res/drawable/ic_settings_wifi_disabled.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z"/>
+</vector>
diff --git a/res/layout/action_bar_with_button.xml b/res/layout/action_bar_with_button.xml
index 8291a16..175b688 100644
--- a/res/layout/action_bar_with_button.xml
+++ b/res/layout/action_bar_with_button.xml
@@ -53,6 +53,6 @@
             android:layout_gravity="center_vertical"
             android:background="@null"
             android:textSize="@dimen/medium_text_size"
-            android:layout_marginEnd="@dimen/stream_content_keyline_1"/>
+            android:layout_marginEnd="@dimen/stream_content_keyline_1" />
     </LinearLayout>
 </RelativeLayout>
diff --git a/res/layout/add_wifi.xml b/res/layout/add_wifi.xml
index 5761a51..760b0de 100644
--- a/res/layout/add_wifi.xml
+++ b/res/layout/add_wifi.xml
@@ -29,7 +29,6 @@
             android:layout_height="wrap_content"
             android:textSize="@dimen/medium_text_size" />
         <android.support.design.widget.TextInputLayout
-            android:id="@+id/wifi_name_input_wrapper"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:theme="@style/Theme.AppCompat.Light">
diff --git a/res/layout/bluetooth_details.xml b/res/layout/bluetooth_details.xml
index 99c6500..e67729d 100644
--- a/res/layout/bluetooth_details.xml
+++ b/res/layout/bluetooth_details.xml
@@ -19,15 +19,27 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" >
+    <android.support.design.widget.TextInputLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:theme="@style/Theme.AppCompat.Light">
+        <EditText
+            android:id="@+id/bt_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:focusableInTouchMode="true"
+            android:textSize="@dimen/medium_text_size"
+            android:hint="@string/bluetooth_preference_paired_dialog_name_label" />
+    </android.support.design.widget.TextInputLayout>
     <TextView
-        android:id="@+id/bt_name"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:text="@string/bluetooth_device_advanced_profile_header_title"
         android:textSize="@dimen/medium_text_size"/>
-    <Button
-        android:id="@+id/bt_forget"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/forget"
-        />
+    <android.support.car.ui.PagedListView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/bluetooth_list.xml b/res/layout/bluetooth_list.xml
index 16bb47f..1e1d42f 100644
--- a/res/layout/bluetooth_list.xml
+++ b/res/layout/bluetooth_list.xml
@@ -31,7 +31,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
         <android.support.car.ui.PagedListView
-            android:id="@android:id/list"
+            android:id="@+id/list"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
         <TextView
diff --git a/res/layout/icon_text_line_item.xml b/res/layout/icon_text_line_item.xml
index 4a96468..0b83caf 100644
--- a/res/layout/icon_text_line_item.xml
+++ b/res/layout/icon_text_line_item.xml
@@ -24,7 +24,8 @@
         android:layout_width="@dimen/tile_icon_size"
         android:layout_height="@dimen/tile_icon_size"
         android:layout_centerVertical="true"
-        android:layout_alignParentStart="true" />
+        android:layout_alignParentStart="true"
+        android:layout_marginEnd="@dimen/car_list_item_icon_right_margin" />
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/res/layout/list.xml b/res/layout/list.xml
index bdd7f13..ea7d1a6 100644
--- a/res/layout/list.xml
+++ b/res/layout/list.xml
@@ -17,6 +17,6 @@
 
 <android.support.car.ui.PagedListView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/list"
+    android:id="@+id/list"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/res/layout/paged_list.xml b/res/layout/paged_list.xml
index c3f421e..9450761 100644
--- a/res/layout/paged_list.xml
+++ b/res/layout/paged_list.xml
@@ -20,7 +20,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
     <android.support.car.ui.PagedListView
-        android:id="@android:id/list"
+        android:id="@+id/list"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 </FrameLayout>
\ No newline at end of file
diff --git a/res/layout/tile_item.xml b/res/layout/tile_item.xml
index afcf3b2..adbfddc 100644
--- a/res/layout/tile_item.xml
+++ b/res/layout/tile_item.xml
@@ -14,48 +14,53 @@
      limitations under the License.
 -->
 
-<LinearLayout
+<RelativeLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/dashboard_tile"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:gravity="center_vertical"
-        android:minHeight="@dimen/lens_header_height"
-        android:orientation="horizontal"
-        android:clickable="true"
-        android:focusable="true">
+        android:minHeight="@dimen/lens_header_height">
 
     <ImageView
             android:id="@+id/icon"
             android:layout_width="@dimen/car_list_item_small_icon_size"
             android:layout_height="@dimen/car_list_item_small_icon_size"
             android:scaleType="fitCenter"
+            android:layout_alignParentStart="true"
             android:layout_marginStart="@dimen/car_list_item_icon_right_margin"
             android:layout_marginEnd="@dimen/car_list_item_icon_right_margin" />
 
     <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="@dimen/drawer_1_line_item_height"
+            android:layout_toEndOf="@id/icon"
             android:orientation="vertical">
 
-        <TextView android:id="@android:id/title"
+        <TextView android:id="@+id/title"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
-                  android:singleLine="true"
                   android:textAppearance="@style/TextAppearance.TileTitle"
                   android:ellipsize="marquee"
                   android:maxLines="1"
                   android:gravity="center_vertical"
                   android:textAlignment="center" />
 
-        <TextView android:id="@android:id/summary"
+        <TextView android:id="@+id/desc"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:textAppearance="@style/TextAppearance.Small"
                   android:textColor="?android:attr/textColorSecondary"
                   android:gravity="center_vertical"
                   android:maxLines="1"
-                  android:ellipsize="end"
-                  android:paddingEnd="@dimen/car_list_item_right_icon_margin" />
+                  android:ellipsize="end" />
     </LinearLayout>
-</LinearLayout>
+    <Switch
+        android:id="@+id/toggle_switch"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_alignParentEnd="true"
+        android:paddingEnd="@dimen/car_list_item_right_icon_margin"
+        android:visibility="gone"/>
+</RelativeLayout>
diff --git a/res/layout/toggle_line_item.xml b/res/layout/toggle_line_item.xml
index 56f15a0..2d29a2f 100644
--- a/res/layout/toggle_line_item.xml
+++ b/res/layout/toggle_line_item.xml
@@ -15,7 +15,10 @@
   ~ limitations under the License
   -->
 
-<RelativeLayout
+<!-- The whole line item is clickable and will handle the logic change and update the switch
+ contained inside. We can't take the touch focus away from Switch due to how touch was handled in
+ that widget -->
+<com.android.car.settings.common.InterceptTouchRelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
@@ -40,5 +43,5 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true"/>
-</RelativeLayout>
\ No newline at end of file
+        android:layout_alignParentEnd="true" />
+</com.android.car.settings.common.InterceptTouchRelativeLayout>
\ No newline at end of file
diff --git a/res/layout/wifi_list.xml b/res/layout/wifi_list.xml
index 97ac0e8..93886cc 100644
--- a/res/layout/wifi_list.xml
+++ b/res/layout/wifi_list.xml
@@ -48,7 +48,7 @@
                 android:layout_height="@dimen/car_divider_height"
                 android:background="@color/car_list_divider"/>
             <android.support.car.ui.PagedListView
-                android:id="@android:id/list"
+                android:id="@+id/list"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent" />
         </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fc577e1..c5d392d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -123,6 +123,19 @@
     <string name="bluetooth_preference_paired_devices">Paired devices</string>
     <!-- Bluetooth settings: The sub heading for available devices during and after scanning. [CHAR LIMIT=40] -->
     <string name="bluetooth_preference_found_devices">Available devices</string>
+    <!-- Bluetooth settings: The sub heading for no bluetooth device has been paired with this device. [CHAR LIMIT=40] -->
+    <string name="bluetooth_preference_no_paired_devices">No paired devices</string>
+    <!-- Bluetooth settings: The sub heading for no available bluetooth devices during and after scanning. [CHAR LIMIT=40] -->
+    <string name="bluetooth_preference_no_found_devices">No available devices</string>
+    <!-- Bluetooth settings: Paired dialog title [CHAR LIMIT=40] -->
+    <string name="bluetooth_preference_paired_dialog_title">Paired device</string>
+    <!-- Bluetooth settings: Name label [CHAR LIMIT=40] -->
+    <string name="bluetooth_preference_paired_dialog_name_label">Name</string>
+    <!-- Bluetooth settings.  Connection options screen.  The title of the header that is above all of the profiles.
+     When a user decides what Bluetooth capabilities to use with the device.  -->
+    <string name="bluetooth_device_advanced_profile_header_title">Use for</string>
+    <!-- Hint for a text field to change the name of the Bluetooth device. [CHAR LIMIT=35] -->
+    <string name="wifi_ssid_hint">Change the name of the Bluetooth device</string>
 
     <!-- sound settings --><skip />
     <!-- Sound settings screen heading -->
diff --git a/src/com/android/car/settings/CarSettingActivity.java b/src/com/android/car/settings/CarSettingActivity.java
deleted file mode 100644
index e979c92..0000000
--- a/src/com/android/car/settings/CarSettingActivity.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings;
-
-import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.util.Log;
-
-import com.android.settingslib.drawer.ProfileSelectDialog;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-import com.android.settingslib.drawer.Tile;
-
-/**
- * Base activity class for car settings
- */
-public class CarSettingActivity extends SettingsDrawerActivity {
-    private static final String TAG = "CarSettingActivity";
-    private static final String CAR_PACKAGE = "android.car.settings.SETTINGS";
-    private static final String SETTING_PKG = "com.android.car.settings";
-
-    @Override
-    public String getSettingAction() {
-        return CAR_PACKAGE;
-    }
-
-    @Override
-    public String getSettingPkg() {
-        return SETTING_PKG;
-    }
-
-    public boolean openTile(Tile tile) {
-        if (tile == null) {
-            Intent intent = new Intent(getSettingAction()).addFlags(
-                    Intent.FLAG_ACTIVITY_CLEAR_TASK);
-            startActivity(intent);
-            return true;
-        }
-        try {
-            ProfileSelectDialog.updateUserHandlesIfNeeded(this /* context */, tile);
-            int numUserHandles = tile.userHandle.size();
-            if (numUserHandles > 1) {
-                ProfileSelectDialog.show(getFragmentManager(), tile);
-                return false;
-            } else if (numUserHandles == 1) {
-                // Show menu on top level items.
-                tile.intent.putExtra(EXTRA_SHOW_MENU, true);
-                tile.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                startActivityAsUser(tile.intent, tile.userHandle.get(0));
-            } else {
-                // Show menu on top level items.
-                tile.intent.putExtra(EXTRA_SHOW_MENU, true);
-                tile.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                startActivity(tile.intent);
-            }
-        } catch (ActivityNotFoundException e) {
-            Log.w(TAG, "Couldn't find tile " + tile.intent, e);
-        }
-        return true;
-    }
-}
diff --git a/src/com/android/car/settings/HomepageActivity.java b/src/com/android/car/settings/HomepageActivity.java
deleted file mode 100644
index f0cb705..0000000
--- a/src/com/android/car/settings/HomepageActivity.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings;
-
-
-import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import com.android.car.settings.common.TileRecyclerViewAdapter;
-import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.CategoryManager;
-
-/**
- * Homepage for settings for car.
- */
-public class HomepageActivity extends CarSettingActivity {
-
-    private RecyclerView mRecyclerView;
-    private TileRecyclerViewAdapter mAdapter;
-    private RecyclerView.LayoutManager mLayoutManager;
-
-    @Override
-    protected void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
-        setContentView(R.layout.homepage);
-        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
-
-        mRecyclerView.setHasFixedSize(true);
-
-        mLayoutManager = new LinearLayoutManager(this);
-        mRecyclerView.setLayoutManager(mLayoutManager);
-
-        mAdapter = new TileRecyclerViewAdapter(this, CategoryManager.get(this)
-                .getTilesByCategory(this, CategoryKey.CATEGORY_HOMEPAGE, getSettingPkg()));
-        mRecyclerView.setAdapter(mAdapter);
-    }
-}
diff --git a/src/com/android/car/settings/applications/ApplicationDetailActivity.java b/src/com/android/car/settings/applications/ApplicationDetailActivity.java
index f5d6ead..ac071f0 100644
--- a/src/com/android/car/settings/applications/ApplicationDetailActivity.java
+++ b/src/com/android/car/settings/applications/ApplicationDetailActivity.java
@@ -38,7 +38,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 import com.android.settingslib.Utils;
@@ -67,7 +67,6 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
         setContentView(R.layout.application_details);
         if (getIntent() != null && getIntent().getExtras() != null) {
             mResolveInfo = getIntent().getExtras().getParcelable(APPLICATION_INFO_KEY);
diff --git a/src/com/android/car/settings/applications/ApplicationSettingsActivity.java b/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
index 266da67..cc541c8 100644
--- a/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
+++ b/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
@@ -18,7 +18,7 @@
 import android.os.Bundle;
 import android.support.car.ui.PagedListView;
 import android.support.v7.widget.RecyclerView;
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 import com.android.car.settings.common.NoDividerItemDecoration;
 
@@ -34,10 +34,9 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
         setContentView(R.layout.paged_list);
 
-        mListView = (PagedListView) findViewById(android.R.id.list);
+        mListView = (PagedListView) findViewById(R.id.list);
         mListView.setDefaultItemDecoration(new NoDividerItemDecoration(this));
         mListView.setDarkMode();
         mAdapter = new ApplicationListAdapter(this /* context */, getPackageManager());
diff --git a/src/com/android/car/settings/basePreferenceFragment.java b/src/com/android/car/settings/basePreferenceFragment.java
deleted file mode 100644
index 740b36b..0000000
--- a/src/com/android/car/settings/basePreferenceFragment.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings;
-
-import android.preference.PreferenceFragment;
-
-/**
- * Common class for preferenceFragment for car settings.
- */
-public abstract class basePreferenceFragment extends PreferenceFragment {
-    abstract String getCategoryKey();
-}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDetailActivity.java b/src/com/android/car/settings/bluetooth/BluetoothDetailActivity.java
index 7318346..ff1a3dc 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDetailActivity.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDetailActivity.java
@@ -17,28 +17,56 @@
 
 import android.bluetooth.BluetoothDevice;
 import android.os.Bundle;
+import android.support.car.ui.PagedListView;
+import android.text.Editable;
+import android.text.TextWatcher;
 import android.util.Log;
-import android.widget.TextView;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
+import com.android.car.settings.common.NoDividerItemDecoration;
+import com.android.car.settings.common.TypedPagedListAdapter;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.MapProfile;
+import com.android.settingslib.bluetooth.PanProfile;
+import com.android.settingslib.bluetooth.PbapServerProfile;
+
+import java.util.ArrayList;
 
 /**
  * Shows details about a bluetooth device, including actions related to the device,
  * e.g. forget etc. The intent should include information about the device, use that to
  * render UI, e.g. show name etc.
  */
-public class BluetoothDetailActivity extends CarSettingActivity {
+public class BluetoothDetailActivity extends CarSettingActivity implements
+        BluetoothProfileLineItem.DataChangedListener {
     private static final String TAG = "BluetoothDetailActivity";
     public static final String BT_DEVICE_KEY = "btDeviceKey";
 
     private BluetoothDevice mDevice;
+    private CachedBluetoothDevice mCachedDevice;
+    private PagedListView mListView;
+    private TypedPagedListAdapter mPagedListAdapter;
+    private LocalBluetoothManager mLocalManager;
+    private CachedBluetoothDeviceManager mDeviceManager;
+    private EditText mNameView;
+    private Button mOkButton;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
         setContentView(R.layout.bluetooth_details);
+        mListView = (PagedListView) findViewById(R.id.list);
+        mListView.setDefaultItemDecoration(new NoDividerItemDecoration(this));
+        mListView.setDarkMode();
+
         if (getIntent() != null && getIntent().getExtras() != null) {
             mDevice = getIntent().getExtras().getParcelable(BT_DEVICE_KEY);
         }
@@ -46,23 +74,100 @@
             Log.w(TAG, "No bluetooth device set.");
             return;
         }
-        TextView nameView = (TextView) findViewById(R.id.bt_name);
-        nameView.setText(mDevice.getName());
-        findViewById(R.id.bt_forget).setOnClickListener(v -> {
-                forget();
-                finish();
-            });
+
+        mLocalManager = LocalBluetoothManager.getInstance(this /* context */ , null /* listener */);
+        if (mLocalManager == null) {
+            Log.e(TAG, "Bluetooth is not supported on this device");
+            return;
+        }
+        mDeviceManager = mLocalManager.getCachedDeviceManager();
+        mCachedDevice = mDeviceManager.findDevice(mDevice);
+        if (mCachedDevice == null) {
+            mCachedDevice = mDeviceManager.addDevice(
+                    mLocalManager.getBluetoothAdapter(),
+                    mLocalManager.getProfileManager(),
+                    mDevice);
+        }
+
+        mNameView = (EditText) findViewById(R.id.bt_name);
+        mNameView.setText(mDevice.getName());
+        setupForgetButton();
+        setupOkButton();
+
+        mPagedListAdapter = new TypedPagedListAdapter(this /* context */, getProfileLineItems());
+        mListView.setAdapter(mPagedListAdapter);
     }
 
-    private void forget() {
-        int state = mDevice.getBondState();
+    @Override
+    public void setupActionBar() {
+        super.setupActionBar();
+        getActionBar().setCustomView(R.layout.action_bar_with_button);
+        getActionBar().setDisplayShowCustomEnabled(true);
+    }
 
-        if (state == BluetoothDevice.BOND_BONDING) {
-            mDevice.cancelBondProcess();
+    @Override
+    public void onDataChanged() {
+        mPagedListAdapter.notifyDataSetChanged();
+    }
+
+    private ArrayList<TypedPagedListAdapter.LineItem> getProfileLineItems() {
+        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
+        for (LocalBluetoothProfile profile : mCachedDevice.getConnectableProfiles()) {
+            lineItems.add(new BluetoothProfileLineItem(
+                    this /* context */, profile, mCachedDevice, this));
         }
 
-        if (state != BluetoothDevice.BOND_NONE) {
-            mDevice.removeBond();
+        int pbapPermission = mCachedDevice.getPhonebookPermissionChoice();
+        // Only provide PBAP cabability if the client device has requested PBAP.
+        if (pbapPermission != CachedBluetoothDevice.ACCESS_UNKNOWN) {
+            PbapServerProfile psp = mLocalManager.getProfileManager().getPbapProfile();
+            lineItems.add(new BluetoothProfileLineItem(
+                    this /* context */, psp, mCachedDevice, this));
         }
+
+        int mapPermission = mCachedDevice.getMessagePermissionChoice();
+        if (mapPermission != CachedBluetoothDevice.ACCESS_UNKNOWN) {
+            MapProfile mapProfile = mLocalManager.getProfileManager().getMapProfile();
+            lineItems.add(new BluetoothProfileLineItem(
+                    this /* context */, mapProfile, mCachedDevice, this));
+        }
+        return lineItems;
+    }
+
+    private void setupForgetButton() {
+        Button fortgetButton = (Button) findViewById(R.id.action_button2);
+        fortgetButton.setVisibility(View.VISIBLE);
+        fortgetButton.setText(R.string.forget);
+        fortgetButton.setOnClickListener(v -> {
+            mCachedDevice.unpair();
+            finish();
+        });
+    }
+
+    private void setupOkButton() {
+        mOkButton = (Button) findViewById(R.id.action_button1);
+        mOkButton.setText(R.string.okay);
+        // before the text gets changed, always set it in a disabled state.
+        mOkButton.setEnabled(false);
+        mNameView.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                // don't care
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                // dont' care
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                mOkButton.setEnabled(!s.toString().equals(mDevice.getName()));
+            }
+        });
+        mOkButton.setOnClickListener(v -> {
+            mCachedDevice.setName(mNameView.getText().toString());
+            finish();
+        });
     }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java b/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java
new file mode 100644
index 0000000..d6e5592
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+
+import com.android.car.settings.common.ToggleLineItem;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.MapProfile;
+import com.android.settingslib.bluetooth.PanProfile;
+import com.android.settingslib.bluetooth.PbapServerProfile;
+
+/**
+ * Represents a line item for a Bluetooth mProfile.
+ */
+public class BluetoothProfileLineItem extends ToggleLineItem {
+    private final LocalBluetoothProfile mProfile;
+    private final CachedBluetoothDevice mCachedDevice;
+    private ToggleLineItemViewHolder mViewHolder;
+    private DataChangedListener mDataChangedListener;
+
+    public interface DataChangedListener {
+        void onDataChanged();
+    }
+
+    public BluetoothProfileLineItem(Context context, LocalBluetoothProfile profile,
+            CachedBluetoothDevice cachedBluetoothDevice, DataChangedListener listener) {
+        super(context.getText(profile.getNameResource(cachedBluetoothDevice.getDevice())));
+        mCachedDevice = cachedBluetoothDevice;
+        mProfile = profile;
+        mDataChangedListener = listener;
+    }
+
+    @Override
+    public void onClick(boolean isChecked) {
+        if (mProfile instanceof PbapServerProfile) {
+            mCachedDevice.setPhonebookPermissionChoice(isChecked
+                    ? CachedBluetoothDevice.ACCESS_REJECTED : CachedBluetoothDevice.ACCESS_ALLOWED);
+        } else if (mProfile instanceof MapProfile) {
+            mCachedDevice.setMessagePermissionChoice(isChecked
+                    ? CachedBluetoothDevice.ACCESS_REJECTED : CachedBluetoothDevice.ACCESS_ALLOWED);
+        } else if (isChecked) {
+            mCachedDevice.disconnect(mProfile);
+            mProfile.setPreferred(mCachedDevice.getDevice(), false);
+        } else if (mProfile.isPreferred(mCachedDevice.getDevice())) {
+            if (mProfile instanceof PanProfile) {
+                mCachedDevice.connectProfile(mProfile);
+            } else {
+                mProfile.setPreferred(mCachedDevice.getDevice(), false);
+            }
+        } else {
+            mProfile.setPreferred(mCachedDevice.getDevice(), true);
+            mCachedDevice.connectProfile(mProfile);
+        }
+        mDataChangedListener.onDataChanged();
+    }
+
+    @Override
+    public void bindViewHolder(ToggleLineItemViewHolder holder) {
+        super.bindViewHolder(holder);
+        mViewHolder = holder;
+    }
+
+    @Override
+    public CharSequence getDesc() {
+        return null;
+    }
+
+    @Override
+    public boolean isChecked() {
+        BluetoothDevice device = mCachedDevice.getDevice();
+
+        if (mProfile instanceof MapProfile) {
+            return mCachedDevice.getMessagePermissionChoice()
+                    == CachedBluetoothDevice.ACCESS_ALLOWED;
+
+        } else if (mProfile instanceof PbapServerProfile) {
+            return mCachedDevice.getPhonebookPermissionChoice()
+                    == CachedBluetoothDevice.ACCESS_ALLOWED;
+
+        } else if (mProfile instanceof PanProfile) {
+            return mProfile.getConnectionStatus(device) == BluetoothProfile.STATE_CONNECTED;
+
+        } else {
+            return mProfile.isPreferred(device);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java b/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
index e0708ff..7dadec1 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
@@ -21,16 +21,14 @@
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.support.car.ui.PagedListView;
 import android.support.v7.widget.RecyclerView;
-import android.widget.ImageButton;
 import android.widget.ProgressBar;
 import android.widget.Switch;
 import android.widget.TextView;
 import android.widget.ViewSwitcher;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 import com.android.settingslib.bluetooth.BluetoothCallback;
@@ -58,8 +56,6 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.bluetooth_list);
-        getActionBar().setCustomView(R.layout.action_bar_with_toggle);
-        getActionBar().setDisplayShowCustomEnabled(true);
 
         ((TextView) findViewById(R.id.title)).setText(R.string.bluetooth_settings);
         mBluetoothSwitch = (Switch) findViewById(R.id.toggle_switch);
@@ -74,7 +70,7 @@
             });
 
         mProgressBar = (ProgressBar) findViewById(R.id.bt_search_progress);
-        mDeviceListView = (PagedListView) findViewById(android.R.id.list);
+        mDeviceListView = (PagedListView) findViewById(R.id.list);
         mViewSwitcher = (ViewSwitcher) findViewById(R.id.view_switcher);
         mMessageView = (TextView) findViewById(R.id.bt_message);
 
@@ -94,6 +90,13 @@
     }
 
     @Override
+    public void setupActionBar() {
+        super.setupActionBar();
+        getActionBar().setCustomView(R.layout.action_bar_with_toggle);
+        getActionBar().setDisplayShowCustomEnabled(true);
+    }
+
+    @Override
     public void onStart() {
         super.onStart();
         if (mLocalManager == null) {
diff --git a/src/com/android/car/settings/common/CarSettingActivity.java b/src/com/android/car/settings/common/CarSettingActivity.java
new file mode 100644
index 0000000..b680e43
--- /dev/null
+++ b/src/com/android/car/settings/common/CarSettingActivity.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.car.settings.common;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+
+
+/**
+ * Base activity class for car settings, provides a action bar with a back button that goes to
+ * previous activity.
+ */
+public class CarSettingActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setupActionBar();
+    }
+
+    /**
+     * Add logic to setup ActionBar here.
+     */
+    public void setupActionBar() {
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+    }
+
+    /**
+     * Make home button as back button.
+     */
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+                onBackPressed();
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/car/settings/common/IconTextLineItem.java b/src/com/android/car/settings/common/IconTextLineItem.java
index 9d270c6..62e8650 100644
--- a/src/com/android/car/settings/common/IconTextLineItem.java
+++ b/src/com/android/car/settings/common/IconTextLineItem.java
@@ -30,14 +30,15 @@
 /**
  * Contains logic for a line item represents icon and texts of a title and a description.
  */
-public abstract class IconTextLineItem extends TypedPagedListAdapter.LineItem {
-    private final String mTitle;
+public abstract class IconTextLineItem
+        extends TypedPagedListAdapter.LineItem<IconTextLineItem.ViewHolder> {
+    private final CharSequence mTitle;
     @DrawableRes
     private final int mIconRes;
 
     private View.OnClickListener mOnClickListener = (v) -> onClick();
 
-    public IconTextLineItem(String title, @DrawableRes int iconRes) {
+    public IconTextLineItem(CharSequence title, @DrawableRes int iconRes) {
         mTitle = title;
         mIconRes = iconRes;
     }
@@ -48,8 +49,7 @@
     }
 
     @Override
-    public void bindViewHolder(RecyclerView.ViewHolder holder) {
-        ViewHolder viewHolder = (ViewHolder) holder;
+    public void bindViewHolder(ViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
         viewHolder.iconView.setImageResource(mIconRes);
         CharSequence desc = getDesc();
@@ -59,11 +59,11 @@
             viewHolder.descView.setVisibility(View.VISIBLE);
             viewHolder.descView.setText(desc);
         }
-        holder.itemView.setOnClickListener(mOnClickListener);
-        holder.itemView.setEnabled(isEnabled());
+        viewHolder.itemView.setOnClickListener(mOnClickListener);
+        viewHolder.itemView.setEnabled(isEnabled());
     }
 
-    private static class ViewHolder extends RecyclerView.ViewHolder {
+    static class ViewHolder extends RecyclerView.ViewHolder {
         final TextView titleView;
         final TextView descView;
         final ImageView iconView;
diff --git a/src/com/android/car/settings/common/IconToggleLineItem.java b/src/com/android/car/settings/common/IconToggleLineItem.java
new file mode 100644
index 0000000..ba56ab9
--- /dev/null
+++ b/src/com/android/car/settings/common/IconToggleLineItem.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.common;
+
+import android.annotation.DrawableRes;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import com.android.car.settings.R;
+
+/**
+ * Contains logic for a line item represents title text, description text and a toggle widget.
+ */
+public abstract class IconToggleLineItem
+        extends TypedPagedListAdapter.LineItem<IconToggleLineItem.ViewHolder> {
+    private final Context mContext;
+    private final CharSequence mTitle;
+    protected IconUpdateListener mIconUpdateListener;
+
+    public interface IconUpdateListener {
+        void onUpdateIcon(@DrawableRes int iconRes);
+    }
+
+    private final View.OnClickListener mOnClickListener = v -> onClicked();
+
+    private final Switch.OnCheckedChangeListener mOnCheckedChangeListener =
+            (view, isChecked) -> onToggleClicked(isChecked);
+
+    public IconToggleLineItem(CharSequence title, Context context) {
+        mTitle = title;
+        mContext = context;
+    }
+
+    public int getType() {
+        return ICON_TOGGLE_TYPE;
+    }
+
+    public void bindViewHolder(ViewHolder viewHolder) {
+        viewHolder.title.setText(mTitle);
+        viewHolder.summary.setText(getDesc());
+        viewHolder.toggle.setChecked(isChecked());
+        viewHolder.onUpdateIcon(getIcon());
+        viewHolder.itemView.setOnClickListener(mOnClickListener);
+        viewHolder.toggle.setOnCheckedChangeListener(mOnCheckedChangeListener);
+        mIconUpdateListener = viewHolder;
+    }
+
+    static class ViewHolder extends RecyclerView.ViewHolder implements IconUpdateListener {
+        public final ImageView icon;
+        public final TextView title;
+        public final TextView summary;
+        public final Switch toggle;
+
+        public ViewHolder(View itemView) {
+            super(itemView);
+            icon = (ImageView) itemView.findViewById(R.id.icon);
+            title = (TextView) itemView.findViewById(R.id.title);
+            summary = (TextView) itemView.findViewById(R.id.desc);
+            toggle = (Switch) itemView.findViewById(R.id.toggle_switch);
+            toggle.setVisibility(View.VISIBLE);
+        }
+
+        @Override
+        public void onUpdateIcon(@DrawableRes int iconRes) {
+            icon.setImageResource(iconRes);
+        }
+    }
+
+    public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
+        View v = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.tile_item, parent, false);
+        return new ViewHolder(v);
+    }
+
+    /**
+     * Called when any part of the line is clicked.
+     * @param isChecked the state of the switch widget at the time of click.
+     */
+    public abstract void onToggleClicked(boolean isChecked);
+
+    /**
+     * called when anywhere other than the toggle on the line item got clicked.
+     */
+    public abstract void onClicked();
+
+    public abstract boolean isChecked();
+
+    public abstract @DrawableRes int getIcon();
+}
diff --git a/src/com/android/car/settings/common/InterceptTouchRelativeLayout.java b/src/com/android/car/settings/common/InterceptTouchRelativeLayout.java
new file mode 100644
index 0000000..eb8baad
--- /dev/null
+++ b/src/com/android/car/settings/common/InterceptTouchRelativeLayout.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.widget.RelativeLayout;
+
+/**
+ * Intercepts all touch event, so they don't pass onto child views. One use case for this is to
+ * make the line item in a list view clickable and control the logic and update the sub view.
+ */
+public class InterceptTouchRelativeLayout extends RelativeLayout {
+
+    public InterceptTouchRelativeLayout(Context context) {
+        super(context);
+    }
+
+    public InterceptTouchRelativeLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public InterceptTouchRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public InterceptTouchRelativeLayout(
+            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    /**
+     * Intercepts all touch event.
+     * @return true.
+     */
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/common/ListSettingsActivity.java b/src/com/android/car/settings/common/ListSettingsActivity.java
index 7beabe3..f0f0dfd 100644
--- a/src/com/android/car/settings/common/ListSettingsActivity.java
+++ b/src/com/android/car/settings/common/ListSettingsActivity.java
@@ -19,13 +19,12 @@
 import android.os.Bundle;
 import android.support.car.ui.PagedListView;
 
-import com.android.car.settings.CarSettingActivity;
 import com.android.car.settings.R;
 
 import java.util.ArrayList;
 
 /**
- * Shows a list of settings
+ * Settings page that only contain a list of items.
  */
 public abstract class ListSettingsActivity extends CarSettingActivity {
 
@@ -35,10 +34,9 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setupActionBar();
         setContentView(R.layout.paged_list);
 
-        mListView = (PagedListView) findViewById(android.R.id.list);
+        mListView = (PagedListView) findViewById(R.id.list);
         mListView.setDefaultItemDecoration(new NoDividerItemDecoration(this));
         mListView.setDarkMode();
         mPagedListAdapter = new TypedPagedListAdapter(this /* context */, getLineItems());
@@ -49,11 +47,4 @@
      * Gets a List of LineItems to show up in this activity.
      */
     public abstract ArrayList<TypedPagedListAdapter.LineItem> getLineItems();
-
-    /**
-     * Add logic to setup ActionBar here.
-     */
-    public void setupActionBar() {
-        showMenuIcon();
-    }
 }
diff --git a/src/com/android/car/settings/common/SeekbarLineItem.java b/src/com/android/car/settings/common/SeekbarLineItem.java
index a0c9cc2..294a248 100644
--- a/src/com/android/car/settings/common/SeekbarLineItem.java
+++ b/src/com/android/car/settings/common/SeekbarLineItem.java
@@ -28,7 +28,8 @@
 /**
  * Contains logic for a line item represents a description and a seekbar.
  */
-public abstract class SeekbarLineItem extends TypedPagedListAdapter.LineItem {
+public abstract class SeekbarLineItem
+        extends TypedPagedListAdapter.LineItem<SeekbarLineItem.ViewHolder> {
     private final CharSequence mTitle;
 
     private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener =
@@ -60,15 +61,14 @@
     }
 
     @Override
-    public void bindViewHolder(RecyclerView.ViewHolder holder) {
-        ViewHolder viewHolder = (ViewHolder) holder;
+    public void bindViewHolder(ViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
         viewHolder.seekBar.setMax(getMaxSeekbarValue());
         viewHolder.seekBar.setProgress(getInitialSeekbarValue());
         viewHolder.seekBar.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
     }
 
-    private static class ViewHolder extends RecyclerView.ViewHolder {
+    static class ViewHolder extends RecyclerView.ViewHolder {
         final TextView titleView;
         final SeekBar seekBar;
 
diff --git a/src/com/android/car/settings/common/SimpleIconLineItem.java b/src/com/android/car/settings/common/SimpleIconLineItem.java
new file mode 100644
index 0000000..9830f2e
--- /dev/null
+++ b/src/com/android/car/settings/common/SimpleIconLineItem.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.content.Intent;
+
+import android.annotation.DrawableRes;
+import android.annotation.StringRes;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.car.settings.R;
+
+/**
+ * Represents the basic line item with Icon and text.
+ */
+public class SimpleIconLineItem extends IconTextLineItem {
+    private final CharSequence mDesc;
+    private final Context mContext;
+    private final Class mActivityClass;
+
+    public SimpleIconLineItem(
+            @StringRes int title,
+            @DrawableRes int iconRes,
+            Context context,
+            CharSequence desc,
+            Class activityClass) {
+        super(context.getText(title), iconRes);
+        mDesc = desc;
+        mContext = context;
+        mActivityClass = activityClass;
+    }
+
+    @Override
+    public int getType() {
+        return SIMPLE_ICON_TEXT_TYPE;
+    }
+
+    @Override
+    public void onClick() {
+        Intent intent = new Intent(mContext, mActivityClass);
+        mContext.startActivity(intent);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    public CharSequence getDesc() {
+        return mDesc;
+    }
+
+    public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
+        View v = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.tile_item, parent, false);
+        return new ViewHolder(v);
+    }
+}
diff --git a/src/com/android/car/settings/common/TextLineItem.java b/src/com/android/car/settings/common/TextLineItem.java
index 5d35417..95366e0 100644
--- a/src/com/android/car/settings/common/TextLineItem.java
+++ b/src/com/android/car/settings/common/TextLineItem.java
@@ -26,7 +26,7 @@
 /**
  * Contains logic for a line item represents text only view of a title and a description.
  */
-public abstract class TextLineItem extends TypedPagedListAdapter.LineItem {
+public abstract class TextLineItem extends TypedPagedListAdapter.LineItem<TextLineItem.ViewHolder> {
     private final CharSequence mTitle;
 
     private View.OnClickListener mOnClickListener = (v) -> onClick();
@@ -41,15 +41,14 @@
     }
 
     @Override
-    public void bindViewHolder(RecyclerView.ViewHolder holder) {
-        ViewHolder viewHolder = (ViewHolder) holder;
+    public void bindViewHolder(ViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
         viewHolder.descView.setText(getDesc());
-        holder.itemView.setOnClickListener(mOnClickListener);
-        holder.itemView.setEnabled(isEnabled());
+        viewHolder.itemView.setOnClickListener(mOnClickListener);
+        viewHolder.itemView.setEnabled(isEnabled());
     }
 
-    private static class ViewHolder extends RecyclerView.ViewHolder {
+    static class ViewHolder extends RecyclerView.ViewHolder {
         final TextView titleView;
         final TextView descView;
 
diff --git a/src/com/android/car/settings/common/TileRecyclerViewAdapter.java b/src/com/android/car/settings/common/TileRecyclerViewAdapter.java
deleted file mode 100644
index 071e0c9..0000000
--- a/src/com/android/car/settings/common/TileRecyclerViewAdapter.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.car.settings.common;
-
-import android.content.Context;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-import com.android.car.settings.CarSettingActivity;
-import com.android.car.settings.R;
-import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.Tile;
-
-import java.util.List;
-
-/**
- * View adapter for recycler view for tiles.
- */
-public class TileRecyclerViewAdapter extends RecyclerView.Adapter<TileRecyclerViewAdapter.TileViewHolder> {
-    private final DashboardCategory mHomepageCategory;
-    private final Context mContext;
-
-    public static class TileViewHolder extends ViewHolder {
-        public final ImageView icon;
-        public final TextView title;
-        public final TextView summary;
-
-        public TextView mTextView;
-
-        public TileViewHolder(View itemView) {
-            super(itemView);
-            icon = (ImageView) itemView.findViewById(R.id.icon);
-            title = (TextView) itemView.findViewById(android.R.id.title);
-            summary = (TextView) itemView.findViewById(android.R.id.summary);
-        }
-    }
-
-    private View.OnClickListener mTileClickListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            //TODO: get rid of setTag/getTag
-            ((CarSettingActivity) mContext).openTile((Tile) v.getTag());
-        }
-    };
-
-    public TileRecyclerViewAdapter(Context context, DashboardCategory category) {
-        mContext = context;
-        mHomepageCategory = category;
-    }
-
-    @Override
-    public TileViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.tile_item, parent, false);
-        TileViewHolder vh = new TileViewHolder(v);
-        return vh;
-    }
-
-    @Override
-    public void onBindViewHolder(TileViewHolder holder, int position) {
-        Tile tile = mHomepageCategory.tiles.get(position);
-        holder.title.setText(tile.title);
-        holder.icon.setImageIcon(tile.icon);
-        holder.itemView.setTag(tile);
-        holder.itemView.setOnClickListener(mTileClickListener);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mHomepageCategory.tiles.size();
-    }
-}
diff --git a/src/com/android/car/settings/common/ToggleLineItem.java b/src/com/android/car/settings/common/ToggleLineItem.java
index 704d703..857ee0f 100644
--- a/src/com/android/car/settings/common/ToggleLineItem.java
+++ b/src/com/android/car/settings/common/ToggleLineItem.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.common;
 
 import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -27,7 +28,8 @@
 /**
  * Contains logic for a line item represents title text, description text and a toggle widget.
  */
-public abstract class ToggleLineItem extends TypedPagedListAdapter.LineItem {
+public abstract class ToggleLineItem
+        extends TypedPagedListAdapter.LineItem<ToggleLineItem.ToggleLineItemViewHolder> {
     private final CharSequence mTitle;
 
     private View.OnClickListener mOnClickListener = (v) -> {
@@ -43,20 +45,25 @@
         return TOGGLE_TYPE;
     }
 
-    public void bindViewHolder(RecyclerView.ViewHolder holder) {
-        ViewHolder viewHolder = (ViewHolder) holder;
+    public void bindViewHolder(ToggleLineItemViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
-        viewHolder.descView.setText(getDesc());
+        CharSequence desc = getDesc();
+        if (TextUtils.isEmpty(desc)) {
+            viewHolder.descView.setVisibility(View.GONE);
+        } else {
+            viewHolder.descView.setVisibility(View.VISIBLE);
+            viewHolder.descView.setText(desc);
+        }
         viewHolder.toggle.setChecked(isChecked());
-        holder.itemView.setOnClickListener(mOnClickListener);
+        viewHolder.itemView.setOnClickListener(mOnClickListener);
     }
 
-    private static class ViewHolder extends RecyclerView.ViewHolder {
+    public static class ToggleLineItemViewHolder extends RecyclerView.ViewHolder {
         final TextView titleView;
         final TextView descView;
-        final Switch toggle;
+        public final Switch toggle;
 
-        public ViewHolder(View view) {
+        public ToggleLineItemViewHolder(View view) {
             super(view);
             titleView = (TextView) view.findViewById(R.id.title);
             descView = (TextView) view.findViewById(R.id.desc);
@@ -67,7 +74,7 @@
     public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
         View v = LayoutInflater.from(parent.getContext())
                 .inflate(R.layout.toggle_line_item, parent, false);
-        return new ViewHolder(v);
+        return new ToggleLineItemViewHolder(v);
     }
 
     /**
diff --git a/src/com/android/car/settings/common/TypedPagedListAdapter.java b/src/com/android/car/settings/common/TypedPagedListAdapter.java
index 62d2492..2d53ca2 100644
--- a/src/com/android/car/settings/common/TypedPagedListAdapter.java
+++ b/src/com/android/car/settings/common/TypedPagedListAdapter.java
@@ -51,9 +51,14 @@
         return mContentList.isEmpty();
     }
 
-    public static abstract class LineItem {
+    public static abstract class LineItem<VH extends ViewHolder> {
         @Retention(SOURCE)
-        @IntDef({TEXT_TYPE, TOGGLE_TYPE, ICON_TEXT_TYPE})
+        @IntDef({TEXT_TYPE,
+                TOGGLE_TYPE,
+                ICON_TEXT_TYPE,
+                SEEKBAR_TYPE,
+                ICON_TOGGLE_TYPE,
+                SIMPLE_ICON_TEXT_TYPE})
         public @interface LineItemType {}
 
         // with one title and one description
@@ -68,10 +73,16 @@
         // with one tile and one seekbar.
         static final int SEEKBAR_TYPE = 4;
 
+        // with one icon, title, description and a toggle.
+        static final int ICON_TOGGLE_TYPE = 5;
+
+        // similar to ICON_TEXT_TYPE, but with a different layout.
+        static final int SIMPLE_ICON_TEXT_TYPE = 6;
+
         @LineItemType
         abstract int getType();
 
-        abstract void bindViewHolder(ViewHolder holder);
+        abstract void bindViewHolder(VH holder);
 
         public abstract CharSequence getDesc();
     }
@@ -87,6 +98,10 @@
                 return IconTextLineItem.createViewHolder(parent);
             case LineItem.SEEKBAR_TYPE:
                 return SeekbarLineItem.createViewHolder(parent);
+            case LineItem.ICON_TOGGLE_TYPE:
+                return IconToggleLineItem.createViewHolder(parent);
+            case LineItem.SIMPLE_ICON_TEXT_TYPE:
+                return SimpleIconLineItem.createViewHolder(parent);
             default:
                 throw new IllegalStateException("ViewType not supported: " + viewType);
         }
diff --git a/src/com/android/car/settings/core/CarPreferenceController.java b/src/com/android/car/settings/core/CarPreferenceController.java
deleted file mode 100644
index 7aa603a..0000000
--- a/src/com/android/car/settings/core/CarPreferenceController.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-package com.android.car.settings.core;
-
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import com.android.settingslib.core.AbstractPreferenceController;
-
-
-public abstract class CarPreferenceController extends AbstractPreferenceController
-    implements Preference.OnPreferenceChangeListener {
-
-    public CarPreferenceController(Context context) {
-        super(context);
-    }
-}
diff --git a/src/com/android/car/settings/core/CarSettings.java b/src/com/android/car/settings/core/CarSettings.java
deleted file mode 100644
index 37e751d..0000000
--- a/src/com/android/car/settings/core/CarSettings.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.settings.core;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.util.Log;
-import com.android.car.settings.R;
-
-import java.util.List;
-
-
-/**
- * Settings fragments for car related settings.
- */
-public abstract class CarSettings extends PreferenceFragment {
-    private static final String TAG = "CarSettings";
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        List<CarPreferenceController> controllers = getControllers(getContext());
-        for (CarPreferenceController controller : controllers) {
-            bindController(controller);
-        }
-    }
-
-    abstract public List<CarPreferenceController> getControllers(Context context);
-
-    private void bindController(@NonNull CarPreferenceController controller) {
-        Preference preference = findPreference(controller.getPreferenceKey());
-        if (preference == null) {
-            Log.w(TAG, String.format(
-                "Preference[%s] does not exist.", controller.getPreferenceKey()));
-            return;
-        }
-        preference.setOnPreferenceChangeListener(controller);
-        controller.updateState(preference);
-    }
-}
diff --git a/src/com/android/car/settings/datetime/DatePickerActivity.java b/src/com/android/car/settings/datetime/DatePickerActivity.java
index a3b07fc..33b676e 100644
--- a/src/com/android/car/settings/datetime/DatePickerActivity.java
+++ b/src/com/android/car/settings/datetime/DatePickerActivity.java
@@ -21,7 +21,7 @@
 import android.os.Bundle;
 import android.widget.DatePicker;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 import java.util.Calendar;
@@ -37,7 +37,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
+
         setContentView(R.layout.date_picker);
 
         mDatePicker = (DatePicker) findViewById(R.id.date_picker);
diff --git a/src/com/android/car/settings/datetime/TimePickerActivity.java b/src/com/android/car/settings/datetime/TimePickerActivity.java
index ad8fa0f..2e831be 100644
--- a/src/com/android/car/settings/datetime/TimePickerActivity.java
+++ b/src/com/android/car/settings/datetime/TimePickerActivity.java
@@ -22,7 +22,7 @@
 import android.os.Bundle;
 import android.widget.TimePicker;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 import java.util.Calendar;
@@ -38,7 +38,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
+
         setContentView(R.layout.time_picker);
 
         mTimePicker = (TimePicker) findViewById(R.id.time_picker);
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerActivity.java b/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
index a8a10d7..628ed6f 100644
--- a/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
+++ b/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
@@ -20,7 +20,7 @@
 import android.os.Bundle;
 import android.support.car.ui.PagedListView;
 import android.support.v7.widget.RecyclerView;
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 import com.android.car.settings.common.NoDividerItemDecoration;
 
@@ -33,7 +33,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
+
         setContentView(R.layout.list);
 
         PagedListView listView = (PagedListView) findViewById(android.R.id.list);
diff --git a/src/com/android/car/settings/display/AutoBrightnessLineItem.java b/src/com/android/car/settings/display/AutoBrightnessLineItem.java
index b490cfd..f025a64 100644
--- a/src/com/android/car/settings/display/AutoBrightnessLineItem.java
+++ b/src/com/android/car/settings/display/AutoBrightnessLineItem.java
@@ -58,7 +58,7 @@
     }
 
     @Override
-    public void bindViewHolder(RecyclerView.ViewHolder holder) {
+    public void bindViewHolder(ToggleLineItemViewHolder holder) {
         super.bindViewHolder(holder);
         holder.itemView.setEnabled(isEnabled());
     }
diff --git a/src/com/android/car/settings/home/BluetoothLineItem.java b/src/com/android/car/settings/home/BluetoothLineItem.java
new file mode 100644
index 0000000..9de21b9
--- /dev/null
+++ b/src/com/android/car/settings/home/BluetoothLineItem.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.home;
+
+import android.annotation.DrawableRes;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.car.settings.R;
+import com.android.car.settings.bluetooth.BluetoothSettingsActivity;
+import com.android.car.settings.common.IconToggleLineItem;
+
+
+/**
+ * Represents the Bluetooth line item on settings home page.
+ */
+public class BluetoothLineItem extends IconToggleLineItem {
+    private final Context mContext;
+    private BluetoothAdapter mBluetoothAdapter;
+
+    public BluetoothLineItem(Context context) {
+        super(context.getText(R.string.bluetooth_settings), context);
+        mContext = context;
+        mBluetoothAdapter = ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE))
+                .getAdapter();
+    }
+
+    @Override
+    public void onToggleClicked(boolean isChecked) {
+        if (isChecked) {
+            mBluetoothAdapter.enable();
+        } else {
+            mBluetoothAdapter.disable();
+        }
+    }
+
+    @Override
+    public void onClicked() {
+        Intent intent = new Intent(mContext, BluetoothSettingsActivity.class);
+        mContext.startActivity(intent);
+    }
+
+    @Override
+    public CharSequence getDesc() {
+        return mContext.getText(R.string.bluetooth_settings_summary);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return mBluetoothAdapter.isEnabled();
+    }
+
+    @Override
+    public @DrawableRes int getIcon() {
+        return getIconRes(mBluetoothAdapter.isEnabled());
+    }
+
+    public void onBluetoothStateChanged(boolean enabled) {
+        if (mIconUpdateListener == null) {
+            return;
+        }
+        mIconUpdateListener.onUpdateIcon(getIconRes(enabled));
+    }
+
+    private @DrawableRes int getIconRes(boolean enabled) {
+        return enabled
+                ? R.drawable.ic_settings_bluetooth : R.drawable.ic_settings_bluetooth_disabled;
+    }
+}
diff --git a/src/com/android/car/settings/home/HomepageActivity.java b/src/com/android/car/settings/home/HomepageActivity.java
new file mode 100644
index 0000000..ce59b73
--- /dev/null
+++ b/src/com/android/car/settings/home/HomepageActivity.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.car.settings.home;
+
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.ApplicationSettingsActivity;
+import com.android.car.settings.common.ListSettingsActivity;
+import com.android.car.settings.common.SimpleIconLineItem;
+import com.android.car.settings.common.TypedPagedListAdapter;
+import com.android.car.settings.datetime.DatetimeSettingsActivity;
+import com.android.car.settings.display.DisplaySettingsActivity;
+import com.android.car.settings.sound.SoundSettingsActivity;
+import com.android.car.settings.system.SystemSettingsActivity;
+import com.android.car.settings.wifi.CarWifiManager;
+
+import java.util.ArrayList;
+
+/**
+ * Homepage for settings for car.
+ */
+public class HomepageActivity extends ListSettingsActivity implements CarWifiManager.Listener {
+    private CarWifiManager mCarWifiManager;
+    private WifiLineItem mWifiLineItem;
+    private BluetoothLineItem mBluetoothLineItem;
+
+    private final BroadcastReceiver mBtStateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+
+            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+                int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+                        BluetoothAdapter.ERROR);
+                switch (state) {
+                    case BluetoothAdapter.STATE_TURNING_OFF:
+                        // TODO show a different status icon?
+                    case BluetoothAdapter.STATE_OFF:
+                        mBluetoothLineItem.onBluetoothStateChanged(false);
+                        break;
+                    default:
+                        mBluetoothLineItem.onBluetoothStateChanged(true);
+                }
+            }
+        }
+    };
+    private final IntentFilter mBtStateChangeFilter =
+            new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        mCarWifiManager = new CarWifiManager(this /* context */ , this /* listener */);
+        mWifiLineItem = new WifiLineItem(this, mCarWifiManager);
+        mBluetoothLineItem = new BluetoothLineItem(this);
+
+        // Call super after the wifiLineItem and BluetoothLineItem are setup, because
+        // those are needed in super.onCreate().
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    public void onAccessPointsChanged() {
+        // don't care
+    }
+
+    @Override
+    public void onWifiStateChanged(int state) {
+        mWifiLineItem.onWifiStateChanged(state);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mCarWifiManager.start();
+        registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mCarWifiManager.stop();
+        unregisterReceiver(mBtStateReceiver);
+    }
+
+    @Override
+    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
+        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
+        lineItems.add(new SimpleIconLineItem(
+                R.string.display_settings,
+                R.drawable.ic_settings_display,
+                this,
+                null,
+                DatetimeSettingsActivity.class));
+        lineItems.add(new SimpleIconLineItem(
+                R.string.sound_settings,
+                R.drawable.ic_settings_sound,
+                this,
+                null,
+                SoundSettingsActivity.class));
+        lineItems.add(mWifiLineItem);
+        lineItems.add(mBluetoothLineItem);
+        lineItems.add(new SimpleIconLineItem(
+                R.string.applications_settings,
+                R.drawable.ic_settings_applications,
+                this,
+                null,
+                ApplicationSettingsActivity.class));
+        lineItems.add(new SimpleIconLineItem(
+                R.string.display_settings,
+                R.drawable.ic_settings_display,
+                this,
+                null,
+                DisplaySettingsActivity.class));
+        lineItems.add(new SimpleIconLineItem(
+                R.string.system_setting_title,
+                R.drawable.ic_settings_about,
+                this,
+                null,
+                SystemSettingsActivity.class));
+        return lineItems;
+    }
+
+    @Override
+    public void setupActionBar() {
+        getActionBar().hide();
+    }
+}
diff --git a/src/com/android/car/settings/home/WifiLineItem.java b/src/com/android/car/settings/home/WifiLineItem.java
new file mode 100644
index 0000000..39c2616
--- /dev/null
+++ b/src/com/android/car/settings/home/WifiLineItem.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.car.settings.home;
+
+import android.annotation.DrawableRes;
+import android.annotation.StringRes;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.IconToggleLineItem;
+import com.android.car.settings.wifi.CarWifiManager;
+import com.android.car.settings.wifi.WifiSettingsActivity;
+
+
+/**
+ * Represents the wifi line item on settings home page.
+ */
+public class WifiLineItem extends IconToggleLineItem {
+    private final Context mContext;
+    private final CarWifiManager mCarWifiManager;
+
+    public WifiLineItem(Context context, CarWifiManager carWifiManager) {
+        super(context.getText(R.string.wifi_settings), context);
+        mContext = context;
+        mCarWifiManager = carWifiManager;
+    }
+
+    @Override
+    public void onToggleClicked(boolean isChecked) {
+        mCarWifiManager.setWifiEnabled(isChecked);
+    }
+
+    @Override
+    public void onClicked() {
+        Intent intent = new Intent(mContext, WifiSettingsActivity.class);
+        mContext.startActivity(intent);
+    }
+
+    @Override
+    public CharSequence getDesc() {
+        return mContext.getText(R.string.wifi_settings_summary);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return mCarWifiManager.isWifiEnabled();
+    }
+
+    @Override
+    public @DrawableRes int getIcon() {
+        return getIconRes(mCarWifiManager.getWifiState());
+    }
+
+    public void onWifiStateChanged(int state) {
+        if (mIconUpdateListener == null) {
+            return;
+        }
+        mIconUpdateListener.onUpdateIcon(getIconRes(state));
+    }
+
+    private @DrawableRes int getIconRes(int state) {
+        switch (state) {
+            case WifiManager.WIFI_STATE_ENABLING:
+                //TODO show gray out?
+            case WifiManager.WIFI_STATE_DISABLED:
+                return R.drawable.ic_settings_wifi_disabled;
+            default:
+                return R.drawable.ic_settings_wifi;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/sound/SoundSettingsActivity.java b/src/com/android/car/settings/sound/SoundSettingsActivity.java
index 5e13185..07c9d97 100644
--- a/src/com/android/car/settings/sound/SoundSettingsActivity.java
+++ b/src/com/android/car/settings/sound/SoundSettingsActivity.java
@@ -23,7 +23,7 @@
 import android.os.IBinder;
 import android.view.View;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 /**
@@ -39,7 +39,6 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        showMenuIcon();
         setContentView(R.layout.volume_list);
 
         View mediaVolumeControllerView = findViewById(
diff --git a/src/com/android/car/settings/wifi/AddWifiActivity.java b/src/com/android/car/settings/wifi/AddWifiActivity.java
index a193bf4..d36400a 100644
--- a/src/com/android/car/settings/wifi/AddWifiActivity.java
+++ b/src/com/android/car/settings/wifi/AddWifiActivity.java
@@ -24,11 +24,10 @@
 import android.widget.Toast;
 import android.widget.ViewSwitcher;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 import com.android.settingslib.wifi.AccessPoint;
 
-import java.util.HashSet;
 import java.util.regex.Pattern;
 
 /**
@@ -65,7 +64,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mWifiManager = (WifiManager) getSystemService(WifiManager.class);
-        showMenuIcon();
+
         setContentView(R.layout.add_wifi);
         mSSidViewSwitcher = (ViewSwitcher) findViewById(R.id.wifi_name);
         mWifiNameDisplay = (TextView) findViewById(R.id.wifi_name_display);
diff --git a/src/com/android/car/settings/wifi/CarWifiManager.java b/src/com/android/car/settings/wifi/CarWifiManager.java
index 559ef13..32db2c0 100644
--- a/src/com/android/car/settings/wifi/CarWifiManager.java
+++ b/src/com/android/car/settings/wifi/CarWifiManager.java
@@ -40,7 +40,7 @@
     private WifiTracker mWifiTracker;
     private final HandlerThread mBgThread;
     private WifiManager mWifiManager;
-    interface Listener {
+    public interface Listener {
         /**
          * Something about wifi setting changed.
          */
@@ -112,6 +112,10 @@
         return mWifiManager.isWifiEnabled();
     }
 
+    public int getWifiState() {
+        return mWifiManager.getWifiState();
+    }
+
     public boolean setWifiEnabled(boolean enabled) {
         return mWifiManager.setWifiEnabled(enabled);
     }
diff --git a/src/com/android/car/settings/wifi/WifiDetailActivity.java b/src/com/android/car/settings/wifi/WifiDetailActivity.java
index fbd2a21..59b312b 100644
--- a/src/com/android/car/settings/wifi/WifiDetailActivity.java
+++ b/src/com/android/car/settings/wifi/WifiDetailActivity.java
@@ -30,7 +30,6 @@
 import com.android.car.settings.common.TypedPagedListAdapter;
 import com.android.settingslib.wifi.AccessPoint;
 
-import com.android.car.settings.CarSettingActivity;
 import com.android.car.settings.R;
 
 import java.util.ArrayList;
@@ -65,9 +64,9 @@
 
     @Override
     public void setupActionBar() {
+        super.setupActionBar();
         getActionBar().setCustomView(R.layout.action_bar_with_button);
         getActionBar().setDisplayShowCustomEnabled(true);
-        showMenuIcon();
     }
 
     @Override
diff --git a/src/com/android/car/settings/wifi/WifiSettingsActivity.java b/src/com/android/car/settings/wifi/WifiSettingsActivity.java
index 123ec3e..9ca6b02 100644
--- a/src/com/android/car/settings/wifi/WifiSettingsActivity.java
+++ b/src/com/android/car/settings/wifi/WifiSettingsActivity.java
@@ -23,8 +23,6 @@
 import android.support.car.ui.PagedListView;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.Switch;
@@ -33,7 +31,7 @@
 
 import android.annotation.StringRes;
 
-import com.android.car.settings.CarSettingActivity;
+import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
 import com.android.settingslib.wifi.AccessPoint;
@@ -60,11 +58,10 @@
         super.onCreate(savedInstanceState);
         mCarWifiManager = new CarWifiManager(this /* context */ , this /* listener */);
         setContentView(R.layout.wifi_list);
-        getActionBar().setCustomView(R.layout.action_bar_with_toggle);
-        getActionBar().setDisplayShowCustomEnabled(true);
-        ((TextView) findViewById(R.id.title)).setText(R.string.wifi_settings);
+
+        ((TextView) findViewById(R.id.action_bar_title)).setText(R.string.wifi_settings);
         mProgressBar = (ProgressBar) findViewById(R.id.wifi_search_progress);
-        mListView = (PagedListView) findViewById(android.R.id.list);
+        mListView = (PagedListView) findViewById(R.id.list);
         mMessageView = (TextView) findViewById(R.id.message);
         mViewSwitcher = (ViewSwitcher) findViewById(R.id.view_switcher);
         mAddWifiTextView = (TextView) findViewById(R.id.add_wifi);
@@ -90,6 +87,13 @@
     }
 
     @Override
+    public void setupActionBar() {
+        getActionBar().setCustomView(R.layout.action_bar_with_toggle);
+        getActionBar().setDisplayShowCustomEnabled(true);
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+    }
+
+    @Override
     public void onStart() {
         super.onStart();
         mCarWifiManager.start();
diff --git a/tests/robotests/src/com/android/car/settings/CarSettingActivityTest.java b/tests/robotests/src/com/android/car/settings/CarSettingActivityTest.java
deleted file mode 100644
index 44f3b4d..0000000
--- a/tests/robotests/src/com/android/car/settings/CarSettingActivityTest.java
+++ /dev/null
@@ -1,37 +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.car.settings;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class CarSettingActivityTest {
-
-    private CarSettingActivity mActivity;
-
-    @Test
-    public void testConstant() {
-        mActivity = new CarSettingActivity();
-        assertThat(mActivity.getSettingAction()).isEqualTo("android.car.settings.SETTINGS");
-        assertThat(mActivity.getSettingPkg()).isEqualTo("com.android.car.settings");
-    }
-}
