am fdcade18: am ff246059: am 5fc6ca11: am d7138ba4: am 6ab0f7a9: am e8566ffb: am c0b3754c: am 98970843: am 4dec9d0d: am d2bd9baf: am 8d309635: am fdcb8bbb: am aed7823a: resolve merge conflicts of 8e4ac6bd to jb-mr1.1-dev (merge -s ours)

* commit 'fdcade18504881c84e264d0c5831df0ae00aa2ec':
diff --git a/build/Android.mk b/build/Android.mk
index 04d4dca..5d36d14 100644
--- a/build/Android.mk
+++ b/build/Android.mk
@@ -112,7 +112,8 @@
     android-support-v13 \
     android-support-v17-leanback \
     android-support-multidex \
-    android-support-multidex-instrumentation
+    android-support-multidex-instrumentation \
+    android-support-design
 
 $(foreach lib, $(ANDROID_SUPPORT_LIBRARIES), $(eval $(call _package_sdk_library,$(lib))))
 
diff --git a/build/sdk.atree b/build/sdk.atree
index 9125719..269f4f9 100644
--- a/build/sdk.atree
+++ b/build/sdk.atree
@@ -469,7 +469,7 @@
 frameworks/support/v7/palette/README.txt                                                          extras/android/support/v7/palette/README.txt
 frameworks/support/v7/palette/.project                                                            extras/android/support/v7/palette/.project
 frameworks/support/v7/palette/.classpath                                                          extras/android/support/v7/palette/.classpath
-frameworks/support/v7/palette/AndroidManifest.xml                                                 extras/android/support/v7/palette/AndroidManifest.xml
+frameworks/support/v7/palette/src/main/AndroidManifest.xml                                        extras/android/support/v7/palette/AndroidManifest.xml
 frameworks/support/v7/palette/project.properties                                                  extras/android/support/v7/palette/project.properties
 ${OUT_DIR}/target/common/obj/PACKAGING/android-support-v7-palette_intermediates/android-support-v7-palette.jar    extras/android/support/v7/palette/libs/android-support-v7-palette.jar
 
@@ -493,6 +493,11 @@
 frameworks/support/v17/leanback/src/.readme                                                       extras/android/support/v17/leanback/src/.readme
 ${OUT_DIR}/target/common/obj/PACKAGING/android-support-v17-leanback_intermediates/android-support-v17-leanback.jar    extras/android/support/v17/leanback/libs/android-support-v17-leanback.jar
 
+frameworks/support/design/AndroidManifest.xml                                                     extras/android/support/design/AndroidManifest.xml
+frameworks/support/design/res                                                                     extras/android/support/design/res
+frameworks/support/design/src/.readme                                                             extras/android/support/design/src/.readme
+${OUT_DIR}/target/common/obj/PACKAGING/android-support-design_intermediates/android-support-design.jar    extras/android/support/design/libs/android-support-design.jar
+
 ##############################################################################
 # Tests Component
 ##############################################################################
diff --git a/samples/Support4Demos/AndroidManifest.xml b/samples/Support4Demos/AndroidManifest.xml
index 5b43488..f66f585 100644
--- a/samples/Support4Demos/AndroidManifest.xml
+++ b/samples/Support4Demos/AndroidManifest.xml
@@ -351,6 +351,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".widget.NestedScrollActivity"
+                  android:label="@string/nested_scroll">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
 <!-- BEGIN_INCLUDE(file_provider_declaration) -->
         <provider
             android:name="android.support.v4.content.FileProvider"
diff --git a/samples/Support4Demos/res/layout/nested_scroll.xml b/samples/Support4Demos/res/layout/nested_scroll.xml
new file mode 100644
index 0000000..7793535
--- /dev/null
+++ b/samples/Support4Demos/res/layout/nested_scroll.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!--
+    A NestedScrollView behaves like a ScrollView, but it can be placed into
+    other nested scrolling containers or have other nested scrolling containers
+    placed into it.
+-->
+<android.support.v4.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="16dp">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearance"
+            android:text="@string/nested_scroll_long_text" />
+        <android.support.v4.widget.NestedScrollView
+            android:layout_width="match_parent"
+            android:layout_height="200dp"
+            android:padding="16dp">
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearance"
+                android:text="@string/nested_scroll_long_text" />
+        </android.support.v4.widget.NestedScrollView>
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearance"
+            android:text="@string/nested_scroll_long_text" />
+    </LinearLayout>
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/values/strings.xml b/samples/Support4Demos/res/values/strings.xml
index 91b5c42..d17c062 100644
--- a/samples/Support4Demos/res/values/strings.xml
+++ b/samples/Support4Demos/res/values/strings.xml
@@ -184,4 +184,9 @@
 
     <!--  Swipe refresh -->
     <string name="swipe">Widget/SwipeRefreshLayout</string>
+
+    <string name="nested_scroll">Widget/Nested Scrolling</string>
+
+    <string name="nested_scroll_long_text">This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it.</string>
+
 </resources>
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java
new file mode 100644
index 0000000..87a31fc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv4.widget;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.example.android.supportv4.R;
+
+/**
+ * This activity demonstrates the use of nested scrolling in the v4 support library.
+ * See the associated layout file for details.
+ */
+public class NestedScrollActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.nested_scroll);
+    }
+}
diff --git a/samples/Support7Demos/Android.mk b/samples/Support7Demos/Android.mk
index 0d2fadb..e3d54d0 100644
--- a/samples/Support7Demos/Android.mk
+++ b/samples/Support7Demos/Android.mk
@@ -29,14 +29,20 @@
         android-support-v7-mediarouter \
         android-support-v7-palette \
         android-support-v7-recyclerview \
-        android-support-v7-cardview
+        android-support-v7-cardview \
+        android-support-design
 LOCAL_RESOURCE_DIR = \
         $(LOCAL_PATH)/res \
         frameworks/support/v7/appcompat/res \
         frameworks/support/v7/gridlayout/res \
         frameworks/support/v7/mediarouter/res \
-        frameworks/support/v7/cardview/res
+        frameworks/support/v7/cardview/res \
+        frameworks/support/design/res
 LOCAL_AAPT_FLAGS := \
         --auto-add-overlay \
-        --extra-packages android.support.v7.cardview:android.support.v7.appcompat:android.support.v7.gridlayout:android.support.v7.mediarouter
+        --extra-packages android.support.v7.appcompat \
+        --extra-packages android.support.v7.cardview \
+        --extra-packages android.support.v7.gridlayout \
+        --extra-packages android.support.v7.mediarouter \
+        --extra-packages android.support.design
 include $(BUILD_PACKAGE)
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
index 1d087a4..a84dc22 100644
--- a/samples/Support7Demos/AndroidManifest.xml
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -204,6 +204,51 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".app.ActionBarPreferences"
+                  android:label="@string/action_bar_preferences"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarActionMode"
+                  android:label="@string/action_bar_action_mode"
+                  android:theme="@style/Theme.Custom">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsButtons"
+                  android:label="@string/appcompat_widgets_buttons"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsSpinners"
+                  android:label="@string/appcompat_widgets_spinners"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsTextInput"
+                  android:label="@string/appcompat_widgets_text_input"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
         <activity android:name=".app.ToolbarUsage"
                   android:label="@string/toolbar_usage"
                   android:theme="@style/Theme.Custom.NoActionBar">
@@ -235,6 +280,33 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".app.ToolbarActionMode"
+                  android:label="@string/toolbar_action_mode"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.DialogUsage"
+                  android:label="@string/dialog_usage"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AlertDialogUsage"
+                  android:label="@string/alert_dialog_usage"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
         <provider android:name=".app.RecentSuggestionsProvider"
                   android:authorities="com.example.android.supportv7.RecentSuggestionsProvider" />
 
@@ -266,6 +338,16 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".util.SortedListActivity"
+                  android:label="@string/sorted_list_activity"
+                  android:windowSoftInputMode="adjustResize"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
         <activity android:name=".widget.GridLayoutManagerActivity"
                   android:label="@string/grid_layout_manager"
                   android:theme="@style/Theme.AppCompat">
diff --git a/samples/Support7Demos/res/color/card_selector.xml b/samples/Support7Demos/res/color/card_selector.xml
new file mode 100644
index 0000000..48b35ee
--- /dev/null
+++ b/samples/Support7Demos/res/color/card_selector.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:color="@color/card_tropical"/>
+    <item android:state_pressed="true" android:color="@color/card_tropical"/>
+    <item android:color="@color/card_yellow"/>
+</selector>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/action_bar_action_mode.xml b/samples/Support7Demos/res/layout/action_bar_action_mode.xml
new file mode 100644
index 0000000..d498fda
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_action_mode.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent">
+
+    <Button
+            android:id="@+id/btn_start_action_mode"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:text="@string/start_action_mode"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/activity_base_layout_manager.xml b/samples/Support7Demos/res/layout/activity_base_layout_manager.xml
index f75018e..e56329e 100644
--- a/samples/Support7Demos/res/layout/activity_base_layout_manager.xml
+++ b/samples/Support7Demos/res/layout/activity_base_layout_manager.xml
@@ -56,4 +56,5 @@
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:id="@+id/recycler_view"/>
+
 </LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/activity_card_view.xml b/samples/Support7Demos/res/layout/activity_card_view.xml
index 9b985f7..3e1b928 100644
--- a/samples/Support7Demos/res/layout/activity_card_view.xml
+++ b/samples/Support7Demos/res/layout/activity_card_view.xml
@@ -132,46 +132,58 @@
                 android:text="@string/card_view_bg_color"
                 android:layout_below="@id/alpha_label"
                 android:layout_alignRight="@id/alpha_label"/>
-        <RadioGroup
-                android:id="@+id/select_bg_color_radio"
-                android:layout_toRightOf="@id/color_label"
-                android:layout_alignTop="@id/color_label"
-                android:layout_width="fill_parent"
+
+        <ScrollView
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_below="@id/alpha_seek_bar">
-            <RadioButton
-                    android:id="@+id/def"
-                    android:layout_width="40dp"
+                android:layout_below="@id/alpha_seek_bar"
+                android:layout_toRightOf="@id/color_label"
+                android:layout_alignParentRight="true"
+                android:layout_alignTop="@id/color_label">
+
+            <RadioGroup
+                    android:id="@+id/select_bg_color_radio"
+                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:background="@color/cardview_light_background"
-                    android:checked="true"/>
-            <RadioButton
-                    android:id="@+id/yellow"
-                    android:layout_width="40dp"
-                    android:layout_height="wrap_content"
-                    android:background="@color/card_yellow"/>
-            <RadioButton
-                    android:id="@+id/aquatic"
-                    android:layout_width="40dp"
-                    android:layout_height="wrap_content"
-                    android:background="@color/card_aquatic"/>
-            <RadioButton
-                    android:id="@+id/classic"
-                    android:layout_width="40dp"
-                    android:layout_height="wrap_content"
-                    android:background="@color/card_classic"/>
-            <RadioButton
-                    android:id="@+id/sunbrite"
-                    android:layout_width="40dp"
-                    android:layout_height="wrap_content"
-                    android:background="@color/card_sunbrite"/>
-            <RadioButton
-                    android:id="@+id/tropical"
-                    android:layout_width="40dp"
-                    android:layout_height="wrap_content"
-                    android:background="@color/card_tropical"/>
-        </RadioGroup>
+                    android:orientation="horizontal">
+                <RadioButton
+                        android:id="@+id/def"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/cardview_light_background"
+                        android:checked="true"/>
+                <RadioButton
+                        android:id="@+id/yellow"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_yellow"/>
+                <RadioButton
+                        android:id="@+id/aquatic"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_aquatic"/>
+                <RadioButton
+                        android:id="@+id/classic"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_classic"/>
+                <RadioButton
+                        android:id="@+id/sunbrite"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_sunbrite"/>
+                <RadioButton
+                        android:id="@+id/tropical"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_tropical"/>
+                <RadioButton
+                        android:id="@+id/selector"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/cardview_background_selector_label"/>
+            </RadioGroup>
+        </ScrollView>
         <RadioGroup
                 android:id="@+id/select_target_radio"
                 android:layout_width="fill_parent"
@@ -199,7 +211,9 @@
                 android:id="@+id/card_view"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                card_view:cardElevation="10dp">
+                card_view:cardElevation="10dp"
+                android:clickable="true"
+                android:layout_margin="8dp">
             <TextView
                     android:id="@+id/info_text"
                     android:text="@string/card_view"
diff --git a/samples/Support7Demos/res/layout/alert_dialog_usage.xml b/samples/Support7Demos/res/layout/alert_dialog_usage.xml
new file mode 100644
index 0000000..9c6dee6
--- /dev/null
+++ b/samples/Support7Demos/res/layout/alert_dialog_usage.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp">
+
+    <Spinner
+            android:id="@+id/spinner_dialogs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:entries="@array/alert_dialog_types"
+            android:layout_marginBottom="16dp"/>
+
+    <Button
+            android:id="@+id/btn_show_dialog"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Show selected dialog"
+            android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml b/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
new file mode 100644
index 0000000..aa07328
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="vertical"
+                  android:padding="16dp">
+
+        <android.support.v7.widget.SwitchCompat
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="Switch"/>
+
+        <CheckBox
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="CheckBox"/>
+
+        <RadioGroup
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+            <RadioButton
+                    android:id="@+id/radiobutton_1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+            <RadioButton
+                    android:id="@+id/radiobutton_2"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+        </RadioGroup>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (small)"
+                style="@style/Widget.AppCompat.Button.Small"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (borderless)"
+                style="@style/Widget.AppCompat.Button.Borderless"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (borderless + colored)"
+                style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
+
+        <RatingBar
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml b/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml
new file mode 100644
index 0000000..d242735
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+    <EditText
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="EditText"/>
+
+    <AutoCompleteTextView
+            android:id="@+id/widgets_autocompletetextview"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="AutoCompleteTextView"/>
+
+    <MultiAutoCompleteTextView
+            android:id="@+id/widgets_multiautocompletetextview"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="MultiAutoCompleteTextView"/>
+
+    <CheckedTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="CheckedTextView"
+            android:checked="true"
+            android:checkMark="?android:listChoiceIndicatorMultiple"/>
+
+</LinearLayout>
+
+
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml b/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml
new file mode 100644
index 0000000..0a60632
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              android:padding="16dp">
+
+    <Spinner
+            android:id="@+id/widgets_spinner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+
+    <Spinner
+            android:id="@+id/widgets_spinner_underlined"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            style="@style/Widget.AppCompat.Spinner.Underlined"/>
+
+</LinearLayout>
+
+
diff --git a/samples/Support7Demos/res/layout/dialog_content.xml b/samples/Support7Demos/res/layout/dialog_content.xml
new file mode 100644
index 0000000..7734960
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_content.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/dialog_content"/>
+
+    <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/app_sample_code" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/dialog_content_buttons.xml b/samples/Support7Demos/res/layout/dialog_content_buttons.xml
new file mode 100644
index 0000000..ab69748
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_content_buttons.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/dialog_content"/>
+
+    <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/app_sample_code" />
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            style="?attr/buttonBarStyle">
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@android:string/no"
+                style="?attr/buttonBarButtonStyle"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@android:string/ok"
+                style="?attr/buttonBarButtonStyle"/>
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/dialog_usage.xml b/samples/Support7Demos/res/layout/dialog_usage.xml
new file mode 100644
index 0000000..4ef0626
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_usage.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp">
+
+    <Spinner
+            android:id="@+id/spinner_dialogs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:entries="@array/dialog_types"
+            android:layout_marginBottom="16dp"/>
+
+    <Button
+            android:id="@+id/btn_show_dialog"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Show selected dialog"
+            android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/sorted_list_activity.xml b/samples/Support7Demos/res/layout/sorted_list_activity.xml
new file mode 100644
index 0000000..e20db0f
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sorted_list_activity.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <EditText
+            android:id="@+id/new_item_text_view"
+            style="@style/SortedListItem"
+            android:imeOptions="actionDone"
+            android:singleLine="true"
+            android:hint="@string/add_new_item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+
+    <android.support.v7.widget.RecyclerView android:layout_width="match_parent"
+                                            android:layout_height="match_parent"
+                                            android:id="@+id/recycler_view"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/sorted_list_item_view.xml b/samples/Support7Demos/res/layout/sorted_list_item_view.xml
new file mode 100644
index 0000000..cd476ab
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sorted_list_item_view.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
+          style="@style/SortedListItem"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content">
+</CheckBox>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_action_mode.xml b/samples/Support7Demos/res/layout/toolbar_action_mode.xml
new file mode 100644
index 0000000..e2a1dd8
--- /dev/null
+++ b/samples/Support7Demos/res/layout/toolbar_action_mode.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:minHeight="?actionBarSize"
+            android:background="?attr/colorPrimaryDark"/>
+
+    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:layout_width="match_parent"
+                 android:layout_height="0px"
+                 android:layout_weight="1">
+
+        <Button
+                android:id="@+id/btn_start_action_mode"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/start_action_mode"/>
+
+    </FrameLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_usage.xml b/samples/Support7Demos/res/layout/toolbar_usage.xml
index b202e1f..76944be 100644
--- a/samples/Support7Demos/res/layout/toolbar_usage.xml
+++ b/samples/Support7Demos/res/layout/toolbar_usage.xml
@@ -27,7 +27,7 @@
             android:layout_width="match_parent"
             android:minHeight="?attr/actionBarSize"
             android:background="?attr/colorPrimaryDark"
-            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
             app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
 
     <TextView
diff --git a/samples/Support7Demos/res/values/arrays.xml b/samples/Support7Demos/res/values/arrays.xml
index 8d658eb..c4d3987 100644
--- a/samples/Support7Demos/res/values/arrays.xml
+++ b/samples/Support7Demos/res/values/arrays.xml
@@ -28,4 +28,18 @@
         <item>http://archive.org/download/Sintel/sintel-2048-stereo_512kb.mp4</item>
         <item>http://archive.org/download/Tears-of-Steel/tears_of_steel_720p.mp4</item>
     </string-array>
+
+    <string-array name="dialog_types">
+        <item>Simple</item>
+        <item>Simple with Action Bar</item>
+        <item>Button bar</item>
+    </string-array>
+
+    <string-array name="alert_dialog_types">
+        <item>Simple</item>
+        <item>Simple with buttons</item>
+        <item>List (single choice)</item>
+        <item>List (multi choice)</item>
+    </string-array>
+
 </resources>
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
index 4b3a28f..3480142 100644
--- a/samples/Support7Demos/res/values/strings.xml
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -56,6 +56,11 @@
     <string name="action_bar_settings_action_provider">AppCompat/Action Bar/Settings Action Provider</string>
     <string name="action_bar_settings_action_provider_no_handling">Handling in onOptionsItemSelected avoided</string>
     <string name="action_bar_with_navigation_drawer">AppCompat/Action Bar/Navigation Drawer Toggle</string>
+    <string name="action_bar_preferences">AppCompat/Action Bar/Preferences</string>
+    <string name="action_bar_action_mode">AppCompat/Action Bar/Action Mode</string>
+    <string name="appcompat_widgets_buttons">AppCompat/Widgets/Buttons</string>
+    <string name="appcompat_widgets_spinners">AppCompat/Widgets/Spinners</string>
+    <string name="appcompat_widgets_text_input">AppCompat/Widgets/Text Input</string>
 
     <string name="action_bar_search">Search</string>
     <string name="action_bar_add">Add</string>
@@ -125,6 +130,12 @@
     <string name="toolbar_usage">AppCompat/Toolbar/Toolbar as Action Bar</string>
     <string name="toolbar_display_options">AppCompat/Toolbar/Toolbar Display Options</string>
     <string name="toolbar_fragment_pager">AppCompat/Toolbar/Toolbar Fragment ViewPager</string>
+    <string name="toolbar_action_mode">AppCompat/Toolbar/Action Mode</string>
+
+    <string name="dialog_usage">AppCompat/Dialog/Dialog Usage</string>
+    <string name="dialog_title">My great dialog</string>
+    <string name="dialog_content">My great dialog is great</string>
+    <string name="alert_dialog_usage">AppCompat/Dialog/AlertDialog Usage</string>
 
     <string name="sample_media_route_provider_remote">Remote Playback (Simulated)</string>
     <string name="sample_media_route_activity_local">Local Playback</string>
@@ -158,9 +169,13 @@
     <string name="card_view_sample_text">Sample text on right</string>
     <string name="card_view_resize_card_view">Resize CardView</string>
     <string name="card_view_resize_content">Resize Content</string>
+    <string name="cardview_background_selector_label">Selector</string>
 
     <string name="palette">Palette</string>
     <string name="palette_all_colors">Full color palette</string>
     <string name="search_hint">Search...</string>
+    <string name="sorted_list_activity">Sorted List</string>
+    <string name="add_new_item">Add New Item</string>
+    <string name="start_action_mode">Start Action Mode</string>
 
 </resources>
diff --git a/samples/Support7Demos/res/values/styles.xml b/samples/Support7Demos/res/values/styles.xml
index f085fa5..26a9f70 100644
--- a/samples/Support7Demos/res/values/styles.xml
+++ b/samples/Support7Demos/res/values/styles.xml
@@ -29,4 +29,8 @@
         <item name="colorAccent">#ffff00</item>
     </style>
 
+    <style name="SortedListItem" parent="@android:style/TextAppearance.Medium">
+        <item name="android:minHeight">35dp</item>
+    </style>
+
 </resources>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/xml/preferences.xml b/samples/Support7Demos/res/xml/preferences.xml
new file mode 100644
index 0000000..3ec0f25
--- /dev/null
+++ b/samples/Support7Demos/res/xml/preferences.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <PreferenceCategory
+            android:title="My category">
+
+        <CheckBoxPreference
+                android:key="check_1"
+                android:summary="Check or not, that is the question"
+                android:title="Checkbox Preference 1"/>
+
+        <EditTextPreference
+                android:key="edit_1"
+                android:summary="Input some text here"
+                android:title="EditText Preference 1"/>
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java
new file mode 100644
index 0000000..6edf593
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of an action mode.
+ */
+public class ActionBarActionMode extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.action_bar_action_mode);
+
+        findViewById(R.id.btn_start_action_mode).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActionMode();
+            }
+        });
+    }
+
+    private void startActionMode() {
+        startSupportActionMode(new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                mode.getMenuInflater().inflate(R.menu.actions, menu);
+                return true;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                Toast.makeText(ActionBarActionMode.this,
+                        "Action Mode item clicked:" + item.getTitle(), Toast.LENGTH_SHORT).show();
+                return true;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        });
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
index ebda999..d4eef84 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
@@ -21,7 +21,7 @@
 import android.support.v4.app.FragmentTransaction;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBar.Tab;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.view.Gravity;
 import android.view.Menu;
 import android.view.View;
@@ -29,10 +29,12 @@
 import android.widget.ArrayAdapter;
 import android.widget.Toast;
 
+;
+
 /**
  * This demo shows how various action bar display option flags can be combined and their effects.
  */
-public class ActionBarDisplayOptions extends ActionBarActivity
+public class ActionBarDisplayOptions extends AppCompatActivity
         implements View.OnClickListener, ActionBar.TabListener {
     private View mCustomView;
     private ActionBar.LayoutParams mCustomViewLayoutParams;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
index 207631e..e2779d0 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
@@ -16,17 +16,17 @@
 
 package com.example.android.supportv7.app;
 
-import android.support.v4.view.MenuItemCompat;
-import android.view.Menu;
-import android.view.MenuItem;
 import com.example.android.supportv7.R;
 
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.view.Menu;
 import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.CheckBox;
@@ -35,7 +35,7 @@
 /**
  * Demonstrates how fragments can participate in the options menu.
  */
-public class ActionBarFragmentMenu extends ActionBarActivity {
+public class ActionBarFragmentMenu extends AppCompatActivity {
     MenuFragment mFragment1;
     Menu2Fragment mFragment2;
     CheckBox mCheckBox1;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
index ed4b97b..568c287 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
@@ -18,7 +18,7 @@
 import android.os.Bundle;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v4.view.WindowCompat;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.widget.Toast;
@@ -28,7 +28,7 @@
  * standard options menu. This demo is for informative purposes only; see ActionBarUsage for
  * an example of using the Action Bar in a more idiomatic manner.
  */
-public class ActionBarMechanics extends ActionBarActivity {
+public class ActionBarMechanics extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java
new file mode 100644
index 0000000..810e615
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 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.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+/**
+ * This demonstrates how to use our custom AppCompat {@link android.preference.PreferenceActivity}.
+ */
+public class ActionBarPreferences extends AppCompatPreferenceActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Load some preferences from resources
+        addPreferencesFromResource(R.xml.preferences);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.actions, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
+        return true;
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
index ba1ccbe..5fb667a 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
@@ -16,18 +16,19 @@
 
 package com.example.android.supportv7.app;
 
+import com.example.android.supportv7.R;
+
 import android.content.Context;
 import android.content.Intent;
 import android.provider.Settings;
-import android.support.v7.app.ActionBarActivity;
 import android.support.v4.view.ActionProvider;
+import android.support.v7.app.AppCompatActivity;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.ImageButton;
 import android.widget.Toast;
-import com.example.android.supportv7.R;
 
 /**
  * This activity demonstrates how to implement an {@link android.view.ActionProvider}
@@ -35,7 +36,7 @@
  * ActionProvider for launching the system settings and adds a menu item with that
  * provider.
  */
-public class ActionBarSettingsActionProviderActivity extends ActionBarActivity {
+public class ActionBarSettingsActionProviderActivity extends AppCompatActivity {
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java
index 4bfea50..a8c87f4 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java
@@ -15,24 +15,25 @@
  */
 package com.example.android.supportv7.app;
 
+import com.example.android.supportv7.R;
+
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBar.Tab;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
 import android.widget.Toast;
-import com.example.android.supportv7.R;
 
 /**
  * This demonstrates the use of action bar tabs and how they interact
  * with other action bar features.
  */
-public class ActionBarTabs extends ActionBarActivity {
+public class ActionBarTabs extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
index f8c29ca..8772601 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
@@ -20,7 +20,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v4.view.MenuItemCompat;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.SearchView;
 import android.text.TextUtils;
 import android.view.Menu;
@@ -35,7 +35,7 @@
  * menu data itself. If you'd like to see how these things work under the hood, see
  * ActionBarMechanics.
  */
-public class ActionBarUsage extends ActionBarActivity {
+public class ActionBarUsage extends AppCompatActivity {
     TextView mSearchText;
     int mSortMode = -1;
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java
index 3519a38..a45edc9 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarWithDrawerLayout.java
@@ -15,24 +15,24 @@
  */
 package com.example.android.supportv7.app;
 
+import com.example.android.supportv7.R;
 import com.example.android.supportv7.Shakespeare;
 
-import android.support.v7.app.ActionBarActivity;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
-import com.example.android.supportv7.R;
 
-public class ActionBarWithDrawerLayout extends ActionBarActivity {
+public class ActionBarWithDrawerLayout extends AppCompatActivity {
     private DrawerLayout mDrawerLayout;
     private ListView mDrawer;
     private TextView mContent;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
new file mode 100644
index 0000000..560111b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.Spinner;
+
+/**
+ * This demonstrates idiomatic usage of AppCompat's AlertDialog.
+ */
+public class AlertDialogUsage extends AppCompatActivity {
+
+    private Spinner mSpinner;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.alert_dialog_usage);
+
+        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+
+        // Add an OnClickListener to show our selected dialog
+        findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showSelectedDialog();
+            }
+        });
+    }
+
+    private void showSelectedDialog() {
+        switch (mSpinner.getSelectedItemPosition()) {
+            case 0:
+                showSimpleDialog();
+                break;
+            case 1:
+                showSimpleButtonsDialog();
+                break;
+            case 2:
+                showSingleChoiceDialog();
+                break;
+            case 3:
+                showMultiChoiceDialog();
+                break;
+        }
+    }
+
+    private void showSimpleDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMessage(R.string.dialog_content);
+        b.show();
+    }
+
+    private void showSimpleButtonsDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMessage(R.string.dialog_content);
+        b.setNegativeButton("-ve", null);
+        b.setPositiveButton("+ve", null);
+        b.show();
+    }
+
+    private void showSingleChoiceDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setSingleChoiceItems(Cheeses.sCheeseStrings, 0, null);
+        b.setPositiveButton("OK", null);
+        b.show();
+    }
+
+    private void showMultiChoiceDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMultiChoiceItems(Cheeses.sCheeseStrings, null, null);
+        b.setPositiveButton("OK", null);
+        b.show();
+    }
+
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
new file mode 100644
index 0000000..e2ae88c
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.Nullable;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
+ * to be used with AppCompat.
+ *
+ * This technique can be used with an {@link android.app.Activity} class, not just
+ * {@link android.preference.PreferenceActivity}.
+ */
+public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
+
+    private AppCompatDelegate mDelegate;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        getDelegate().installViewFactory();
+        getDelegate().onCreate(savedInstanceState);
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+        getDelegate().onPostCreate(savedInstanceState);
+    }
+
+    public ActionBar getSupportActionBar() {
+        return getDelegate().getSupportActionBar();
+    }
+
+    public void setSupportActionBar(@Nullable Toolbar toolbar) {
+        getDelegate().setSupportActionBar(toolbar);
+    }
+
+    @Override
+    public MenuInflater getMenuInflater() {
+        return getDelegate().getMenuInflater();
+    }
+
+    @Override
+    public void setContentView(@LayoutRes int layoutResID) {
+        getDelegate().setContentView(layoutResID);
+    }
+
+    @Override
+    public void setContentView(View view) {
+        getDelegate().setContentView(view);
+    }
+
+    @Override
+    public void setContentView(View view, ViewGroup.LayoutParams params) {
+        getDelegate().setContentView(view, params);
+    }
+
+    @Override
+    public void addContentView(View view, ViewGroup.LayoutParams params) {
+        getDelegate().addContentView(view, params);
+    }
+
+    @Override
+    protected void onPostResume() {
+        super.onPostResume();
+        getDelegate().onPostResume();
+    }
+
+    @Override
+    protected void onTitleChanged(CharSequence title, int color) {
+        super.onTitleChanged(title, color);
+        getDelegate().setTitle(title);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        getDelegate().onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        getDelegate().onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        getDelegate().onDestroy();
+    }
+
+    public void invalidateOptionsMenu() {
+        getDelegate().invalidateOptionsMenu();
+    }
+
+    private AppCompatDelegate getDelegate() {
+        if (mDelegate == null) {
+            mDelegate = AppCompatDelegate.create(this, null);
+        }
+        return mDelegate;
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
new file mode 100644
index 0000000..d8b2c4f
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * This demonstrates the styled {@link android.widget.Button} widgets in AppCompat.
+ */
+public class AppCompatWidgetsButtons extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_buttons);
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
new file mode 100644
index 0000000..2d22b99
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
+
+/**
+ * This demonstrates the styled {@link android.widget.Spinner} widgets in AppCompat.
+ */
+public class AppCompatWidgetsSpinners extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_text_spinners);
+
+        // Fetch the Spinners and set an adapter
+        Spinner spinner = (Spinner) findViewById(R.id.widgets_spinner);
+        spinner.setAdapter(new ArrayAdapter<>(this,
+                R.layout.support_simple_spinner_dropdown_item, Cheeses.sCheeseStrings));
+
+        spinner = (Spinner) findViewById(R.id.widgets_spinner_underlined);
+        spinner.setAdapter(new ArrayAdapter<>(this,
+                R.layout.support_simple_spinner_dropdown_item, Cheeses.sCheeseStrings));
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
new file mode 100644
index 0000000..c94bd19
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.MultiAutoCompleteTextView;
+
+/**
+ * This demonstrates the styled text input widgets in AppCompat, such as
+ * {@link android.widget.EditText}, {@link android.widget.AutoCompleteTextView} and
+ * {@link android.widget.MultiAutoCompleteTextView}.
+ */
+public class AppCompatWidgetsTextInput extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_text_input);
+
+        // Fetch the AutoCompleteTextView and set an adapter
+        AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(
+                R.id.widgets_autocompletetextview);
+        actv.setAdapter(new ArrayAdapter<>(this,
+                android.R.layout.simple_dropdown_item_1line, Cheeses.sCheeseStrings));
+
+        // Fetch the MultiAutoCompleteTextView and set an adapter and Tokenizer
+        MultiAutoCompleteTextView mactv = (MultiAutoCompleteTextView) findViewById(
+                R.id.widgets_multiautocompletetextview);
+        mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
+        mactv.setAdapter(new ArrayAdapter<>(this,
+                android.R.layout.simple_dropdown_item_1line, Cheeses.sCheeseStrings));
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
new file mode 100644
index 0000000..cf48d80
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDialog;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of AppCompatDialog.
+ */
+public class DialogUsage extends AppCompatActivity {
+
+    private Spinner mSpinner;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_usage);
+
+        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+
+        // Add an OnClickListener to show our selected dialog
+        findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showSelectedDialog();
+            }
+        });
+    }
+
+    private void showSelectedDialog() {
+        switch (mSpinner.getSelectedItemPosition()) {
+            case 0:
+                showSimpleDialog();
+                break;
+            case 1:
+                showSimpleDialogWithActionBar();
+                break;
+            case 2:
+                showButtonBarDialog();
+                break;
+        }
+    }
+
+    private void showSimpleDialog() {
+        Dialog dialog = new AppCompatDialog(this);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+    private void showSimpleDialogWithActionBar() {
+        AppCompatDialog dialog = new MenuDialog(this);
+        // Request the support Action Bar window feature
+        dialog.supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+    private void showButtonBarDialog() {
+        Dialog dialog = new AppCompatDialog(this);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content_buttons);
+        dialog.show();
+    }
+
+    /**
+     * A simple {@link android.support.v7.app.AppCompatDialog} implementation which
+     * inflates some items into it's options menu, and shows a toast when one is selected.
+     */
+    private class MenuDialog extends AppCompatDialog {
+
+        public MenuDialog(Context context) {
+            super(context);
+        }
+
+        @Override
+        public boolean onCreateOptionsMenu(Menu menu) {
+            getMenuInflater().inflate(R.menu.actions, menu);
+            return true;
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            Toast.makeText(getOwnerActivity(), "Dialog action selected: " + item.getTitle(),
+                    Toast.LENGTH_SHORT).show();
+            return true;
+        }
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
new file mode 100644
index 0000000..3977048
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of an action mode with a Toolbar.
+ */
+public class ToolbarActionMode extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.toolbar_action_mode);
+
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        findViewById(R.id.btn_start_action_mode).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActionMode();
+            }
+        });
+    }
+
+    private void startActionMode() {
+        startSupportActionMode(new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                mode.getMenuInflater().inflate(R.menu.actions, menu);
+                return true;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                Toast.makeText(ToolbarActionMode.this,
+                        "Action Mode item clicked:" + item.getTitle(), Toast.LENGTH_SHORT).show();
+                return true;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        });
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
index f5c3d75..e6d179b 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
@@ -19,23 +19,19 @@
 import com.example.android.supportv7.R;
 
 import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
 import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBar.Tab;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.Gravity;
 import android.view.Menu;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
-import android.widget.ArrayAdapter;
-import android.widget.Toast;
 
 /**
  * This demo shows how various action bar display option flags can be combined and their effects
  * when used on a Toolbar-provided Action Bar
  */
-public class ToolbarDisplayOptions extends ActionBarActivity
+public class ToolbarDisplayOptions extends AppCompatActivity
         implements View.OnClickListener {
 
     private View mCustomView;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
index 9b57933..575c7a1 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
@@ -23,10 +23,9 @@
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.app.FragmentTransaction;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -34,9 +33,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.widget.CheckBox;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -46,7 +43,7 @@
 /**
  * Demonstrates how fragments can participate in the options menu from within a {@link ViewPager}.
  */
-public class ToolbarFragmentPagerMenu extends ActionBarActivity {
+public class ToolbarFragmentPagerMenu extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
index f5ac03b..55e7f14 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
@@ -18,33 +18,20 @@
 import com.example.android.supportv7.R;
 
 import android.app.SearchManager;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.os.Handler;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
 import android.support.v4.view.MenuItemCompat;
-import android.support.v7.app.ActionBarActivity;
-import android.support.v7.view.ActionMode;
-import android.support.v7.widget.PopupMenu;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.SearchView;
 import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
 import android.widget.Toast;
 
 /**
  * This demonstrates idiomatic usage of the Toolbar as the action bar.
  */
-public class ToolbarUsage extends ActionBarActivity {
+public class ToolbarUsage extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
index 9f33f28..e82aa3a 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
@@ -30,7 +30,7 @@
 import android.support.v4.content.CursorLoader;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.ResourceCursorAdapter;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.graphics.Palette;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -46,7 +46,7 @@
  * Allows the customization of the number of colors used in the palette generation, to demonstrate
  * the difference in results for different types of images.
  */
-public class PaletteActivity extends ActionBarActivity {
+public class PaletteActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
index a91257f..d7fd47c 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
@@ -17,10 +17,11 @@
 package com.example.android.supportv7.graphics;
 
 import com.example.android.supportv7.R;
+
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.graphics.Palette;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -44,7 +45,7 @@
  * Also allows the customization of the number of colors used in the palette generation for
  * demonstration purposes.
  */
-public class PaletteDetailActivity extends ActionBarActivity {
+public class PaletteDetailActivity extends AppCompatActivity {
 
     private ImageView mImageView;
     private GridView mGridView;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
index a1d07fb..5f1cfd6 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
@@ -16,12 +16,12 @@
 
 package com.example.android.supportv7.media;
 
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 
 /**
  * This activity is a dummy settings activity for the
  * {@link SampleMediaRouteProvider}.
  */
-public class SampleMediaRouteSettingsActivity extends ActionBarActivity {
+public class SampleMediaRouteSettingsActivity extends AppCompatActivity {
 
 }
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
index ba19499..0a64c55 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
@@ -18,39 +18,34 @@
 
 import com.example.android.supportv7.R;
 
+import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.res.Resources;
-import android.app.PendingIntent;
 import android.media.AudioManager;
 import android.media.AudioManager.OnAudioFocusChangeListener;
-import android.media.MediaMetadataRetriever;
-import android.media.RemoteControlClient;
 import android.net.Uri;
-import android.os.Build;
+import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
-import android.os.Bundle;
 import android.os.SystemClock;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.view.MenuItemCompat;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.app.MediaRouteActionProvider;
-import android.support.v7.app.MediaRouteButton;
 import android.support.v7.app.MediaRouteControllerDialog;
 import android.support.v7.app.MediaRouteControllerDialogFragment;
-import android.support.v7.app.MediaRouteDiscoveryFragment;
 import android.support.v7.app.MediaRouteDialogFactory;
+import android.support.v7.app.MediaRouteDiscoveryFragment;
 import android.support.v7.media.MediaControlIntent;
+import android.support.v7.media.MediaItemStatus;
+import android.support.v7.media.MediaRouteSelector;
 import android.support.v7.media.MediaRouter;
 import android.support.v7.media.MediaRouter.Callback;
-import android.support.v7.media.MediaRouter.RouteInfo;
 import android.support.v7.media.MediaRouter.ProviderInfo;
-import android.support.v7.media.MediaRouteSelector;
-import android.support.v7.media.MediaItemStatus;
+import android.support.v7.media.MediaRouter.RouteInfo;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
@@ -63,12 +58,12 @@
 import android.widget.ArrayAdapter;
 import android.widget.ImageButton;
 import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.TabHost;
-import android.widget.TabHost.TabSpec;
-import android.widget.TabHost.OnTabChangeListener;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TabHost;
+import android.widget.TabHost.OnTabChangeListener;
+import android.widget.TabHost.TabSpec;
+import android.widget.TextView;
 
 import java.io.File;
 
@@ -81,7 +76,7 @@
  * targets.
  * </p>
  */
-public class SampleMediaRouterActivity extends ActionBarActivity {
+public class SampleMediaRouterActivity extends AppCompatActivity {
     private static final String TAG = "SampleMediaRouterActivity";
     private static final String DISCOVERY_FRAGMENT_TAG = "DiscoveryFragment";
 
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
new file mode 100644
index 0000000..8f3871d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.util;
+
+import com.example.android.supportv7.R;
+import android.os.Bundle;
+import android.support.v7.app.ActionBarActivity;
+import android.support.v7.util.SortedList;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.util.SortedListAdapterCallback;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.TextView;
+
+/**
+ * A sample activity that uses {@link SortedList} in combination with RecyclerView.
+ */
+public class SortedListActivity extends ActionBarActivity {
+    private RecyclerView mRecyclerView;
+    private LinearLayoutManager mLinearLayoutManager;
+    private SortedListAdapter mAdapter;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sorted_list_activity);
+        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView.setHasFixedSize(true);
+        mLinearLayoutManager = new LinearLayoutManager(this);
+        mRecyclerView.setLayoutManager(mLinearLayoutManager);
+        mAdapter = new SortedListAdapter(getLayoutInflater(),
+                new Item("buy milk"), new Item("wash the car"),
+                new Item("wash the dishes"));
+        mRecyclerView.setAdapter(mAdapter);
+        mRecyclerView.setHasFixedSize(true);
+        final EditText newItemTextView = (EditText) findViewById(R.id.new_item_text_view);
+        newItemTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
+                if (id == EditorInfo.IME_ACTION_DONE &&
+                        (keyEvent == null || keyEvent.getAction() == KeyEvent.ACTION_DOWN)) {
+                    final String text = textView.getText().toString().trim();
+                    if (text.length() > 0) {
+                        mAdapter.addItem(new Item(text));
+                    }
+                    textView.setText("");
+                    return true;
+                }
+                return false;
+            }
+        });
+    }
+
+    private static class SortedListAdapter extends RecyclerView.Adapter<TodoViewHolder> {
+        SortedList<Item> mData;
+        final LayoutInflater mLayoutInflater;
+        public SortedListAdapter(LayoutInflater layoutInflater, Item... items) {
+            mLayoutInflater = layoutInflater;
+            mData = new SortedList<Item>(Item.class, new SortedListAdapterCallback<Item>(this) {
+                @Override
+                public int compare(Item t0, Item t1) {
+                    if (t0.mIsDone != t1.mIsDone) {
+                        return t0.mIsDone ? 1 : -1;
+                    }
+                    int txtComp = t0.mText.compareTo(t1.mText);
+                    if (txtComp != 0) {
+                        return txtComp;
+                    }
+                    if (t0.id < t1.id) {
+                        return -1;
+                    } else if (t0.id > t1.id) {
+                        return 1;
+                    }
+                    return 0;
+                }
+
+                @Override
+                public boolean areContentsTheSame(Item oldItem,
+                        Item newItem) {
+                    return oldItem.mText.equals(newItem.mText);
+                }
+
+                @Override
+                public boolean areItemsTheSame(Item item1, Item item2) {
+                    return item1.id == item2.id;
+                }
+            });
+            for (Item item : items) {
+                mData.add(item);
+            }
+        }
+
+        public void addItem(Item item) {
+            mData.add(item);
+        }
+
+        @Override
+        public TodoViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
+            return new TodoViewHolder (
+                    mLayoutInflater.inflate(R.layout.sorted_list_item_view, parent, false)) {
+                @Override
+                void onDoneChanged(boolean isDone) {
+                    int adapterPosition = getAdapterPosition();
+                    if (adapterPosition == RecyclerView.NO_POSITION) {
+                        return;
+                    }
+                    mBoundItem.mIsDone = isDone;
+                    mData.recalculatePositionOfItemAt(adapterPosition);
+                }
+            };
+        }
+
+        @Override
+        public void onBindViewHolder(TodoViewHolder holder, int position) {
+            holder.bindTo(mData.get(position));
+        }
+
+        @Override
+        public int getItemCount() {
+            return mData.size();
+        }
+    }
+
+    abstract private static class TodoViewHolder extends RecyclerView.ViewHolder {
+        final CheckBox mCheckBox;
+        Item mBoundItem;
+        public TodoViewHolder(View itemView) {
+            super(itemView);
+            mCheckBox = (CheckBox) itemView;
+            mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    if (mBoundItem != null && isChecked != mBoundItem.mIsDone) {
+                        onDoneChanged(isChecked);
+                    }
+                }
+            });
+        }
+
+        public void bindTo(Item item) {
+            mBoundItem = item;
+            mCheckBox.setText(item.mText);
+            mCheckBox.setChecked(item.mIsDone);
+        }
+
+        abstract void onDoneChanged(boolean isChecked);
+    }
+
+    private static class Item {
+        String mText;
+        boolean mIsDone = false;
+        final public int id;
+        private static int idCounter = 0;
+
+        public Item(String text) {
+            id = idCounter ++;
+            this.mText = text;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
index ca0c08a..f5f8c4c 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
@@ -16,8 +16,6 @@
 package com.example.android.supportv7.view;
 
 import android.app.Activity;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.v4.view.ViewCompat;
@@ -30,8 +28,6 @@
 
 import com.example.android.supportv7.R;
 
-import java.lang.reflect.Field;
-
 public class CardViewActivity extends Activity {
 
     CardView mCardView;
@@ -182,6 +178,8 @@
                 return R.color.card_sunbrite;
             case R.id.tropical:
                 return R.color.card_tropical;
+            case R.id.selector:
+                return R.color.card_selector;
             default:
                 return R.color.cardview_light_background;
         }
diff --git a/samples/SupportDesignDemos/Android.mk b/samples/SupportDesignDemos/Android.mk
new file mode 100644
index 0000000..6da1811
--- /dev/null
+++ b/samples/SupportDesignDemos/Android.mk
@@ -0,0 +1,37 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportDesignDemos
+LOCAL_MODULE_TAGS := samples
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-appcompat \
+        android-support-design
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v7/appcompat/res \
+        frameworks/support/design/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v7.appcompat \
+        --extra-packages android.support.design
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportDesignDemos/AndroidManifest.xml b/samples/SupportDesignDemos/AndroidManifest.xml
new file mode 100644
index 0000000..a92f281
--- /dev/null
+++ b/samples/SupportDesignDemos/AndroidManifest.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Declare the contents of this Android application.  The namespace
+     attribute brings in the Android platform namespace, and the package
+     supplies a unique name for the application.  When writing your
+     own application, the package name must be changed from "com.example.*"
+     to come from a domain that you own or have control over. -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.support.design">
+
+    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
+
+    <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
+            android:icon="@drawable/app_sample_code">
+
+        <activity android:name="SupportDesignDemos">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.FloatingActionButtonUsage"
+                  android:label="@string/design_fab"
+                  android:theme="@style/Theme.FAB">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TabLayoutUsage"
+                  android:label="@string/design_tabs_basic"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/layout/design_fab.xml b/samples/SupportDesignDemos/res/layout/design_fab.xml
new file mode 100644
index 0000000..26a128a
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_fab.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:app="http://schemas.android.com/apk/res-auto"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:minHeight="?attr/actionBarSize"
+            android:background="?attr/colorPrimaryDark"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:clipToPadding="true">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textAppearance="@style/TextAppearance.AppCompat.Title"
+                android:text="@string/fab_size_normal"
+                android:layout_margin="16dp"/>
+
+        <android.support.design.widget.FloatingActionButton
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_margin="16dp"
+                android:src="@drawable/abc_ic_ab_back_mtrl_am_alpha"
+                android:clickable="true" />
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="16dp"
+                android:textAppearance="@style/TextAppearance.AppCompat.Title"
+                android:text="@string/fab_size_mini" />
+
+        <android.support.design.widget.FloatingActionButton
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_margin="16dp"
+                android:src="@drawable/abc_ic_ab_back_mtrl_am_alpha"
+                android:clickable="true"
+                app:fabSize="mini" />
+
+    </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs.xml b/samples/SupportDesignDemos/res/layout/design_tabs.xml
new file mode 100644
index 0000000..b52d808
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tabs.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:contentInsetStart="72dp"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <android.support.design.widget.TabLayout
+            android:id="@+id/tabs"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:tabContentStart="72dp"/>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml b/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml
new file mode 100644
index 0000000..b249155
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:contentInsetStart="72dp"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <android.support.design.widget.TabLayout
+            android:id="@+id/tabs"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:tabMode="scrollable"
+            app:tabContentStart="72dp"/>
+
+    <android.support.v4.view.ViewPager
+            android:id="@+id/tabs_viewpager"
+            android:layout_height="0px"
+            android:layout_width="match_parent"
+            android:layout_weight="1"/>
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp">
+
+        <Button
+                android:id="@+id/btn_add_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/add_tab"/>
+
+        <Button
+                android:id="@+id/btn_remove_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/remove_tab"/>
+
+    </LinearLayout>
+
+    <RadioGroup
+            android:id="@+id/radiogroup_tab_mode"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="center_horizontal"
+            android:padding="8dp">
+
+        <RadioButton
+                android:id="@+id/rb_tab_fixed"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_fixed"/>
+
+        <RadioButton
+                android:id="@+id/rb_tab_scrollable"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_scrollable"/>
+    </RadioGroup>
+
+    <RadioGroup
+            android:id="@+id/radiogroup_tab_gravity"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="center_horizontal"
+            android:padding="8dp">
+
+        <RadioButton
+                android:id="@+id/rb_tab_g_center"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_gravity_center"/>
+
+        <RadioButton
+                android:id="@+id/rb_tab_g_fill"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_gravity_fill"/>
+
+    </RadioGroup>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/values/strings.xml b/samples/SupportDesignDemos/res/values/strings.xml
new file mode 100644
index 0000000..4b503c2
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values/strings.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <string name="activity_sample_code">Support Design Demos</string>
+
+    <string name="design_fab">Floating Action Button/Basic</string>
+    <string name="design_tabs_basic">TabLayout/Usage</string>
+    <string name="fab_size_normal">Normal size</string>
+    <string name="fab_size_mini">Mini size</string>
+
+    <string name="tabs_fixed">Fixed</string>
+    <string name="tabs_scrollable">Scrollable</string>
+    <string name="tabs_gravity_center">Center</string>
+    <string name="tabs_gravity_fill">Fill</string>
+
+    <string name="add_tab">Add tab</string>
+    <string name="remove_tab">Remove tab</string>
+
+</resources>
diff --git a/samples/SupportDesignDemos/res/values/styles.xml b/samples/SupportDesignDemos/res/values/styles.xml
new file mode 100644
index 0000000..ec05888
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values/styles.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+
+    <style name="Theme.Design" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#607D8B</item>
+        <item name="colorPrimaryDark">#455A64</item>
+        <item name="colorAccent">#FFAB40</item>
+    </style>
+
+
+    <style name="Theme.FAB" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#ff00bcd4</item>
+        <item name="colorPrimaryDark">#00838f</item>
+        <item name="colorAccent">#ff0000</item>
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java b/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java
new file mode 100644
index 0000000..86228a2
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+public class Cheeses {
+
+    public static final String[] sCheeseStrings = {
+            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
+            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
+            "Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
+            "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
+            "Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
+            "Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
+            "Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
+            "Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
+            "Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
+            "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
+            "Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
+            "Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
+            "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
+            "Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
+            "Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
+            "Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
+            "Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
+            "Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
+            "Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
+            "Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
+            "Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
+            "Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
+            "Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
+            "Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",
+            "Capriole Banon", "Carre de l'Est", "Casciotta di Urbino", "Cashel Blue", "Castellano",
+            "Castelleno", "Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
+            "Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou", "Chabichou du Poitou",
+            "Chabis de Gatine", "Chaource", "Charolais", "Chaumes", "Cheddar",
+            "Cheddar Clothbound", "Cheshire", "Chevres", "Chevrotin des Aravis", "Chontaleno",
+            "Civray", "Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby", "Cold Pack",
+            "Comte", "Coolea", "Cooleney", "Coquetdale", "Corleggy", "Cornish Pepper",
+            "Cotherstone", "Cotija", "Cottage Cheese", "Cottage Cheese (Australian)",
+            "Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
+            "Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza",
+            "Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley",
+            "Cuajada", "Curd", "Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
+            "Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo", "Danish Fontina",
+            "Daralagjazsky", "Dauphin", "Delice des Fiouves", "Denhany Dorset Drum", "Derby",
+            "Dessertnyj Belyj", "Devon Blue", "Devon Garland", "Dolcelatte", "Doolin",
+            "Doppelrhamstufel", "Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
+            "Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra", "Dunlop", "Dunsyre Blue",
+            "Duroblando", "Durrus", "Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
+            "Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne", "Esbareich",
+            "Esrom", "Etorki", "Evansdale Farmhouse Brie", "Evora De L'Alentejo", "Exmoor Blue",
+            "Explorateur", "Feta", "Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
+            "Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis", "Flor de Guia",
+            "Flower Marie", "Folded", "Folded cheese with mint", "Fondant de Brebis",
+            "Fontainebleau", "Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
+            "Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire", "Fourme de Montbrison",
+            "Fresh Jack", "Fresh Mozzarella", "Fresh Ricotta", "Fresh Truffles", "Fribourgeois",
+            "Friesekaas", "Friesian", "Friesla", "Frinault", "Fromage a Raclette", "Fromage Corse",
+            "Fromage de Montagne de Savoie", "Fromage Frais", "Fruit Cream Cheese",
+            "Frying Cheese", "Fynbo", "Gabriel", "Galette du Paludier", "Galette Lyonnaise",
+            "Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail", "Garrotxa", "Gastanberra",
+            "Geitost", "Gippsland Blue", "Gjetost", "Gloucester", "Golden Cross", "Gorgonzola",
+            "Gornyaltajski", "Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
+            "Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
+            "Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh", "Greve",
+            "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny", "Halloumi",
+            "Halloumy (Australian)", "Haloumi-Style Cheese", "Harbourne Blue", "Havarti",
+            "Heidi Gruyere", "Hereford Hop", "Herrgardsost", "Herriot Farmhouse", "Herve",
+            "Hipi Iti", "Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
+            "Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu", "Isle of Mull", "Jarlsberg",
+            "Jermi Tortes", "Jibneh Arabieh", "Jindi Brie", "Jubilee Blue", "Juustoleipa",
+            "Kadchgall", "Kaseri", "Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
+            "Kikorangi", "King Island Cape Wickham Brie", "King River Gold", "Klosterkaese",
+            "Knockalara", "Kugelkase", "L'Aveyronnais", "L'Ecir de l'Aubrac", "La Taupiniere",
+            "La Vache Qui Rit", "Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
+            "Langres", "Lappi", "Laruns", "Lavistown", "Le Brin", "Le Fium Orbo", "Le Lacandou",
+            "Le Roule", "Leafield", "Lebbene", "Leerdammer", "Leicester", "Leyden", "Limburger",
+            "Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer", "Little Rydings",
+            "Livarot", "Llanboidy", "Llanglofan Farmhouse", "Loch Arthur Farmhouse",
+            "Loddiswell Avondale", "Longhorn", "Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam",
+            "Macconais", "Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
+            "Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses", "Maredsous", "Margotin",
+            "Maribo", "Maroilles", "Mascares", "Mascarpone", "Mascarpone (Australian)",
+            "Mascarpone Torta", "Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
+            "Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)", "Meyer Vintage Gouda",
+            "Mihalic Peynir", "Milleens", "Mimolette", "Mine-Gabhar", "Mini Baby Bells", "Mixte",
+            "Molbo", "Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
+            "Monterey Jack", "Monterey Jack Dry", "Morbier", "Morbier Cru de Montagne",
+            "Mothais a la Feuille", "Mozzarella", "Mozzarella (Australian)",
+            "Mozzarella di Bufala", "Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
+            "Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais", "Neufchatel",
+            "Neufchatel (Australian)", "Niolo", "Nokkelost", "Northumberland", "Oaxaca",
+            "Olde York", "Olivet au Foin", "Olivet Bleu", "Olivet Cendre",
+            "Orkney Extra Mature Cheddar", "Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty",
+            "Oszczypek", "Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer", "Panela",
+            "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)", "Parmigiano Reggiano",
+            "Pas de l'Escalette", "Passendale", "Pasteurized Processed", "Pate de Fromage",
+            "Patefine Fort", "Pave d'Affinois", "Pave d'Auge", "Pave de Chirac", "Pave du Berry",
+            "Pecorino", "Pecorino in Walnut Leaves", "Pecorino Romano", "Peekskill Pyramid",
+            "Pelardon des Cevennes", "Pelardon des Corbieres", "Penamellera", "Penbryn",
+            "Pencarreg", "Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
+            "Picodon de Chevre", "Picos de Europa", "Piora", "Pithtviers au Foin",
+            "Plateau de Herve", "Plymouth Cheese", "Podhalanski", "Poivre d'Ane", "Polkolbin",
+            "Pont l'Eveque", "Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
+            "Pourly", "Prastost", "Pressato", "Prince-Jean", "Processed Cheddar", "Provolone",
+            "Provolone (Australian)", "Pyengana Cheddar", "Pyramide", "Quark",
+            "Quark (Australian)", "Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
+            "Queso Blanco", "Queso Blanco con Frutas --Pina y Mango", "Queso de Murcia",
+            "Queso del Montsec", "Queso del Tietar", "Queso Fresco", "Queso Fresco (Adobera)",
+            "Queso Iberico", "Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
+            "Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette", "Ragusano", "Raschera",
+            "Reblochon", "Red Leicester", "Regal de la Dombes", "Reggianito", "Remedou",
+            "Requeson", "Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata", "Ridder",
+            "Rigotte", "Rocamadour", "Rollot", "Romano", "Romans Part Dieu", "Roncal", "Roquefort",
+            "Roule", "Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu", "Saaland Pfarr",
+            "Saanenkaese", "Saga", "Sage Derby", "Sainte Maure", "Saint-Marcellin",
+            "Saint-Nectaire", "Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
+            "Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza", "Schabzieger", "Schloss",
+            "Selles sur Cher", "Selva", "Serat", "Seriously Strong Cheddar", "Serra da Estrela",
+            "Sharpam", "Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene", "Smoked Gouda",
+            "Somerset Brie", "Sonoma Jack", "Sottocenare al Tartufo", "Soumaintrain",
+            "Sourire Lozerien", "Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
+            "Stilton", "Stinking Bishop", "String", "Sussex Slipcote", "Sveciaost", "Swaledale",
+            "Sweet Style Swiss", "Swiss", "Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
+            "Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea", "Testouri",
+            "Tete de Moine", "Tetilla", "Texas Goat Cheese", "Tibet", "Tillamook Cheddar",
+            "Tilsit", "Timboon Brie", "Toma", "Tomme Brulee", "Tomme d'Abondance",
+            "Tomme de Chevre", "Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans", "Tommes",
+            "Torta del Casar", "Toscanello", "Touree de L'Aubier", "Tourmalet",
+            "Trappe (Veritable)", "Trois Cornes De Vendee", "Tronchon", "Trou du Cru", "Truffe",
+            "Tupi", "Turunmaa", "Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
+            "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
+            "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
+            "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
+            "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
+            "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
+            "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"
+    };
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java b/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java
new file mode 100644
index 0000000..b4c7343
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+public final class Shakespeare {
+    /**
+     * Our data, part 1.
+     */
+    public static final String[] TITLES = {
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear"
+    };
+
+    /**
+     * Our data, part 2.
+     */
+    public static final String[] DIALOGUE = {
+            "So shaken as we are, so wan with care," +
+            "Find we a time for frighted peace to pant," +
+            "And breathe short-winded accents of new broils" +
+            "To be commenced in strands afar remote." +
+            "No more the thirsty entrance of this soil" +
+            "Shall daub her lips with her own children's blood;" +
+            "Nor more shall trenching war channel her fields," +
+            "Nor bruise her flowerets with the armed hoofs" +
+            "Of hostile paces: those opposed eyes," +
+            "Which, like the meteors of a troubled heaven," +
+            "All of one nature, of one substance bred," +
+            "Did lately meet in the intestine shock" +
+            "And furious close of civil butchery" +
+            "Shall now, in mutual well-beseeming ranks," +
+            "March all one way and be no more opposed" +
+            "Against acquaintance, kindred and allies:" +
+            "The edge of war, like an ill-sheathed knife," +
+            "No more shall cut his master. Therefore, friends," +
+            "As far as to the sepulchre of Christ," +
+            "Whose soldier now, under whose blessed cross" +
+            "We are impressed and engaged to fight," +
+            "Forthwith a power of English shall we levy;" +
+            "Whose arms were moulded in their mothers' womb" +
+            "To chase these pagans in those holy fields" +
+            "Over whose acres walk'd those blessed feet" +
+            "Which fourteen hundred years ago were nail'd" +
+            "For our advantage on the bitter cross." +
+            "But this our purpose now is twelve month old," +
+            "And bootless 'tis to tell you we will go:" +
+            "Therefore we meet not now. Then let me hear" +
+            "Of you, my gentle cousin Westmoreland," +
+            "What yesternight our council did decree" +
+            "In forwarding this dear expedience.",
+
+            "Hear him but reason in divinity," +
+            "And all-admiring with an inward wish" +
+            "You would desire the king were made a prelate:" +
+            "Hear him debate of commonwealth affairs," +
+            "You would say it hath been all in all his study:" +
+            "List his discourse of war, and you shall hear" +
+            "A fearful battle render'd you in music:" +
+            "Turn him to any cause of policy," +
+            "The Gordian knot of it he will unloose," +
+            "Familiar as his garter: that, when he speaks," +
+            "The air, a charter'd libertine, is still," +
+            "And the mute wonder lurketh in men's ears," +
+            "To steal his sweet and honey'd sentences;" +
+            "So that the art and practic part of life" +
+            "Must be the mistress to this theoric:" +
+            "Which is a wonder how his grace should glean it," +
+            "Since his addiction was to courses vain," +
+            "His companies unletter'd, rude and shallow," +
+            "His hours fill'd up with riots, banquets, sports," +
+            "And never noted in him any study," +
+            "Any retirement, any sequestration" +
+            "From open haunts and popularity.",
+
+            "I come no more to make you laugh: things now," +
+            "That bear a weighty and a serious brow," +
+            "Sad, high, and working, full of state and woe," +
+            "Such noble scenes as draw the eye to flow," +
+            "We now present. Those that can pity, here" +
+            "May, if they think it well, let fall a tear;" +
+            "The subject will deserve it. Such as give" +
+            "Their money out of hope they may believe," +
+            "May here find truth too. Those that come to see" +
+            "Only a show or two, and so agree" +
+            "The play may pass, if they be still and willing," +
+            "I'll undertake may see away their shilling" +
+            "Richly in two short hours. Only they" +
+            "That come to hear a merry bawdy play," +
+            "A noise of targets, or to see a fellow" +
+            "In a long motley coat guarded with yellow," +
+            "Will be deceived; for, gentle hearers, know," +
+            "To rank our chosen truth with such a show" +
+            "As fool and fight is, beside forfeiting" +
+            "Our own brains, and the opinion that we bring," +
+            "To make that only true we now intend," +
+            "Will leave us never an understanding friend." +
+            "Therefore, for goodness' sake, and as you are known" +
+            "The first and happiest hearers of the town," +
+            "Be sad, as we would make ye: think ye see" +
+            "The very persons of our noble story" +
+            "As they were living; think you see them great," +
+            "And follow'd with the general throng and sweat" +
+            "Of thousand friends; then in a moment, see" +
+            "How soon this mightiness meets misery:" +
+            "And, if you can be merry then, I'll say" +
+            "A man may weep upon his wedding-day.",
+
+            "First, heaven be the record to my speech!" +
+            "In the devotion of a subject's love," +
+            "Tendering the precious safety of my prince," +
+            "And free from other misbegotten hate," +
+            "Come I appellant to this princely presence." +
+            "Now, Thomas Mowbray, do I turn to thee," +
+            "And mark my greeting well; for what I speak" +
+            "My body shall make good upon this earth," +
+            "Or my divine soul answer it in heaven." +
+            "Thou art a traitor and a miscreant," +
+            "Too good to be so and too bad to live," +
+            "Since the more fair and crystal is the sky," +
+            "The uglier seem the clouds that in it fly." +
+            "Once more, the more to aggravate the note," +
+            "With a foul traitor's name stuff I thy throat;" +
+            "And wish, so please my sovereign, ere I move," +
+            "What my tongue speaks my right drawn sword may prove.",
+
+            "Now is the winter of our discontent" +
+            "Made glorious summer by this sun of York;" +
+            "And all the clouds that lour'd upon our house" +
+            "In the deep bosom of the ocean buried." +
+            "Now are our brows bound with victorious wreaths;" +
+            "Our bruised arms hung up for monuments;" +
+            "Our stern alarums changed to merry meetings," +
+            "Our dreadful marches to delightful measures." +
+            "Grim-visaged war hath smooth'd his wrinkled front;" +
+            "And now, instead of mounting barded steeds" +
+            "To fright the souls of fearful adversaries," +
+            "He capers nimbly in a lady's chamber" +
+            "To the lascivious pleasing of a lute." +
+            "But I, that am not shaped for sportive tricks," +
+            "Nor made to court an amorous looking-glass;" +
+            "I, that am rudely stamp'd, and want love's majesty" +
+            "To strut before a wanton ambling nymph;" +
+            "I, that am curtail'd of this fair proportion," +
+            "Cheated of feature by dissembling nature," +
+            "Deformed, unfinish'd, sent before my time" +
+            "Into this breathing world, scarce half made up," +
+            "And that so lamely and unfashionable" +
+            "That dogs bark at me as I halt by them;" +
+            "Why, I, in this weak piping time of peace," +
+            "Have no delight to pass away the time," +
+            "Unless to spy my shadow in the sun" +
+            "And descant on mine own deformity:" +
+            "And therefore, since I cannot prove a lover," +
+            "To entertain these fair well-spoken days," +
+            "I am determined to prove a villain" +
+            "And hate the idle pleasures of these days." +
+            "Plots have I laid, inductions dangerous," +
+            "By drunken prophecies, libels and dreams," +
+            "To set my brother Clarence and the king" +
+            "In deadly hate the one against the other:" +
+            "And if King Edward be as true and just" +
+            "As I am subtle, false and treacherous," +
+            "This day should Clarence closely be mew'd up," +
+            "About a prophecy, which says that 'G'" +
+            "Of Edward's heirs the murderer shall be." +
+            "Dive, thoughts, down to my soul: here" +
+            "Clarence comes.",
+
+            "To bait fish withal: if it will feed nothing else," +
+            "it will feed my revenge. He hath disgraced me, and" +
+            "hindered me half a million; laughed at my losses," +
+            "mocked at my gains, scorned my nation, thwarted my" +
+            "bargains, cooled my friends, heated mine" +
+            "enemies; and what's his reason? I am a Jew. Hath" +
+            "not a Jew eyes? hath not a Jew hands, organs," +
+            "dimensions, senses, affections, passions? fed with" +
+            "the same food, hurt with the same weapons, subject" +
+            "to the same diseases, healed by the same means," +
+            "warmed and cooled by the same winter and summer, as" +
+            "a Christian is? If you prick us, do we not bleed?" +
+            "if you tickle us, do we not laugh? if you poison" +
+            "us, do we not die? and if you wrong us, shall we not" +
+            "revenge? If we are like you in the rest, we will" +
+            "resemble you in that. If a Jew wrong a Christian," +
+            "what is his humility? Revenge. If a Christian" +
+            "wrong a Jew, what should his sufferance be by" +
+            "Christian example? Why, revenge. The villany you" +
+            "teach me, I will execute, and it shall go hard but I" +
+            "will better the instruction.",
+
+            "Virtue! a fig! 'tis in ourselves that we are thus" +
+            "or thus. Our bodies are our gardens, to the which" +
+            "our wills are gardeners: so that if we will plant" +
+            "nettles, or sow lettuce, set hyssop and weed up" +
+            "thyme, supply it with one gender of herbs, or" +
+            "distract it with many, either to have it sterile" +
+            "with idleness, or manured with industry, why, the" +
+            "power and corrigible authority of this lies in our" +
+            "wills. If the balance of our lives had not one" +
+            "scale of reason to poise another of sensuality, the" +
+            "blood and baseness of our natures would conduct us" +
+            "to most preposterous conclusions: but we have" +
+            "reason to cool our raging motions, our carnal" +
+            "stings, our unbitted lusts, whereof I take this that" +
+            "you call love to be a sect or scion.",
+
+            "Blow, winds, and crack your cheeks! rage! blow!" +
+            "You cataracts and hurricanoes, spout" +
+            "Till you have drench'd our steeples, drown'd the cocks!" +
+            "You sulphurous and thought-executing fires," +
+            "Vaunt-couriers to oak-cleaving thunderbolts," +
+            "Singe my white head! And thou, all-shaking thunder," +
+            "Smite flat the thick rotundity o' the world!" +
+            "Crack nature's moulds, an germens spill at once," +
+            "That make ingrateful man!"
+    };
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java b/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java
new file mode 100644
index 0000000..9c8a51b
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SupportDesignDemos extends ListActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Intent intent = getIntent();
+        String path = intent.getStringExtra("com.example.android.apis.Path");
+
+        if (path == null) {
+            path = "";
+        }
+
+        setListAdapter(new SimpleAdapter(this, getData(path),
+                android.R.layout.simple_list_item_1, new String[] { "title" },
+                new int[] { android.R.id.text1 }));
+        getListView().setTextFilterEnabled(true);
+    }
+
+    protected List<Map<String, Object>> getData(String prefix) {
+        List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();
+
+        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+        mainIntent.addCategory("com.example.android.support.design.SAMPLE_CODE");
+
+        PackageManager pm = getPackageManager();
+        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
+
+        if (null == list)
+            return myData;
+
+        String[] prefixPath;
+        String prefixWithSlash = prefix;
+
+        if (prefix.equals("")) {
+            prefixPath = null;
+        } else {
+            prefixPath = prefix.split("/");
+            prefixWithSlash = prefix + "/";
+        }
+
+        int len = list.size();
+
+        Map<String, Boolean> entries = new HashMap<String, Boolean>();
+
+        for (int i = 0; i < len; i++) {
+            ResolveInfo info = list.get(i);
+            CharSequence labelSeq = info.loadLabel(pm);
+            String label = labelSeq != null
+                    ? labelSeq.toString()
+                    : info.activityInfo.name;
+
+            if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) {
+
+                String[] labelPath = label.split("/");
+
+                String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length];
+
+                if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {
+                    addItem(myData, nextLabel, activityIntent(
+                            info.activityInfo.applicationInfo.packageName,
+                            info.activityInfo.name));
+                } else {
+                    if (entries.get(nextLabel) == null) {
+                        addItem(myData, nextLabel, browseIntent(
+                                prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));
+                        entries.put(nextLabel, true);
+                    }
+                }
+            }
+        }
+
+        Collections.sort(myData, sDisplayNameComparator);
+
+        return myData;
+    }
+
+    private final static Comparator<Map<String, Object>> sDisplayNameComparator =
+        new Comparator<Map<String, Object>>() {
+        private final Collator   collator = Collator.getInstance();
+
+        @Override
+        public int compare(Map<String, Object> map1, Map<String, Object> map2) {
+            return collator.compare(map1.get("title"), map2.get("title"));
+        }
+    };
+
+    protected Intent activityIntent(String pkg, String componentName) {
+        Intent result = new Intent();
+        result.setClassName(pkg, componentName);
+        return result;
+    }
+
+    protected Intent browseIntent(String path) {
+        Intent result = new Intent();
+        result.setClass(this, SupportDesignDemos.class);
+        result.putExtra("com.example.android.apis.Path", path);
+        return result;
+    }
+
+    protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {
+        Map<String, Object> temp = new HashMap<String, Object>();
+        temp.put("title", name);
+        temp.put("intent", intent);
+        data.add(temp);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    protected void onListItemClick(ListView l, View v, int position, long id) {
+        Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);
+
+        Intent intent = (Intent) map.get("intent");
+        startActivity(intent);
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
new file mode 100644
index 0000000..9193037
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+
+/**
+ * This demonstrates idiomatic usage of the Floating Action Button
+ */
+public class FloatingActionButtonUsage extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_fab);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
new file mode 100644
index 0000000..910322e
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This demonstrates idiomatic usage of TabLayout with a ViewPager
+ */
+public class TabLayoutUsage extends AppCompatActivity {
+
+    private TabLayout mTabLayout;
+    private ViewPager mViewPager;
+    private CheesePagerAdapter mPagerAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_tabs_viewpager);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        mTabLayout = (TabLayout) findViewById(R.id.tabs);
+
+        mViewPager = (ViewPager) findViewById(R.id.tabs_viewpager);
+        mPagerAdapter = new CheesePagerAdapter();
+        mViewPager.setAdapter(mPagerAdapter);
+        mViewPager.setOnPageChangeListener(mTabLayout.createOnPageChangeListener());
+        mTabLayout.setOnTabSelectedListener(mTabListener);
+
+        setupButtons();
+        setupRadioGroup();
+    }
+
+    private void setupButtons() {
+        findViewById(R.id.btn_add_tab).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                addRandomTab();
+            }
+        });
+
+        findViewById(R.id.btn_remove_tab).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (mTabLayout.getTabCount() >= 1) {
+                    mTabLayout.removeTabAt(mTabLayout.getTabCount() - 1);
+                    mPagerAdapter.removeTab();
+                }
+            }
+        });
+    }
+
+    private void addRandomTab() {
+        Random r = new Random();
+        String cheese = Cheeses.sCheeseStrings[r.nextInt(Cheeses.sCheeseStrings.length)];
+        mTabLayout.addTab(mTabLayout.newTab().setText(cheese));
+        mPagerAdapter.addTab(cheese);
+    }
+
+    private void setupRadioGroup() {
+        // Setup the initially checked item
+        switch (mTabLayout.getTabMode()) {
+            case TabLayout.MODE_SCROLLABLE:
+                ((RadioButton) findViewById(R.id.rb_tab_scrollable)).setChecked(true);
+                break;
+            case TabLayout.MODE_FIXED:
+                ((RadioButton) findViewById(R.id.rb_tab_fixed)).setChecked(true);
+                break;
+        }
+
+        RadioGroup rg = (RadioGroup) findViewById(R.id.radiogroup_tab_mode);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_fixed:
+                        mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                        break;
+                    case R.id.rb_tab_scrollable:
+                        mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                        break;
+                }
+            }
+        });
+
+        // Setup the initially checked item
+        switch (mTabLayout.getTabGravity()) {
+            case TabLayout.GRAVITY_CENTER:
+                ((RadioButton) findViewById(R.id.rb_tab_g_center)).setChecked(true);
+                break;
+            case TabLayout.GRAVITY_FILL:
+                ((RadioButton) findViewById(R.id.rb_tab_g_fill)).setChecked(true);
+                break;
+        }
+
+        rg = (RadioGroup) findViewById(R.id.radiogroup_tab_gravity);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_g_center:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
+                        break;
+                    case R.id.rb_tab_g_fill:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
+                        break;
+                }
+            }
+        });
+    }
+
+    private final TabLayout.OnTabSelectedListener
+            mTabListener = new TabLayout.OnTabSelectedListener() {
+        @Override
+        public void onTabSelected(TabLayout.Tab tab) {
+            mViewPager.setCurrentItem(tab.getPosition());
+        }
+
+        @Override
+        public void onTabUnselected(TabLayout.Tab tab) {
+            // no-op
+        }
+
+        @Override
+        public void onTabReselected(TabLayout.Tab tab) {
+            // no-op
+        }
+    };
+
+    private static class CheesePagerAdapter extends PagerAdapter {
+
+        private final ArrayList<CharSequence> mCheeses = new ArrayList<>();
+
+        public void addTab(String title) {
+            mCheeses.add(title);
+            notifyDataSetChanged();
+        }
+
+        public void removeTab() {
+            if (!mCheeses.isEmpty()) {
+                mCheeses.remove(mCheeses.size() - 1);
+                notifyDataSetChanged();
+            }
+        }
+
+        @Override
+        public int getCount() {
+            return mCheeses.size();
+        }
+
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            TextView tv = new TextView(container.getContext());
+            tv.setText(getPageTitle(position));
+            tv.setGravity(Gravity.CENTER);
+            tv.setTextAppearance(tv.getContext(), R.style.TextAppearance_AppCompat_Title);
+
+            container.addView(tv, ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT);
+
+            return tv;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            return view == object;
+        }
+
+        @Override
+         public CharSequence getPageTitle(int position) {
+            return mCheeses.get(position);
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            container.removeView((View) object);
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml
index 391bcb7..e429423 100644
--- a/samples/SupportLeanbackDemos/AndroidManifest.xml
+++ b/samples/SupportLeanbackDemos/AndroidManifest.xml
@@ -14,14 +14,17 @@
         android:theme="@style/Theme.Example.Leanback">
 
         <activity android:name="MainActivity"
-            android:label="@string/app_name"
-            android:theme="@style/Theme.Example.Leanback.Browse">
+            android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
             </intent-filter>
         </activity>
 
+        <activity android:name="BrowseActivity"
+            android:theme="@style/Theme.Example.Leanback.Browse"
+            android:exported="true" />
+
         <activity android:name="BrowseAnimationActivity"
             android:exported="true" >
         </activity>
@@ -44,9 +47,14 @@
             android:exported="true" />
 
         <activity android:name="BrowseErrorActivity"
-                  android:exported="true" />
+            android:exported="true" />
 
         <activity android:name="HorizontalGridTestActivity"
             android:exported="true" />
+
+        <activity android:name="GuidedStepActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep"
+            android:exported="true" />
+
     </application>
 </manifest>
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png
new file mode 100644
index 0000000..6f0c962
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png
new file mode 100644
index 0000000..e9effc8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png
new file mode 100644
index 0000000..2e56516
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png
new file mode 100644
index 0000000..b1afd78
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png
new file mode 100644
index 0000000..3349108
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png
new file mode 100644
index 0000000..d92c927
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/layout/main.xml b/samples/SupportLeanbackDemos/res/layout/browse.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/main.xml
rename to samples/SupportLeanbackDemos/res/layout/browse.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml b/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml
new file mode 100644
index 0000000..09aaef1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        style="?attr/guidanceContainerStyle" >
+
+        <ImageView
+            android:id="@+id/guidance_icon"
+            style="@style/Widget.Example.Leanback.SecondStepGuidanceIconStyle"
+            android:layout_width="188dp"
+            tools:ignore="ContentDescription" />
+
+        <TextView
+            android:id="@+id/guidance_title"
+            style="?attr/guidanceTitleStyle" />
+
+        <TextView
+            android:id="@+id/guidance_breadcrumb"
+            style="?attr/guidanceBreadcrumbStyle" />
+
+        <TextView
+            android:id="@+id/guidance_description"
+            style="?attr/guidanceDescriptionStyle" />
+
+    </RelativeLayout>
+
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/rows.xml b/samples/SupportLeanbackDemos/res/layout/rows.xml
index d77f7ca..664e41b 100644
--- a/samples/SupportLeanbackDemos/res/layout/rows.xml
+++ b/samples/SupportLeanbackDemos/res/layout/rows.xml
@@ -15,22 +15,12 @@
      limitations under the License.
 -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<android.support.v17.leanback.widget.BrowseFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/rows_frame"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-  <TextView
-      android:id="@+id/rows_title"
-      android:text="RowsFragment"
-      style="?attr/browseTitleTextStyle"
-      android:paddingStart="?attr/browsePaddingStart"
-      android:paddingEnd="?attr/browsePaddingEnd"
-      android:paddingTop="?attr/browsePaddingTop"
-      android:paddingBottom="10dp"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content" />
   <fragment
       android:name="com.example.android.leanback.RowsFragment"
       android:id="@+id/main_rows_fragment"
@@ -38,4 +28,9 @@
       android:layout_height="match_parent"
   />
 
-</FrameLayout>
+    <android.support.v17.leanback.widget.TitleView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+</android.support.v17.leanback.widget.BrowseFrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/values/colors.xml b/samples/SupportLeanbackDemos/res/values/colors.xml
new file mode 100644
index 0000000..705ce01
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <color name="icon_background">#4A4F51</color>
+    <color name="icon_alt_background">#2A2F51</color>
+</resources>
diff --git a/samples/SupportLeanbackDemos/res/values/strings.xml b/samples/SupportLeanbackDemos/res/values/strings.xml
index e884043..09e43a6 100644
--- a/samples/SupportLeanbackDemos/res/values/strings.xml
+++ b/samples/SupportLeanbackDemos/res/values/strings.xml
@@ -17,4 +17,33 @@
 
 <resources>
     <string name="app_name">MainActivity</string>
+    <string name="main_breadcrumb">Demo</string>
+    <string name="main_title">Activities</string>
+    <string name="browse">Browse</string>
+    <string name="browse_description">BrowseFragment test</string>
+    <string name="search">Search</string>
+    <string name="search_description">SearchFragment test</string>
+    <string name="details">Details</string>
+    <string name="details_description">DetailsFragment test</string>
+    <string name="playback">Playback</string>
+    <string name="playback_description">PlaybackOverlay test</string>
+    <string name="hgrid">Horizontal Grid</string>
+    <string name="hgrid_description">HorizontalGridView test</string>
+    <string name="vgrid">Vertical Grid</string>
+    <string name="vgrid_description">VerticalGridView test</string>
+    <string name="guidedstep">Guided Step</string>
+    <string name="guidedstep_description">GuidedStepFragment test</string>
+    <string name="browseerror">Browse Error</string>
+    <string name="browseerror_description">BrowseError test</string>
+
+    <!-- Strings related to guided sequence activity -->
+    <string name="guidedstep_first_title">First</string>
+    <string name="guidedstep_first_description">First step of guided sequence</string>
+    <string name="guidedstep_first_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_second_title">Second</string>
+    <string name="guidedstep_second_description">Showcasing different action configurations</string>
+    <string name="guidedstep_second_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_third_title">Third</string>
+    <string name="guidedstep_third_description">Third step of guided sequence</string>
+    <string name="guidedstep_third_breadcrumb">Guided Steps</string>
 </resources>
diff --git a/samples/SupportLeanbackDemos/res/values/styles.xml b/samples/SupportLeanbackDemos/res/values/styles.xml
index 17ea0ef..dd86e7e 100644
--- a/samples/SupportLeanbackDemos/res/values/styles.xml
+++ b/samples/SupportLeanbackDemos/res/values/styles.xml
@@ -20,4 +20,13 @@
     <style name="Widget.Example.Leanback.Rows.VerticalGridView" parent="Widget.Leanback.Rows.VerticalGridView">
         <item name="android:paddingTop">96dp</item>
     </style>
+    <style name="Widget.Example.Leanback.GuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:background">@color/icon_background</item>
+    </style>
+    <style name="Widget.Example.Leanback.FirstStepGuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:background">@color/icon_alt_background</item>
+    </style>
+    <style name="Widget.Example.Leanback.SecondStepGuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:padding">24dp</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/values/themes.xml b/samples/SupportLeanbackDemos/res/values/themes.xml
index 22a41f0..5d7c232 100644
--- a/samples/SupportLeanbackDemos/res/values/themes.xml
+++ b/samples/SupportLeanbackDemos/res/values/themes.xml
@@ -25,4 +25,10 @@
         <item name="browseTitleTextStyle">@style/Widget.Example.Leanback.Title.Text</item>
         <item name="rowsVerticalGridStyle">@style/Widget.Example.Leanback.Rows.VerticalGridView</item>
     </style>
+    <style name="Theme.Example.Leanback.GuidedStep" parent="Theme.Leanback.GuidedStep">
+        <item name="guidanceIconStyle">@style/Widget.Example.Leanback.GuidanceIconStyle</item>
+    </style>
+    <style name="Theme.Example.Leanback.GuidedStep.First">
+        <item name="guidanceIconStyle">@style/Widget.Example.Leanback.FirstStepGuidanceIconStyle</item>
+    </style>
 </resources>
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
new file mode 100644
index 0000000..d44494c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+
+public class BackgroundHelper {
+
+    private static final String TAG = "BackgroundHelper";
+    private static final boolean DEBUG = false;
+    private static final boolean ENABLED = true;
+
+    // Background delay serves to avoid kicking off expensive bitmap loading
+    // in case multiple backgrounds are set in quick succession.
+    private static final int SET_BACKGROUND_DELAY_MS = 100;
+
+    static class Request {
+        Object mImageToken;
+        Activity mActivity;
+        Bitmap mResult;
+
+        Request(Activity activity, Object imageToken) {
+            mActivity = activity;
+            mImageToken = imageToken;
+        }
+    }
+
+    public BackgroundHelper() {
+        if (DEBUG && !ENABLED) Log.v(TAG, "BackgroundHelper: disabled");
+    }
+
+    class LoadBackgroundRunnable implements Runnable {
+        Request mRequest;
+
+        LoadBackgroundRunnable(Activity activity, Object imageToken) {
+            mRequest = new Request(activity, imageToken);
+        }
+
+        @Override
+        public void run() {
+            if (mTask != null) {
+                if (DEBUG) Log.v(TAG, "Cancelling task");
+                mTask.cancel(true);
+            }
+            if (DEBUG) Log.v(TAG, "Executing task");
+            mTask = new LoadBitmapTask();
+            mTask.execute(mRequest);
+            mRunnable = null;
+        }
+    };
+
+    class LoadBitmapTask extends AsyncTask<Request, Object, Request> {
+        @Override
+        protected Request doInBackground(Request... params) {
+            boolean cancelled = isCancelled();
+            if (DEBUG) Log.v(TAG, "doInBackground cancelled " + cancelled);
+            Request request = params[0];
+            if (!cancelled) {
+                request.mResult = loadBitmap(request.mActivity, request.mImageToken);
+            }
+            return request;
+        }
+
+        @Override
+        protected void onPostExecute(Request request) {
+            if (DEBUG) Log.v(TAG, "onPostExecute");
+            applyBackground(request.mActivity, request.mResult);
+            if (mTask == this) {
+                mTask = null;
+            }
+        }
+
+        @Override
+        protected void onCancelled(Request request) {
+            if (DEBUG) Log.v(TAG, "onCancelled");
+        }
+
+        private Bitmap loadBitmap(Activity activity, Object imageToken) {
+            if (imageToken instanceof Integer) {
+                final int resourceId = (Integer) imageToken;
+                Drawable drawable = ContextCompat.getDrawable(activity, resourceId);
+                if (drawable instanceof BitmapDrawable) {
+                    return ((BitmapDrawable) drawable).getBitmap();
+                }
+            }
+            return null;
+        }
+
+        private void applyBackground(Activity activity, Bitmap bitmap) {
+            BackgroundManager backgroundManager = BackgroundManager.getInstance(activity);
+            if (bitmap == null || backgroundManager == null || !backgroundManager.isAttached()) {
+                return;
+            }
+            backgroundManager.setBitmap(bitmap);
+        }
+    }
+
+    private LoadBackgroundRunnable mRunnable;
+    private LoadBitmapTask mTask;
+
+    public void attach(Activity activity) {
+        if (!ENABLED) {
+            return;
+        }
+        BackgroundManager.getInstance(activity).attach(activity.getWindow());
+    }
+
+    public void setBackground(Activity activity, Object imageToken) {
+        if (!ENABLED) {
+            return;
+        }
+        Handler handler = activity.getWindow().getDecorView().getHandler();
+        if (mRunnable != null) {
+            handler.removeCallbacks(mRunnable);
+        }
+        mRunnable = new LoadBackgroundRunnable(activity, imageToken);
+        handler.postDelayed(mRunnable, SET_BACKGROUND_DELAY_MS);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java
new file mode 100644
index 0000000..fdd81c6
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class BrowseActivity extends Activity {
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
index 3883081..6892c2c 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
@@ -19,8 +19,10 @@
 import android.support.v17.leanback.widget.HeaderItem;
 import android.support.v17.leanback.widget.ListRow;
 import android.support.v17.leanback.widget.ListRowPresenter;
-import android.support.v17.leanback.widget.OnItemClickedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
 import android.util.Log;
 import android.view.View;
 import android.os.Handler;
@@ -37,9 +39,9 @@
 
     static class Item {
         final String mText;
-        final OnItemClickedListener mAction;
+        final OnItemViewClickedListener mAction;
 
-        Item(String text, OnItemClickedListener action) {
+        Item(String text, OnItemViewClickedListener action) {
             mText = text;
             mAction = action;
         }
@@ -69,7 +71,7 @@
         });
 
         setupRows();
-        setOnItemClickedListener(new ItemClickedListener());
+        setOnItemViewClickedListener(new ItemViewClickedListener());
     }
 
     private void setupRows() {
@@ -86,9 +88,10 @@
         switch (sRand.nextInt(15)) {
         default:
         case 0:
-            return new Item("Remove Item before", new OnItemClickedListener() {
+            return new Item("Remove Item before", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -100,9 +103,10 @@
                 }
             });
         case 1:
-            return new Item("Remove Item after", new OnItemClickedListener() {
+            return new Item("Remove Item after", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -114,9 +118,10 @@
                 }
             });
         case 2:
-            return new Item("Remove Item", new OnItemClickedListener() {
+            return new Item("Remove Item", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -126,18 +131,20 @@
                 }
             });
         case 3:
-            return new Item("Remove all Items", new OnItemClickedListener() {
+            return new Item("Remove all Items", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     adapter.clear();
                 }
             });
         case 4:
-            return new Item("add item before", new OnItemClickedListener() {
+            return new Item("add item before", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -147,9 +154,10 @@
                 }
             });
         case 5:
-            return new Item("add item after", new OnItemClickedListener() {
+            return new Item("add item after", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -160,9 +168,10 @@
             });
         case 6:
             return new Item("add random items before",
-                    new OnItemClickedListener() {
+                    new OnItemViewClickedListener() {
                             @Override
-                        public void onItemClicked(Object item, Row row) {
+                        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                RowPresenter.ViewHolder rowViewHolder, Row row) {
                             ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                                     .getAdapter());
                             int index = adapter.indexOf(item);
@@ -176,9 +185,10 @@
                     });
         case 7:
             return new Item("add random items after",
-                    new OnItemClickedListener() {
+                    new OnItemViewClickedListener() {
                             @Override
-                        public void onItemClicked(Object item, Row row) {
+                        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                RowPresenter.ViewHolder rowViewHolder, Row row) {
                             ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                                     .getAdapter());
                             int index = adapter.indexOf(item);
@@ -192,9 +202,10 @@
                         }
                     });
         case 8:
-            return new Item("add row before", new OnItemClickedListener() {
+            return new Item("add row before", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     int index = mRowsAdapter.indexOf(row);
                     if (index >= 0) {
                         int headerId = sRand.nextInt();
@@ -204,9 +215,10 @@
                 }
             });
         case 9:
-            return new Item("add row after", new OnItemClickedListener() {
+            return new Item("add row after", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     int index = mRowsAdapter.indexOf(row);
                     if (index >= 0) {
                         int headerId = sRand.nextInt();
@@ -217,16 +229,18 @@
                 }
             });
         case 10:
-            return new Item("delete row", new OnItemClickedListener() {
+            return new Item("delete row", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     mRowsAdapter.remove(row);
                 }
             });
         case 11:
-            return new Item("delete row before", new OnItemClickedListener() {
+            return new Item("delete row before", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     int index = mRowsAdapter.indexOf(row);
                     if (index > 0) {
                         mRowsAdapter.removeItems(index - 1, 1);
@@ -234,9 +248,10 @@
                 }
             });
         case 12:
-            return new Item("delete row after", new OnItemClickedListener() {
+            return new Item("delete row after", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     int index = mRowsAdapter.indexOf(row);
                     if (index < mRowsAdapter.size() - 1) {
                         mRowsAdapter.removeItems(index + 1, 1);
@@ -244,9 +259,10 @@
                 }
             });
         case 13:
-            return new Item("Replace Item before", new OnItemClickedListener() {
+            return new Item("Replace Item before", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                     int index = adapter.indexOf(item);
@@ -258,9 +274,10 @@
                 }
             });
         case 14:
-            return new Item("Remove all then re-add", new OnItemClickedListener() {
+            return new Item("Remove all then re-add", new OnItemViewClickedListener() {
                     @Override
-                public void onItemClicked(Object item, Row row) {
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
                     final ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
                             .getAdapter());
                    adapter.clear();
@@ -284,10 +301,11 @@
         return new ListRow(header, listRowAdapter);
     }
 
-    private final class ItemClickedListener implements OnItemClickedListener {
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
         @Override
-        public void onItemClicked(Object item, Row row) {
-            ((Item) item).mAction.onItemClicked(item, row);
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            ((Item) item).mAction.onItemClicked(itemViewHolder, item, rowViewHolder, row);
         }
     }
 }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
index f2f6192..0223101 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
@@ -34,7 +34,7 @@
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
+        setContentView(R.layout.browse);
 
         testError();
     }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
index 91fec5f..aea6109 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -36,7 +36,11 @@
 
     private static final boolean TEST_ENTRANCE_TRANSITION = true;
     private static final int NUM_ROWS = 10;
+    // Row heights default to wrap content
+    private static final boolean USE_FIXED_ROW_HEIGHT = false;
+
     private ArrayObjectAdapter mRowsAdapter;
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -62,6 +66,11 @@
             public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
                     RowPresenter.ViewHolder rowViewHolder, Row row) {
                 Log.i(TAG, "onItemSelected: " + item + " row " + row);
+
+                if (item instanceof PhotoItem) {
+                    mBackgroundHelper.setBackground(
+                            getActivity(), ((PhotoItem) item).getImageResourceId());
+                }
             }
         });
         if (TEST_ENTRANCE_TRANSITION) {
@@ -76,12 +85,17 @@
                 }
             }, 2000);
         }
+
+        mBackgroundHelper.attach(getActivity());
     }
 
     private void setupRows() {
         ListRowPresenter lrp = new ListRowPresenter();
-        lrp.setRowHeight(CardPresenter.getRowHeight(getActivity()));
-        lrp.setExpandedRowHeight(CardPresenter.getExpandedRowHeight(getActivity()));
+
+        if (USE_FIXED_ROW_HEIGHT) {
+            lrp.setRowHeight(CardPresenter.getRowHeight(getActivity()));
+            lrp.setExpandedRowHeight(CardPresenter.getExpandedRowHeight(getActivity()));
+        }
 
         mRowsAdapter = new ArrayObjectAdapter(lrp);
 
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
index bc88e21..98f2188 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
@@ -33,7 +33,9 @@
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.Row;
 import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
 import android.util.Log;
+import android.view.View;
 import android.widget.Toast;
 
 public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
@@ -44,10 +46,11 @@
     private ArrayObjectAdapter mRowsAdapter;
     private PhotoItem mPhotoItem;
     final CardPresenter cardPresenter = new CardPresenter();
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
 
-    private static final int ACTION_BUY = 1;
+    private static final int ACTION_PLAY = 1;
     private static final int ACTION_RENT = 2;
-    private static final int ACTION_PLAY = 3;
+    private static final int ACTION_BUY = 3;
 
     private static final boolean TEST_SHARED_ELEMENT_TRANSITION = true;
     private static final boolean TEST_ENTRANCE_TRANSITION = true;
@@ -55,11 +58,30 @@
     private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
     private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
 
+    private Action mActionPlay;
+    private Action mActionRent;
+    private Action mActionBuy;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         Log.i(TAG, "onCreate");
         super.onCreate(savedInstanceState);
 
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        mActionPlay = new Action(ACTION_PLAY, "Play");
+        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99",
+                getResources().getDrawable(R.drawable.ic_action_a));
+        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
+
         ClassPresenterSelector ps = new ClassPresenterSelector();
         DetailsOverviewRowPresenter dorPresenter =
                 new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
@@ -67,17 +89,23 @@
             @Override
             public void onActionClicked(Action action) {
                 Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);
                 if (action.getId() == ACTION_BUY) {
-                    DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle() + "(Owned)");
-                    dor.setImageDrawable(getResources().getDrawable(mPhotoItem.getImageResourceId()));
-                    dor.addAction(new Action(ACTION_PLAY, "Play"));
-                    mRowsAdapter.replace(0, dor);
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    actions.clear(ACTION_BUY);
+                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
+                    dor.setImageDrawable(getResources().getDrawable(R.drawable.details_img_16x9));
                 } else if (action.getId() == ACTION_RENT) {
-                    DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle() + "(Rented)");
-                    dor.setImageDrawable(getResources().getDrawable(mPhotoItem.getImageResourceId()));
-                    dor.addAction(new Action(ACTION_PLAY, "Play"));
-                    dor.addAction(new Action(ACTION_BUY, "Buy $9.99"));
-                    mRowsAdapter.replace(0, dor);
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
                 } else if (action.getId() == ACTION_PLAY) {
                     Intent intent = new Intent(getActivity(), PlaybackOverlayActivity.class);
                     getActivity().startActivity(intent);
@@ -131,6 +159,8 @@
                 prepareEntranceTransition();
             }
         }
+
+        mBackgroundHelper.attach(getActivity());
     }
 
     @Override
@@ -148,8 +178,10 @@
                 Resources res = getActivity().getResources();
                 DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
                 dor.setImageDrawable(res.getDrawable(mPhotoItem.getImageResourceId()));
-                dor.addAction(new Action(ACTION_BUY, "Buy $9.99"));
-                dor.addAction(new Action(ACTION_RENT, "Rent", "$3.99", res.getDrawable(R.drawable.ic_action_a)));
+                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
+                adapter.set(ACTION_RENT, mActionRent);
+                adapter.set(ACTION_BUY, mActionBuy);
+                dor.setActionsAdapter(adapter);
                 mRowsAdapter.add(0, dor);
                 setSelectedPosition(0, false);
             }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
index f944ffa..7a88c91 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
@@ -20,7 +20,6 @@
 import android.support.v17.leanback.widget.HeaderItem;
 import android.support.v17.leanback.widget.ListRow;
 import android.support.v17.leanback.widget.ListRowPresenter;
-import android.support.v17.leanback.widget.OnItemClickedListener;
 import android.support.v17.leanback.widget.Row;
 import android.support.v17.leanback.widget.SearchOrbView;
 import android.util.Log;
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
new file mode 100644
index 0000000..3a3d712
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Activity that showcases different aspects of GuidedStepFragments.
+ */
+public class GuidedStepActivity extends Activity {
+
+    private static final int CONTINUE = 0;
+    private static final int BACK = 1;
+
+    private static final int OPTION_CHECK_SET_ID = 10;
+    private static final int DEFAULT_OPTION = 0;
+    private static final String[] OPTION_NAMES = { "Option A", "Option B", "Option C" };
+    private static final String[] OPTION_DESCRIPTIONS = { "Here's one thing you can do",
+            "Here's another thing you can do", "Here's one more thing you can do" };
+    private static final int[] OPTION_DRAWABLES = { R.drawable.ic_guidedstep_option_a,
+            R.drawable.ic_guidedstep_option_b, R.drawable.ic_guidedstep_option_c };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        GuidedStepFragment.add(getFragmentManager(), new FirstStepFragment());
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .build());
+    }
+
+    private static void addCheckedAction(List<GuidedAction> actions, int iconResId, Context context,
+            String title, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .title(title)
+                .description(desc)
+                .checkSetId(OPTION_CHECK_SET_ID)
+                .iconResourceId(iconResId, context)
+                .build());
+    }
+
+    /**
+     * The first fragment is instantiated via XML, so it must be public.
+     */
+    public static class FirstStepFragment extends GuidedStepFragment {
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_First;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_first_title);
+            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
+            String description = getString(R.string.guidedstep_first_description);
+            Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addAction(actions, CONTINUE, "Continue", "Let's do it");
+            addAction(actions, BACK, "Cancel", "Nevermind");
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            if (action.getId() == CONTINUE) {
+                GuidedStepFragment.add(fm, new SecondStepFragment());
+            } else {
+                getActivity().finish();
+            }
+        }
+    }
+
+    private static class SecondStepFragment extends GuidedStepFragment {
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public GuidanceStylist onCreateGuidanceStylist() {
+            return new GuidanceStylist() {
+                @Override
+                public int onProvideLayoutId() {
+                    return R.layout.guidedstep_second_guidance;
+                }
+            };
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            String desc = "The description can be quite long as well.  ";
+            desc += "Just be sure to set multilineDescription to true in the GuidedAction.";
+            actions.add(new GuidedAction.Builder()
+                    .title("Note that Guided Actions can have titles that are quite long.")
+                    .description(desc)
+                    .multilineDescription(true)
+                    .infoOnly(true)
+                    .enabled(false)
+                    .build());
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                addCheckedAction(actions, OPTION_DRAWABLES[i], getActivity(), OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i]);
+                if (i == DEFAULT_OPTION) {
+                    actions.get(actions.size() -1).setChecked(true);
+                }
+            }
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            GuidedStepFragment.add(fm, new ThirdStepFragment(getSelectedActionPosition()-1));
+        }
+
+    }
+
+    private static class ThirdStepFragment extends GuidedStepFragment {
+        private final int mOption;
+
+        public ThirdStepFragment(int option) {
+            mOption = option;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_third_title);
+            String breadcrumb = getString(R.string.guidedstep_third_breadcrumb);
+            String description = "You chose: " + OPTION_NAMES[mOption];
+            Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addAction(actions, CONTINUE, "Done", "All finished");
+            addAction(actions, BACK, "Back", "Forgot something...");
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == CONTINUE) {
+                getActivity().finish();
+            } else {
+                getFragmentManager().popBackStack();
+            }
+        }
+
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
index 74e7fb2..90b1c6f 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
@@ -1,28 +1,92 @@
 /*
  * Copyright (C) 2014 The Android Open Source Project
  *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.example.android.leanback;
 
 import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
 
-public class MainActivity extends Activity
-{
-    /** Called when the activity is first created. */
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Activity that allows navigation among the demo activities.
+ */
+public class MainActivity extends Activity {
+
+    private GuidedStepFragment mGuidedStepFragment;
+
     @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
+    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
+
+        mGuidedStepFragment = new StepFragment();
+        GuidedStepFragment.add(getFragmentManager(), mGuidedStepFragment);
     }
+
+    private static class StepFragment extends GuidedStepFragment {
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.main_title);
+            String breadcrumb = getString(R.string.main_breadcrumb);
+            String description = "";
+            Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addAction(actions, BrowseActivity.class, R.string.browse, R.string.browse_description);
+            addAction(actions, SearchActivity.class, R.string.search, R.string.search_description);
+            addAction(actions, DetailsActivity.class, R.string.details, R.string.details_description);
+            actions.get(actions.size()-1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
+                    new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            addAction(actions, PlaybackOverlayActivity.class, R.string.playback,
+                    R.string.playback_description);
+            addAction(actions, HorizontalGridTestActivity.class, R.string.hgrid,
+                    R.string.hgrid_description);
+            addAction(actions, VerticalGridActivity.class, R.string.vgrid,
+                    R.string.vgrid_description);
+            addAction(actions, GuidedStepActivity.class, R.string.guidedstep,
+                    R.string.guidedstep_description);
+            addAction(actions, BrowseErrorActivity.class, R.string.browseerror,
+                    R.string.browseerror_description);
+        }
+
+        private void addAction(List<GuidedAction> actions, Class cls, int titleRes, int descRes) {
+            actions.add(new GuidedAction.Builder()
+                    .intent(new Intent(getActivity(), cls))
+                    .title(getString(titleRes))
+                    .description(getString(descRes))
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            Intent intent = action.getIntent();
+            if (intent != null) {
+                startActivity(intent);
+            }
+        }
+
+    }
+
 }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java
new file mode 100644
index 0000000..c54f0d5
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Toast;
+
+abstract class PlaybackControlHelper extends PlaybackControlGlue {
+    /**
+     * Change the location of the thumbs up/down controls
+     */
+    private static final boolean THUMBS_PRIMARY = true;
+
+    private static final String FAUX_TITLE = "A short song of silence";
+    private static final String FAUX_SUBTITLE = "2014";
+    private static final int FAUX_DURATION = 33 * 1000;
+
+    // These should match the playback service FF behavior
+    private static int[] sFastForwardSpeeds = { 2, 3, 4, 5 };
+
+    private boolean mIsPlaying;
+    private int mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
+    private long mStartTime;
+    private long mStartPosition = 0;
+
+    private PlaybackControlsRow.RepeatAction mRepeatAction;
+    private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
+    private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
+
+    private Handler mHandler = new Handler();
+    private final Runnable mUpdateProgressRunnable = new Runnable() {
+        @Override
+        public void run() {
+            updateProgress();
+            mHandler.postDelayed(this, getUpdatePeriod());
+        }
+    };
+
+    public PlaybackControlHelper(Context context, PlaybackOverlayFragment fragment) {
+        super(context, fragment, sFastForwardSpeeds);
+        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
+        mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsUpAction.OUTLINE);
+        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
+        mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsDownAction.OUTLINE);
+        mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
+    }
+
+    @Override
+    public PlaybackControlsRowPresenter createControlsRowAndPresenter() {
+        PlaybackControlsRowPresenter presenter = super.createControlsRowAndPresenter();
+
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ControlButtonPresenterSelector());
+        getControlsRow().setSecondaryActionsAdapter(adapter);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsDownAction);
+        }
+        adapter.add(mRepeatAction);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsUpAction);
+        }
+
+        return presenter;
+    }
+
+    @Override
+    protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
+            PresenterSelector presenterSelector) {
+        SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
+        if (THUMBS_PRIMARY) {
+            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
+            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
+        }
+        return adapter;
+    }
+
+    @Override
+    public void onActionClicked(Action action) {
+        if (shouldDispatchAction(action)) {
+            dispatchAction(action);
+            return;
+        }
+        super.onActionClicked(action);
+    }
+
+    @Override
+    public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
+        if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+            Action action = getControlsRow().getActionForKeyCode(keyEvent.getKeyCode());
+            if (shouldDispatchAction(action)) {
+                dispatchAction(action);
+                return true;
+            }
+        }
+        return super.onKey(view, keyCode, keyEvent);
+    }
+
+    private boolean shouldDispatchAction(Action action) {
+        return action == mRepeatAction || action == mThumbsUpAction || action == mThumbsDownAction;
+    }
+
+    private void dispatchAction(Action action) {
+        Toast.makeText(getContext(), action.toString(), Toast.LENGTH_SHORT).show();
+        PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
+        multiAction.nextIndex();
+        notifyActionChanged(multiAction);
+    }
+
+    private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
+        int index;
+        index = getPrimaryActionsAdapter().indexOf(action);
+        if (index >= 0) {
+            getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+        } else {
+            index = getSecondaryActionsAdapter().indexOf(action);
+            if (index >= 0) {
+                getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+            }
+        }
+    }
+
+    private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
+        return (SparseArrayObjectAdapter) getControlsRow().getPrimaryActionsAdapter();
+    }
+
+    private ArrayObjectAdapter getSecondaryActionsAdapter() {
+        return (ArrayObjectAdapter) getControlsRow().getSecondaryActionsAdapter();
+    }
+
+    @Override
+    public boolean hasValidMedia() {
+        return true;
+    }
+
+    @Override
+    public boolean isMediaPlaying() {
+        return mIsPlaying;
+    }
+
+    @Override
+    public CharSequence getMediaTitle() {
+        return FAUX_TITLE;
+    }
+
+    @Override
+    public CharSequence getMediaSubtitle() {
+        return FAUX_SUBTITLE;
+    }
+
+    @Override
+    public int getMediaDuration() {
+        return FAUX_DURATION;
+    }
+
+    @Override
+    public Drawable getMediaArt() {
+        return null;
+    }
+
+    @Override
+    public long getSupportedActions() {
+        return PlaybackControlGlue.ACTION_PLAY_PAUSE |
+                PlaybackControlGlue.ACTION_FAST_FORWARD |
+                PlaybackControlGlue.ACTION_REWIND;
+    }
+
+    @Override
+    public int getCurrentSpeedId() {
+        return mSpeed;
+    }
+
+    @Override
+    public int getCurrentPosition() {
+        int speed;
+        if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
+            speed = 0;
+        } else if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_NORMAL) {
+            speed = 1;
+        } else if (mSpeed >= PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = getFastForwardSpeeds()[index];
+        } else if (mSpeed <= -PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = -mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = -getRewindSpeeds()[index];
+        } else {
+            return -1;
+        }
+        long position = mStartPosition +
+                (System.currentTimeMillis() - mStartTime) * speed;
+        if (position > getMediaDuration()) {
+            position = getMediaDuration();
+            onPlaybackComplete(true);
+        } else if (position < 0) {
+            position = 0;
+            onPlaybackComplete(false);
+        }
+        return (int) position;
+    }
+
+    void onPlaybackComplete(final boolean ended) {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.NONE) {
+                    pausePlayback();
+                } else {
+                    startPlayback(PlaybackControlGlue.PLAYBACK_SPEED_NORMAL);
+                }
+                mStartPosition = 0;
+                onStateChanged();
+            }
+        });
+    }
+
+    @Override
+    protected void startPlayback(int speed) {
+        if (speed == mSpeed) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = speed;
+        mIsPlaying = true;
+        mStartTime = System.currentTimeMillis();
+    }
+
+    @Override
+    protected void pausePlayback() {
+        if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
+        mIsPlaying = false;
+    }
+
+    @Override
+    protected void skipToNext() {
+        // Not supported
+    }
+
+    @Override
+    protected void skipToPrevious() {
+        // Not supported
+    }
+
+    @Override
+    public void enableProgressUpdating(boolean enable) {
+        mHandler.removeCallbacks(mUpdateProgressRunnable);
+        if (enable) {
+            mUpdateProgressRunnable.run();
+        }
+    }
+};
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
index c37ca20..0cb981a 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
@@ -15,13 +15,8 @@
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.RemoteException;
-import android.support.v17.leanback.app.MediaControllerGlue;
 import android.support.v17.leanback.app.PlaybackControlGlue;
 import android.support.v17.leanback.widget.Action;
 import android.support.v17.leanback.widget.ArrayObjectAdapter;
@@ -41,13 +36,9 @@
 import android.support.v17.leanback.widget.OnItemViewClickedListener;
 import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
 import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
-import android.support.v4.media.session.MediaControllerCompat;
-import android.support.v4.media.session.MediaSessionCompat;
 import android.util.Log;
 import android.widget.Toast;
 
-import java.util.List;
-
 public class PlaybackOverlayFragment extends android.support.v17.leanback.app.PlaybackOverlayFragment {
     private static final String TAG = "leanback.PlaybackControlsFragment";
 
@@ -62,39 +53,23 @@
     private static final int RELATED_CONTENT_ROWS = 3;
 
     /**
-     * Change the location of the thumbs up/down controls
-     */
-    private static final boolean THUMBS_PRIMARY = true;
-
-    /**
      * Change this to select hidden
      */
     private static final boolean SECONDARY_HIDDEN = false;
 
-    private static final String FAUX_TITLE = "A short song of silence";
-    private static final String FAUX_SUBTITLE = "2014";
-    private static final int FAUX_DURATION = 33 * 1000;
-
     private static final int ROW_CONTROLS = 0;
 
-    private PlaybackControlGlue mGlue;
+    private PlaybackControlHelper mGlue;
     private PlaybackControlsRowPresenter mPlaybackControlsRowPresenter;
     private ListRowPresenter mListRowPresenter;
 
-    private RepeatAction mRepeatAction;
-    private ThumbsUpAction mThumbsUpAction;
-    private ThumbsDownAction mThumbsDownAction;
-    private Handler mHandler;
-
-    // These should match the playback service FF behavior
-    private int[] mFastForwardSpeeds = { 2, 3, 4, 5 };
-
     private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
         @Override
         public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Log.i(TAG, "onItemClicked: " + item + " row " + row);
             if (item instanceof Action) {
-                onActionClicked((Action) item);
+                mGlue.onActionClicked((Action) item);
             }
         }
     };
@@ -107,14 +82,6 @@
         }
     };
 
-    final Runnable mUpdateProgressRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mGlue.updateProgress();
-            mHandler.postDelayed(this, mGlue.getUpdatePeriod());
-        }
-    };
-
     public SparseArrayObjectAdapter getAdapter() {
         return (SparseArrayObjectAdapter) super.getAdapter();
     }
@@ -131,155 +98,25 @@
     }
 
     private void createComponents(Context context) {
-        mHandler = new Handler();
-        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
-        mThumbsUpAction.setIndex(ThumbsUpAction.OUTLINE);
-        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
-        mThumbsDownAction.setIndex(ThumbsDownAction.OUTLINE);
-        mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
-
-        mGlue = new PlaybackControlGlue(context, this, mFastForwardSpeeds) {
-            private boolean mIsPlaying;
-            private int mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
-            private long mStartTime;
-            private long mStartPosition = 0;
-
+        mGlue = new PlaybackControlHelper(context, this) {
             @Override
-            protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
-                    PresenterSelector presenterSelector) {
-                return PlaybackOverlayFragment.this.createPrimaryActionsAdapter(
-                        presenterSelector);
-            }
-
-            @Override
-            public boolean hasValidMedia() {
-                return true;
-            }
-
-            @Override
-            public boolean isMediaPlaying() {
-                return mIsPlaying;
-            }
-
-            @Override
-            public CharSequence getMediaTitle() {
-                return FAUX_TITLE;
-            }
-
-            @Override
-            public CharSequence getMediaSubtitle() {
-                return FAUX_SUBTITLE;
-            }
-
-            @Override
-            public int getMediaDuration() {
-                return FAUX_DURATION;
-            }
-
-            @Override
-            public Drawable getMediaArt() {
-                return null;
-            }
-
-            @Override
-            public long getSupportedActions() {
-                return PlaybackControlGlue.ACTION_PLAY_PAUSE |
-                        PlaybackControlGlue.ACTION_FAST_FORWARD |
-                        PlaybackControlGlue.ACTION_REWIND;
-            }
-
-            @Override
-            public int getCurrentSpeedId() {
-                return mSpeed;
-            }
-
-            @Override
-            public int getCurrentPosition() {
-                int speed;
-                if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
-                    speed = 0;
-                } else if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_NORMAL) {
-                    speed = 1;
-                } else if (mSpeed >= PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
-                    int index = mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
-                    speed = getFastForwardSpeeds()[index];
-                } else if (mSpeed <= -PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
-                    int index = -mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
-                    speed = -getRewindSpeeds()[index];
-                } else {
-                    return -1;
+            public int getUpdatePeriod() {
+                int totalTime = getControlsRow().getTotalTime();
+                if (getView() == null || totalTime <= 0) {
+                    return 1000;
                 }
-                long position = mStartPosition +
-                        (System.currentTimeMillis() - mStartTime) * speed;
-                if (position > getMediaDuration()) {
-                    position = getMediaDuration();
-                    onPlaybackComplete(true);
-                } else if (position < 0) {
-                    position = 0;
-                    onPlaybackComplete(false);
-                }
-                return (int) position;
-            }
-
-            void onPlaybackComplete(final boolean ended) {
-                mHandler.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (mRepeatAction.getIndex() == RepeatAction.NONE) {
-                            pausePlayback();
-                        } else {
-                            startPlayback(PlaybackControlGlue.PLAYBACK_SPEED_NORMAL);
-                        }
-                        mStartPosition = 0;
-                        onStateChanged();
-                    }
-                });
-            }
-
-            @Override
-            protected void startPlayback(int speed) {
-                if (speed == mSpeed) {
-                    return;
-                }
-                mStartPosition = getCurrentPosition();
-                mSpeed = speed;
-                mIsPlaying = true;
-                mStartTime = System.currentTimeMillis();
-            }
-
-            @Override
-            protected void pausePlayback() {
-                if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
-                    return;
-                }
-                mStartPosition = getCurrentPosition();
-                mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
-                mIsPlaying = false;
-            }
-
-            @Override
-            protected void skipToNext() {
-                // Not supported
-            }
-
-            @Override
-            protected void skipToPrevious() {
-                // Not supported
+                return Math.max(16, totalTime / getView().getWidth());
             }
 
             @Override
             protected void onRowChanged(PlaybackControlsRow row) {
-                PlaybackOverlayFragment.this.onRowChanged(row);
-            }
-
-            @Override
-            public void enableProgressUpdating(boolean enable) {
-                PlaybackOverlayFragment.this.enableProgressUpdating(enable);
-            }
-
-            @Override
-            public int getUpdatePeriod() {
-                return PlaybackOverlayFragment.this.getUpdatePeriod();
+                if (getAdapter() == null) {
+                    return;
+                }
+                int index = getAdapter().indexOf(row);
+                if (index >= 0) {
+                    getAdapter().notifyArrayItemRangeChanged(index, 1);
+                }
             }
         };
 
@@ -301,20 +138,8 @@
             }
         }));
 
-        // Set secondary control actions
-        PlaybackControlsRow controlsRow = mGlue.getControlsRow();
-        ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ControlButtonPresenterSelector());
-        controlsRow.setSecondaryActionsAdapter(adapter);
-        if (!THUMBS_PRIMARY) {
-            adapter.add(mThumbsDownAction);
-        }
-        adapter.add(mRepeatAction);
-        if (!THUMBS_PRIMARY) {
-            adapter.add(mThumbsUpAction);
-        }
-
         // Add the controls row
-        getAdapter().set(ROW_CONTROLS, controlsRow);
+        getAdapter().set(ROW_CONTROLS, mGlue.getControlsRow());
 
         // Add related content rows
         for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
@@ -326,73 +151,6 @@
         }
     }
 
-    private SparseArrayObjectAdapter createPrimaryActionsAdapter(
-            PresenterSelector presenterSelector) {
-        SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
-        if (THUMBS_PRIMARY) {
-            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
-            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
-        }
-        return adapter;
-    }
-
-    private void onRowChanged(PlaybackControlsRow row) {
-        if (getAdapter() == null) {
-            return;
-        }
-        int index = getAdapter().indexOf(row);
-        if (index >= 0) {
-            getAdapter().notifyArrayItemRangeChanged(index, 1);
-        }
-    }
-
-    private void enableProgressUpdating(boolean enable) {
-        Log.v(TAG, "enableProgressUpdating " + enable + " this " + this);
-        mHandler.removeCallbacks(mUpdateProgressRunnable);
-        if (enable) {
-            mUpdateProgressRunnable.run();
-        }
-    }
-
-    private int getUpdatePeriod() {
-        int totalTime = mGlue.getControlsRow().getTotalTime();
-        if (getView() == null || totalTime <= 0) {
-            return 1000;
-        }
-        return Math.max(16, totalTime / getView().getWidth());
-    }
-
-    private void onActionClicked(Action action) {
-        Log.v(TAG, "onActionClicked " + action);
-        Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
-        if (action instanceof PlaybackControlsRow.MultiAction) {
-            PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
-            multiAction.nextIndex();
-            notifyActionChanged(multiAction);
-        }
-    }
-
-    private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
-        return (SparseArrayObjectAdapter) mGlue.getControlsRow().getPrimaryActionsAdapter();
-    }
-
-    private ArrayObjectAdapter getSecondaryActionsAdapter() {
-        return (ArrayObjectAdapter) mGlue.getControlsRow().getSecondaryActionsAdapter();
-    }
-
-    private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
-        int index;
-        index = getPrimaryActionsAdapter().indexOf(action);
-        if (index >= 0) {
-            getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
-        } else {
-            index = getSecondaryActionsAdapter().indexOf(action);
-            if (index >= 0) {
-                getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
-            }
-        }
-    }
-
     @Override
     public void onStart() {
         super.onStart();
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
index 133e995..e5b1ea1 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
@@ -14,27 +14,45 @@
 package com.example.android.leanback;
 
 import android.app.Activity;
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v17.leanback.R;
-import android.view.LayoutInflater;
+import android.support.v17.leanback.widget.BrowseFrameLayout;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v17.leanback.widget.TitleView;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
 
-public class RowsActivity extends Activity implements RowsFragment.OnRowsFirstLineSelectedListener
+public class RowsActivity extends Activity
 {
-    TextView mTitleView;
+    private RowsFragment mRowsFragment;
+    private TitleHelper mTitleHelper;
+
     /** Called when the activity is first created. */
     @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.rows);
-        mTitleView = (TextView) findViewById(R.id.rows_title);
+
+        mRowsFragment = (RowsFragment) getFragmentManager().findFragmentById(
+                R.id.main_rows_fragment);
+
+        setupTitleFragment();
     }
 
-    @Override
-    public void onSelectedFirstRow(boolean firstRow) {
-        mTitleView.setVisibility(firstRow ? View.VISIBLE : View.INVISIBLE);
+    private void setupTitleFragment() {
+        TitleView titleView = (TitleView) findViewById(R.id.title);
+        titleView.setTitle("RowsFragment");
+        titleView.setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(RowsActivity.this, SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        BrowseFrameLayout frameLayout = (BrowseFrameLayout) findViewById(R.id.rows_frame);
+        mTitleHelper = new TitleHelper(frameLayout, titleView);
+        frameLayout.setOnFocusSearchListener(mTitleHelper.getOnFocusSearchListener());
+        mRowsFragment.setTitleHelper(mTitleHelper);
     }
 }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
index 2509bfc..29b5e30 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
@@ -16,6 +16,8 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v17.leanback.widget.TitleView;
 import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.ArrayObjectAdapter;
@@ -35,15 +37,18 @@
 
 public class RowsFragment extends android.support.v17.leanback.app.RowsFragment {
 
-    public static interface OnRowsFirstLineSelectedListener {
-        void onSelectedFirstRow(boolean firstRow);
-    }
-
     private static final String TAG = "leanback.RowsFragment";
 
     private static final int NUM_ROWS = 10;
+    // Row heights default to wrap content
+    private static final boolean USE_FIXED_ROW_HEIGHT = false;
+
     private ArrayObjectAdapter mRowsAdapter;
-    private OnRowsFirstLineSelectedListener mCallback;
+    private TitleHelper mTitleHelper;
+
+    public void setTitleHelper(TitleHelper titleHelper) {
+        mTitleHelper = titleHelper;
+    }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -57,32 +62,21 @@
             public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
                     RowPresenter.ViewHolder rowViewHolder, Row row) {
                 Log.i(TAG, "onItemSelected: " + item + " row " + row);
-                if (mCallback == null) {
-                    return;
-                }
-                if (mRowsAdapter != null && mRowsAdapter.size() > 0 && row != null &&
-                        row != mRowsAdapter.get(0)) {
-                    mCallback.onSelectedFirstRow(false);
-                } else {
-                    mCallback.onSelectedFirstRow(true);
+                if (mTitleHelper != null) {
+                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||
+                            getAdapter().get(0) == row);
                 }
             }
         });
     }
 
-    @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        // This makes sure that the container activity has implemented
-        if (activity instanceof OnRowsFirstLineSelectedListener) {
-            mCallback = (OnRowsFirstLineSelectedListener) activity;
-        }
-    }
-
     private void setupRows() {
         ListRowPresenter lrp = new ListRowPresenter();
-        lrp.setRowHeight(CardPresenter.getRowHeight(getActivity()));
-        lrp.setExpandedRowHeight(CardPresenter.getExpandedRowHeight(getActivity()));
+
+        if (USE_FIXED_ROW_HEIGHT) {
+            lrp.setRowHeight(CardPresenter.getRowHeight(getActivity()));
+            lrp.setExpandedRowHeight(CardPresenter.getExpandedRowHeight(getActivity()));
+        }
 
         mRowsAdapter = new ArrayObjectAdapter(lrp);