diff --git a/design/api/current.txt b/design/api/current.txt
index 0e638cf..5ac4b7c 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -306,6 +306,7 @@
 
   public static final class TabLayout.Tab {
     method public java.lang.CharSequence getContentDescription();
+    method public android.view.View getCustomView();
     method public android.graphics.drawable.Drawable getIcon();
     method public int getPosition();
     method public java.lang.Object getTag();
diff --git a/design/base/android/support/design/widget/FloatingActionButtonImpl.java b/design/base/android/support/design/widget/FloatingActionButtonImpl.java
index 7fcb147..969e570 100644
--- a/design/base/android/support/design/widget/FloatingActionButtonImpl.java
+++ b/design/base/android/support/design/widget/FloatingActionButtonImpl.java
@@ -21,7 +21,6 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.support.design.R;
-import android.support.v4.graphics.drawable.DrawableCompat;
 import android.view.View;
 
 abstract class FloatingActionButtonImpl {
@@ -67,10 +66,10 @@
         final Resources resources = mView.getResources();
         CircularBorderDrawable borderDrawable = newCircularDrawable();
         borderDrawable.setGradientColors(
-                resources.getColor(R.color.fab_stroke_top_outer_color),
-                resources.getColor(R.color.fab_stroke_top_inner_color),
-                resources.getColor(R.color.fab_stroke_end_inner_color),
-                resources.getColor(R.color.fab_stroke_end_outer_color));
+                resources.getColor(R.color.design_fab_stroke_top_outer_color),
+                resources.getColor(R.color.design_fab_stroke_top_inner_color),
+                resources.getColor(R.color.design_fab_stroke_end_inner_color),
+                resources.getColor(R.color.design_fab_stroke_end_outer_color));
         borderDrawable.setBorderWidth(borderWidth);
         borderDrawable.setTintColor(backgroundTint.getDefaultColor());
         return borderDrawable;
diff --git a/design/base/android/support/design/widget/ShadowDrawableWrapper.java b/design/base/android/support/design/widget/ShadowDrawableWrapper.java
index d8144d4..dec1b62 100644
--- a/design/base/android/support/design/widget/ShadowDrawableWrapper.java
+++ b/design/base/android/support/design/widget/ShadowDrawableWrapper.java
@@ -18,7 +18,6 @@
 
 import android.content.res.Resources;
 import android.graphics.Canvas;
-import android.graphics.ColorFilter;
 import android.graphics.LinearGradient;
 import android.graphics.Paint;
 import android.graphics.Path;
@@ -81,9 +80,9 @@
             float shadowSize, float maxShadowSize) {
         super(content);
 
-        mShadowStartColor = resources.getColor(R.color.shadow_start_color);
-        mShadowMiddleColor = resources.getColor(R.color.shadow_mid_color);
-        mShadowEndColor = resources.getColor(R.color.shadow_end_color);
+        mShadowStartColor = resources.getColor(R.color.design_fab_shadow_start_color);
+        mShadowMiddleColor = resources.getColor(R.color.design_fab_shadow_mid_color);
+        mShadowEndColor = resources.getColor(R.color.design_fab_shadow_end_color);
 
         mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
         mCornerShadowPaint.setStyle(Paint.Style.FILL);
diff --git a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java b/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
index 1aa0b683..3e36a14 100644
--- a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
+++ b/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
@@ -164,7 +164,7 @@
         }
 
         Animation anim = android.view.animation.AnimationUtils.loadAnimation(
-                mView.getContext(), R.anim.fab_out);
+                mView.getContext(), R.anim.design_fab_out);
         anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
         anim.setDuration(SHOW_HIDE_ANIM_DURATION);
         anim.setAnimationListener(new AnimationUtils.AnimationListenerAdapter() {
@@ -185,7 +185,7 @@
     @Override
     void show() {
         Animation anim = android.view.animation.AnimationUtils.loadAnimation(
-                mView.getContext(), R.anim.fab_in);
+                mView.getContext(), R.anim.design_fab_in);
         anim.setDuration(SHOW_HIDE_ANIM_DURATION);
         anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
         mView.startAnimation(anim);
diff --git a/design/res/anim/fab_in.xml b/design/res/anim/design_fab_in.xml
similarity index 100%
rename from design/res/anim/fab_in.xml
rename to design/res/anim/design_fab_in.xml
diff --git a/design/res/anim/fab_out.xml b/design/res/anim/design_fab_out.xml
similarity index 100%
rename from design/res/anim/fab_out.xml
rename to design/res/anim/design_fab_out.xml
diff --git a/design/res/anim/snackbar_in.xml b/design/res/anim/design_snackbar_in.xml
similarity index 100%
rename from design/res/anim/snackbar_in.xml
rename to design/res/anim/design_snackbar_in.xml
diff --git a/design/res/anim/snackbar_out.xml b/design/res/anim/design_snackbar_out.xml
similarity index 100%
rename from design/res/anim/snackbar_out.xml
rename to design/res/anim/design_snackbar_out.xml
diff --git a/design/res/drawable/fab_background.xml b/design/res/drawable/design_fab_background.xml
similarity index 100%
rename from design/res/drawable/fab_background.xml
rename to design/res/drawable/design_fab_background.xml
diff --git a/design/res/drawable/snackbar_background.xml b/design/res/drawable/design_snackbar_background.xml
similarity index 84%
rename from design/res/drawable/snackbar_background.xml
rename to design/res/drawable/design_snackbar_background.xml
index 739b516..e82441c 100644
--- a/design/res/drawable/snackbar_background.xml
+++ b/design/res/drawable/design_snackbar_background.xml
@@ -17,6 +17,6 @@
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
-    <corners android:radius="@dimen/snackbar_background_corner_radius"/>
-    <solid android:color="@color/snackbar_background_color"/>
+    <corners android:radius="@dimen/design_snackbar_background_corner_radius"/>
+    <solid android:color="@color/design_snackbar_background_color"/>
 </shape>
\ No newline at end of file
diff --git a/design/res/layout-sw600dp/layout_snackbar.xml b/design/res/layout-sw600dp/design_layout_snackbar.xml
similarity index 100%
rename from design/res/layout-sw600dp/layout_snackbar.xml
rename to design/res/layout-sw600dp/design_layout_snackbar.xml
diff --git a/design/res/layout/layout_snackbar.xml b/design/res/layout/design_layout_snackbar.xml
similarity index 100%
rename from design/res/layout/layout_snackbar.xml
rename to design/res/layout/design_layout_snackbar.xml
diff --git a/design/res/layout/layout_snackbar_include.xml b/design/res/layout/design_layout_snackbar_include.xml
similarity index 64%
rename from design/res/layout/layout_snackbar_include.xml
rename to design/res/layout/design_layout_snackbar_include.xml
index 0cf2002..f1fd08e 100644
--- a/design/res/layout/layout_snackbar_include.xml
+++ b/design/res/layout/design_layout_snackbar_include.xml
@@ -22,12 +22,12 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:paddingTop="@dimen/snackbar_padding_vertical"
-            android:paddingBottom="@dimen/snackbar_padding_vertical"
-            android:paddingLeft="@dimen/snackbar_padding_horizontal"
-            android:paddingRight="@dimen/snackbar_padding_horizontal"
+            android:paddingTop="@dimen/design_snackbar_padding_vertical"
+            android:paddingBottom="@dimen/design_snackbar_padding_vertical"
+            android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
+            android:paddingRight="@dimen/design_snackbar_padding_horizontal"
             android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
-            android:maxLines="@integer/snackbar_text_max_lines"
+            android:maxLines="@integer/design_snackbar_text_max_lines"
             android:layout_gravity="center_vertical|left|start"
             android:ellipsize="end"/>
 
@@ -35,14 +35,14 @@
             android:id="@+id/snackbar_action"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="@dimen/snackbar_extra_spacing_horizontal"
-            android:layout_marginStart="@dimen/snackbar_extra_spacing_horizontal"
+            android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"
+            android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"
             android:layout_gravity="center_vertical|right|end"
             android:background="?attr/selectableItemBackground"
-            android:paddingTop="@dimen/snackbar_padding_vertical"
-            android:paddingBottom="@dimen/snackbar_padding_vertical"
-            android:paddingLeft="@dimen/snackbar_padding_horizontal"
-            android:paddingRight="@dimen/snackbar_padding_horizontal"
+            android:paddingTop="@dimen/design_snackbar_padding_vertical"
+            android:paddingBottom="@dimen/design_snackbar_padding_vertical"
+            android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
+            android:paddingRight="@dimen/design_snackbar_padding_horizontal"
             android:visibility="gone"
             android:textAppearance="@style/TextAppearance.Design.Snackbar.Action"/>
 
diff --git a/design/res/layout/layout_tab_icon.xml b/design/res/layout/design_layout_tab_icon.xml
similarity index 100%
rename from design/res/layout/layout_tab_icon.xml
rename to design/res/layout/design_layout_tab_icon.xml
diff --git a/design/res/layout/layout_tab_text.xml b/design/res/layout/design_layout_tab_text.xml
similarity index 100%
rename from design/res/layout/layout_tab_text.xml
rename to design/res/layout/design_layout_tab_text.xml
diff --git a/design/res/layout/design_navigation_item.xml b/design/res/layout/design_navigation_item.xml
index 59ee05c..3fcd74a 100644
--- a/design/res/layout/design_navigation_item.xml
+++ b/design/res/layout/design_navigation_item.xml
@@ -20,7 +20,7 @@
         android:layout_height="?attr/listPreferredItemHeightSmall"
         android:paddingLeft="?attr/listPreferredItemPaddingLeft"
         android:paddingRight="?attr/listPreferredItemPaddingRight"
-        android:drawablePadding="@dimen/navigation_icon_padding"
+        android:drawablePadding="@dimen/design_navigation_icon_padding"
         android:gravity="center_vertical|start"
         android:maxLines="1"
         android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>
diff --git a/design/res/layout/design_navigation_item_header.xml b/design/res/layout/design_navigation_item_header.xml
index 9886007..33fd199 100644
--- a/design/res/layout/design_navigation_item_header.xml
+++ b/design/res/layout/design_navigation_item_header.xml
@@ -18,4 +18,4 @@
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
-      android:paddingBottom="@dimen/navigation_separator_vertical_padding" />
+      android:paddingBottom="@dimen/design_navigation_separator_vertical_padding" />
diff --git a/design/res/layout/design_navigation_menu.xml b/design/res/layout/design_navigation_menu.xml
index a40f2eb..02aab37 100644
--- a/design/res/layout/design_navigation_menu.xml
+++ b/design/res/layout/design_navigation_menu.xml
@@ -18,8 +18,8 @@
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingTop="@dimen/navigation_padding_top_default"
-        android:paddingBottom="@dimen/navigation_padding_bottom"
+        android:paddingTop="@dimen/design_navigation_padding_top_default"
+        android:paddingBottom="@dimen/design_navigation_padding_bottom"
         android:clipToPadding="false"
         android:divider="@null"
         android:listSelector="?attr/selectableItemBackground"/>
diff --git a/design/res/values-sw600dp/config.xml b/design/res/values-sw600dp/config.xml
index baac13b..58b6207 100644
--- a/design/res/values-sw600dp/config.xml
+++ b/design/res/values-sw600dp/config.xml
@@ -17,6 +17,6 @@
 
 <resources>
 
-    <integer name="snackbar_text_max_lines">1</integer>
+    <integer name="design_snackbar_text_max_lines">1</integer>
 
 </resources>
\ No newline at end of file
diff --git a/design/res/values-sw600dp/dimens.xml b/design/res/values-sw600dp/dimens.xml
index 37c3ff5..ebbc20e 100644
--- a/design/res/values-sw600dp/dimens.xml
+++ b/design/res/values-sw600dp/dimens.xml
@@ -17,13 +17,13 @@
 
 <resources>
 
-    <dimen name="tab_min_width">160dp</dimen>
+    <dimen name="design_tab_min_width">160dp</dimen>
 
-    <dimen name="snackbar_min_width">320dp</dimen>
-    <dimen name="snackbar_max_width">576dp</dimen>
-    <dimen name="snackbar_padding_vertical_2lines">@dimen/snackbar_padding_vertical</dimen>
-    <dimen name="snackbar_extra_spacing_horizontal">24dp</dimen>
-    <dimen name="snackbar_background_corner_radius">2dp</dimen>
-    <dimen name="snackbar_action_inline_max_width">0dp</dimen>
+    <dimen name="design_snackbar_min_width">320dp</dimen>
+    <dimen name="design_snackbar_max_width">576dp</dimen>
+    <dimen name="design_snackbar_padding_vertical_2lines">@dimen/design_snackbar_padding_vertical</dimen>
+    <dimen name="design_snackbar_extra_spacing_horizontal">24dp</dimen>
+    <dimen name="design_snackbar_background_corner_radius">2dp</dimen>
+    <dimen name="design_snackbar_action_inline_max_width">0dp</dimen>
 
 </resources>
\ No newline at end of file
diff --git a/design/res/values-v21/dimens.xml b/design/res/values-v21/dimens.xml
index 2a67937..447aeb2 100644
--- a/design/res/values-v21/dimens.xml
+++ b/design/res/values-v21/dimens.xml
@@ -15,5 +15,5 @@
   ~ limitations under the License.
 -->
 <resources>
-    <dimen name="navigation_padding_top_default">24dp</dimen>
+    <dimen name="design_navigation_padding_top_default">24dp</dimen>
 </resources>
diff --git a/design/res/values/colors.xml b/design/res/values/colors.xml
index 216ad79..a958156 100644
--- a/design/res/values/colors.xml
+++ b/design/res/values/colors.xml
@@ -18,23 +18,23 @@
 <resources>
 
     <!-- Color for the top outer pixels in the stroke: 18% white (these are multiplied) -->
-    <color name="fab_stroke_top_outer_color">#2EFFFFFF</color>
+    <color name="design_fab_stroke_top_outer_color">#2EFFFFFF</color>
     <!-- Color for the top inner pixels in the stroke: 10% white (these are multiplied) -->
-    <color name="fab_stroke_top_inner_color">#1AFFFFFF</color>
+    <color name="design_fab_stroke_top_inner_color">#1AFFFFFF</color>
     <!-- Color for the bottom outer pixels in the stroke: 6% black (these are multiplied) -->
-    <color name="fab_stroke_end_outer_color">#0F000000</color>
+    <color name="design_fab_stroke_end_outer_color">#0F000000</color>
     <!-- Color for the bottom inner pixels in the stroke: 4% black (these are multiplied) -->
-    <color name="fab_stroke_end_inner_color">#0A000000</color>
+    <color name="design_fab_stroke_end_inner_color">#0A000000</color>
 
     <!-- Shadow color for the first pixels of a shadow -->
-    <color name="shadow_start_color">#44000000</color>
+    <color name="design_fab_shadow_start_color">#44000000</color>
     <!-- Shadow color for the middle pixels of a shadow -->
-    <color name="shadow_mid_color">#14000000</color>
+    <color name="design_fab_shadow_mid_color">#14000000</color>
     <!-- Shadow color for the furthest pixels of a shadow -->
-    <color name="shadow_end_color">@android:color/transparent</color>
+    <color name="design_fab_shadow_end_color">@android:color/transparent</color>
 
-    <color name="error_color">#FFDD2C00</color>
+    <color name="design_textinput_error_color">#FFDD2C00</color>
 
-    <color name="snackbar_background_color">#323232</color>
+    <color name="design_snackbar_background_color">#323232</color>
 
 </resources>
\ No newline at end of file
diff --git a/design/res/values/config.xml b/design/res/values/config.xml
index 2ff276a..67635a8 100644
--- a/design/res/values/config.xml
+++ b/design/res/values/config.xml
@@ -17,6 +17,6 @@
 
 <resources>
 
-    <integer name="snackbar_text_max_lines">2</integer>
+    <integer name="design_snackbar_text_max_lines">2</integer>
 
 </resources>
\ No newline at end of file
diff --git a/design/res/values/dimens.xml b/design/res/values/dimens.xml
index 45e83e6..034809d 100644
--- a/design/res/values/dimens.xml
+++ b/design/res/values/dimens.xml
@@ -16,41 +16,41 @@
 -->
 <resources>
 
-    <dimen name="fab_elevation">8dp</dimen>
-    <dimen name="fab_translation_z_pressed">6dp</dimen>
-    <dimen name="fab_content_size">24dp</dimen>
-    <dimen name="fab_size_normal">56dp</dimen>
-    <dimen name="fab_size_mini">40dp</dimen>
-    <dimen name="fab_border_width">0.5dp</dimen>
+    <dimen name="design_fab_elevation">8dp</dimen>
+    <dimen name="design_fab_translation_z_pressed">6dp</dimen>
+    <dimen name="design_fab_content_size">24dp</dimen>
+    <dimen name="design_fab_size_normal">56dp</dimen>
+    <dimen name="design_fab_size_mini">40dp</dimen>
+    <dimen name="design_fab_border_width">0.5dp</dimen>
 
-    <dimen name="navigation_max_width">320dp</dimen>
-    <dimen name="navigation_elevation">12dp</dimen>
-    <dimen name="navigation_icon_padding">32dp</dimen>
-    <dimen name="navigation_icon_size">24dp</dimen>
-    <dimen name="navigation_separator_vertical_padding">8dp</dimen>
-    <dimen name="navigation_padding_top_default">0dp</dimen>
-    <dimen name="navigation_padding_bottom">8dp</dimen>
+    <dimen name="design_navigation_max_width">320dp</dimen>
+    <dimen name="design_navigation_elevation">12dp</dimen>
+    <dimen name="design_navigation_icon_padding">32dp</dimen>
+    <dimen name="design_navigation_icon_size">24dp</dimen>
+    <dimen name="design_navigation_separator_vertical_padding">8dp</dimen>
+    <dimen name="design_navigation_padding_top_default">0dp</dimen>
+    <dimen name="design_navigation_padding_bottom">8dp</dimen>
 
-    <dimen name="tab_min_width">72dp</dimen>
-    <dimen name="tab_max_width">264dp</dimen>
+    <dimen name="design_tab_min_width">72dp</dimen>
+    <dimen name="design_tab_max_width">264dp</dimen>
 
-    <dimen name="snackbar_min_width">-1px</dimen>
-    <dimen name="snackbar_max_width">-1px</dimen>
-    <dimen name="snackbar_elevation">2dp</dimen>
-    <dimen name="snackbar_background_corner_radius">0dp</dimen>
+    <dimen name="design_snackbar_min_width">-1px</dimen>
+    <dimen name="design_snackbar_max_width">-1px</dimen>
+    <dimen name="design_snackbar_elevation">2dp</dimen>
+    <dimen name="design_snackbar_background_corner_radius">0dp</dimen>
 
-    <dimen name="snackbar_padding_horizontal">12dp</dimen>
-    <dimen name="snackbar_padding_vertical">14dp</dimen>
-    <dimen name="snackbar_padding_vertical_2lines">24dp</dimen>
+    <dimen name="design_snackbar_padding_horizontal">12dp</dimen>
+    <dimen name="design_snackbar_padding_vertical">14dp</dimen>
+    <dimen name="design_snackbar_padding_vertical_2lines">24dp</dimen>
 
     <!-- Extra spacing between the action and message views -->
-    <dimen name="snackbar_extra_spacing_horizontal">0dp</dimen>
+    <dimen name="design_snackbar_extra_spacing_horizontal">0dp</dimen>
     <!-- The maximum width for a Snackbar's inline action. If the view is width than this then
          the Snackbar will change to vertical stacking -->
-    <dimen name="snackbar_action_inline_max_width">128dp</dimen>
+    <dimen name="design_snackbar_action_inline_max_width">128dp</dimen>
 
-    <dimen name="snackbar_text_size">14sp</dimen>
+    <dimen name="design_snackbar_text_size">14sp</dimen>
 
-    <dimen name="appbar_elevation">4dp</dimen>
+    <dimen name="design_appbar_elevation">4dp</dimen>
 
 </resources>
diff --git a/design/res/values/styles.xml b/design/res/values/styles.xml
index 067846c..8736183 100644
--- a/design/res/values/styles.xml
+++ b/design/res/values/styles.xml
@@ -17,13 +17,13 @@
 <resources>
 
     <style name="Widget.Design.FloatingActionButton" parent="android:Widget">
-        <item name="android:background">@drawable/fab_background</item>
+        <item name="android:background">@drawable/design_fab_background</item>
         <item name="backgroundTint">?attr/colorAccent</item>
         <item name="fabSize">normal</item>
-        <item name="elevation">@dimen/fab_elevation</item>
-        <item name="pressedTranslationZ">@dimen/fab_translation_z_pressed</item>
+        <item name="elevation">@dimen/design_fab_elevation</item>
+        <item name="pressedTranslationZ">@dimen/design_fab_translation_z_pressed</item>
         <item name="rippleColor">?attr/colorControlHighlight</item>
-        <item name="borderWidth">@dimen/fab_border_width</item>
+        <item name="borderWidth">@dimen/design_fab_border_width</item>
     </style>
 
     <style name="Widget.Design.ScrimInsetsFrameLayout" parent="">
@@ -31,10 +31,10 @@
     </style>
 
     <style name="Widget.Design.NavigationView" parent="">
-        <item name="elevation">@dimen/navigation_elevation</item>
+        <item name="elevation">@dimen/design_navigation_elevation</item>
         <item name="android:background">?android:attr/windowBackground</item>
         <item name="android:fitsSystemWindows">true</item>
-        <item name="android:maxWidth">@dimen/navigation_max_width</item>
+        <item name="android:maxWidth">@dimen/design_navigation_max_width</item>
     </style>
 
     <style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
@@ -43,7 +43,7 @@
     </style>
 
     <style name="Base.Widget.Design.TabLayout" parent="android:Widget">
-        <item name="tabMaxWidth">@dimen/tab_max_width</item>
+        <item name="tabMaxWidth">@dimen/design_tab_max_width</item>
         <item name="tabIndicatorColor">?attr/colorAccent</item>
         <item name="tabIndicatorHeight">2dp</item>
         <item name="tabPaddingStart">12dp</item>
@@ -69,11 +69,11 @@
     </style>
 
     <style name="TextAppearance.Design.Error" parent="TextAppearance.AppCompat.Caption">
-        <item name="android:textColor">@color/error_color</item>
+        <item name="android:textColor">@color/design_textinput_error_color</item>
     </style>
 
     <style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance">
-        <item name="android:textSize">@dimen/snackbar_text_size</item>
+        <item name="android:textSize">@dimen/design_snackbar_text_size</item>
         <item name="android:textColor">?android:textColorPrimary</item>
     </style>
 
@@ -83,13 +83,13 @@
 
     <style name="Widget.Design.Snackbar" parent="android:Widget">
         <item name="android:theme">@style/ThemeOverlay.AppCompat.Dark</item>
-        <item name="android:minWidth">@dimen/snackbar_min_width</item>
-        <item name="android:maxWidth">@dimen/snackbar_max_width</item>
-        <item name="android:background">@drawable/snackbar_background</item>
-        <item name="android:paddingLeft">@dimen/snackbar_padding_horizontal</item>
-        <item name="android:paddingRight">@dimen/snackbar_padding_horizontal</item>
-        <item name="elevation">@dimen/snackbar_elevation</item>
-        <item name="maxActionInlineWidth">@dimen/snackbar_action_inline_max_width</item>
+        <item name="android:minWidth">@dimen/design_snackbar_min_width</item>
+        <item name="android:maxWidth">@dimen/design_snackbar_max_width</item>
+        <item name="android:background">@drawable/design_snackbar_background</item>
+        <item name="android:paddingLeft">@dimen/design_snackbar_padding_horizontal</item>
+        <item name="android:paddingRight">@dimen/design_snackbar_padding_horizontal</item>
+        <item name="elevation">@dimen/design_snackbar_elevation</item>
+        <item name="maxActionInlineWidth">@dimen/design_snackbar_action_inline_max_width</item>
     </style>
 
     <style name="Widget.Design.CollapsingToolbar" parent="android:Widget">
@@ -100,7 +100,7 @@
     </style>
 
     <style name="Widget.Design.AppBarLayout" parent="android:Widget">
-        <item name="elevation">@dimen/appbar_elevation</item>
+        <item name="elevation">@dimen/design_appbar_elevation</item>
         <item name="android:background">?attr/colorPrimary</item>
     </style>
 
diff --git a/design/src/android/support/design/internal/NavigationMenuItemView.java b/design/src/android/support/design/internal/NavigationMenuItemView.java
index 4a97a8a..7813163 100644
--- a/design/src/android/support/design/internal/NavigationMenuItemView.java
+++ b/design/src/android/support/design/internal/NavigationMenuItemView.java
@@ -52,7 +52,8 @@
 
     public NavigationMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        mIconSize = context.getResources().getDimensionPixelSize(R.dimen.navigation_icon_size);
+        mIconSize = context.getResources().getDimensionPixelSize(
+                R.dimen.design_navigation_icon_size);
     }
 
     @Override
diff --git a/design/src/android/support/design/internal/NavigationMenuPresenter.java b/design/src/android/support/design/internal/NavigationMenuPresenter.java
index e80e677..34a82ee 100644
--- a/design/src/android/support/design/internal/NavigationMenuPresenter.java
+++ b/design/src/android/support/design/internal/NavigationMenuPresenter.java
@@ -86,9 +86,10 @@
         mLayoutInflater = LayoutInflater.from(context);
         mMenu = menu;
         Resources res = context.getResources();
-        mPaddingTopDefault = res.getDimensionPixelOffset(R.dimen.navigation_padding_top_default);
+        mPaddingTopDefault = res.getDimensionPixelOffset(
+                R.dimen.design_navigation_padding_top_default);
         mPaddingSeparator = res.getDimensionPixelOffset(
-                R.dimen.navigation_separator_vertical_padding);
+                R.dimen.design_navigation_separator_vertical_padding);
     }
 
     @Override
diff --git a/design/src/android/support/design/widget/FloatingActionButton.java b/design/src/android/support/design/widget/FloatingActionButton.java
index 0a7eef8..9234de8 100644
--- a/design/src/android/support/design/widget/FloatingActionButton.java
+++ b/design/src/android/support/design/widget/FloatingActionButton.java
@@ -127,7 +127,8 @@
             mImpl = new FloatingActionButtonEclairMr1(this, delegate);
         }
 
-        final int maxContentSize = (int) getResources().getDimension(R.dimen.fab_content_size);
+        final int maxContentSize = (int) getResources().getDimension(
+                R.dimen.design_fab_content_size);
         mContentPadding = (getSizeDimension() - maxContentSize) / 2;
 
         mImpl.setBackgroundDrawable(background, mBackgroundTint,
@@ -258,10 +259,10 @@
     final int getSizeDimension() {
         switch (mSize) {
             case SIZE_MINI:
-                return getResources().getDimensionPixelSize(R.dimen.fab_size_mini);
+                return getResources().getDimensionPixelSize(R.dimen.design_fab_size_mini);
             case SIZE_NORMAL:
             default:
-                return getResources().getDimensionPixelSize(R.dimen.fab_size_normal);
+                return getResources().getDimensionPixelSize(R.dimen.design_fab_size_normal);
         }
     }
 
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
index 83888ce..aa1a291 100644
--- a/design/src/android/support/design/widget/Snackbar.java
+++ b/design/src/android/support/design/widget/Snackbar.java
@@ -156,7 +156,7 @@
         mContext = parent.getContext();
 
         LayoutInflater inflater = LayoutInflater.from(mContext);
-        mView = (SnackbarLayout) inflater.inflate(R.layout.layout_snackbar, mParent, false);
+        mView = (SnackbarLayout) inflater.inflate(R.layout.design_layout_snackbar, mParent, false);
     }
 
     /**
@@ -448,7 +448,7 @@
                         }
                     }).start();
         } else {
-            Animation anim = AnimationUtils.loadAnimation(mView.getContext(), R.anim.snackbar_in);
+            Animation anim = AnimationUtils.loadAnimation(mView.getContext(), R.anim.design_snackbar_in);
             anim.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
             anim.setDuration(ANIMATION_DURATION);
             anim.setAnimationListener(new Animation.AnimationListener() {
@@ -487,7 +487,7 @@
                         }
                     }).start();
         } else {
-            Animation anim = AnimationUtils.loadAnimation(mView.getContext(), R.anim.snackbar_out);
+            Animation anim = AnimationUtils.loadAnimation(mView.getContext(), R.anim.design_snackbar_out);
             anim.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
             anim.setDuration(ANIMATION_DURATION);
             anim.setAnimationListener(new Animation.AnimationListener() {
@@ -580,7 +580,7 @@
             // Now inflate our content. We need to do this manually rather than using an <include>
             // in the layout since older versions of the Android do not inflate includes with
             // the correct Context.
-            LayoutInflater.from(context).inflate(R.layout.layout_snackbar_include, this);
+            LayoutInflater.from(context).inflate(R.layout.design_layout_snackbar_include, this);
         }
 
         @Override
@@ -608,9 +608,9 @@
             }
 
             final int multiLineVPadding = getResources().getDimensionPixelSize(
-                    R.dimen.snackbar_padding_vertical_2lines);
+                    R.dimen.design_snackbar_padding_vertical_2lines);
             final int singleLineVPadding = getResources().getDimensionPixelSize(
-                    R.dimen.snackbar_padding_vertical);
+                    R.dimen.design_snackbar_padding_vertical);
             final boolean isMultiLine = mMessageView.getLayout().getLineCount() > 1;
 
             boolean remeasure = false;
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
index 610b1a4..b2d468c 100755
--- a/design/src/android/support/design/widget/TabLayout.java
+++ b/design/src/android/support/design/widget/TabLayout.java
@@ -199,7 +199,7 @@
     private final int mTabBackgroundResId;
 
     private final int mTabMinWidth;
-    private int mTabMaxWidth;
+    private int mTabMaxWidth = Integer.MAX_VALUE;
     private final int mRequestedTabMaxWidth;
 
     private int mContentInsetStart;
@@ -740,7 +740,12 @@
             // If the request tab max width is 0, or larger than our default, use the default
             maxTabWidth = defaultTabMaxWidth;
         }
-        mTabMaxWidth = maxTabWidth;
+
+        if (mTabMaxWidth != maxTabWidth) {
+            // If the tab max width has changed, re-measure
+            mTabMaxWidth = maxTabWidth;
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        }
     }
 
     private void removeTabViewAt(int position) {
@@ -917,7 +922,15 @@
             return this;
         }
 
-        View getCustomView() {
+
+        /**
+         * Returns the custom view used for this tab.
+         *
+         * @see #setCustomView(View)
+         * @see #setCustomView(int)
+         */
+        @Nullable
+        public View getCustomView() {
             return mCustomView;
         }
 
@@ -1212,13 +1225,13 @@
                 // If there isn't a custom view, we'll us our own in-built layouts
                 if (mIconView == null) {
                     ImageView iconView = (ImageView) LayoutInflater.from(getContext())
-                            .inflate(R.layout.layout_tab_icon, this, false);
+                            .inflate(R.layout.design_layout_tab_icon, this, false);
                     addView(iconView, 0);
                     mIconView = iconView;
                 }
                 if (mTextView == null) {
                     TextView textView = (TextView) LayoutInflater.from(getContext())
-                            .inflate(R.layout.layout_tab_text, this, false);
+                            .inflate(R.layout.design_layout_tab_text, this, false);
                     addView(textView);
                     mTextView = textView;
                 }
diff --git a/design/src/android/support/design/widget/TextInputLayout.java b/design/src/android/support/design/widget/TextInputLayout.java
index 15173cc..4332d10 100644
--- a/design/src/android/support/design/widget/TextInputLayout.java
+++ b/design/src/android/support/design/widget/TextInputLayout.java
@@ -277,6 +277,10 @@
      */
     public void setErrorEnabled(boolean enabled) {
         if (mErrorEnabled != enabled) {
+            if (mErrorView != null) {
+                ViewCompat.animate(mErrorView).cancel();
+            }
+
             if (enabled) {
                 mErrorView = new TextView(getContext());
                 mErrorView.setTextAppearance(getContext(), mErrorTextAppearance);
@@ -334,8 +338,7 @@
                         .setListener(new ViewPropertyAnimatorListenerAdapter() {
                             @Override
                             public void onAnimationEnd(View view) {
-                                mErrorView.setText(null);
-                                mErrorView.setVisibility(INVISIBLE);
+                                view.setVisibility(INVISIBLE);
                             }
                         }).start();
             }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
index 7a7d0f8..8edd19c 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
@@ -824,4 +824,24 @@
     public void setRecyclerListener(RecyclerView.RecyclerListener listener) {
         mChainedRecyclerListener = listener;
     }
+
+    /**
+     * Sets pixels of extra space for layout child in invisible area.
+     *
+     * @param extraLayoutSpace  Pixels of extra space for layout invisible child.
+     *                          Must be bigger or equals to 0.
+     * @hide
+     */
+    public void setExtraLayoutSpace(int extraLayoutSpace) {
+        mLayoutManager.setExtraLayoutSpace(extraLayoutSpace);
+    }
+
+    /**
+     * Returns pixels of extra space for layout child in invisible area.
+     *
+     * @hide
+     */
+    public int getExtraLayoutSpace() {
+        return mLayoutManager.getExtraLayoutSpace();
+    }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
index 5ebc4a6..ff09d7c 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
@@ -19,11 +19,9 @@
 import java.io.PrintWriter;
 
 /**
- * A grid is representation of multiple row layout data structure and algorithm.
- * Grid is the base class for both staggered case or simple non-staggered case.
+ * A grid is representation of single or multiple rows layout data structure and algorithm.
+ * Grid is the base class for single row, non-staggered grid and staggered grid.
  * <p>
- * User calls Grid.createStaggeredMutipleRows() to create an staggered instance.
- * TODO add createNonStaggeredRows().
  * To use the Grid, user must implement a Provider to create or remove visible item.
  * Grid maintains a list of visible items.  Visible items are created when
  * user calls appendVisibleItems() or prependVisibleItems() with certain limitation
@@ -121,11 +119,17 @@
     protected int mStartIndex = START_DEFAULT;
 
     /**
-     * Creates a multiple rows staggered grid.
+     * Creates a single or multiple rows (can be staggered or not staggered) grid
      */
-    public static Grid createStaggeredMultipleRows(int rows) {
-        StaggeredGridDefault grid = new StaggeredGridDefault();
-        grid.setNumRows(rows);
+    public static Grid createGrid(int rows) {
+        Grid grid;
+        if (rows == 1) {
+            grid = new SingleRow();
+        } else {
+            // TODO support non staggered multiple rows grid
+            grid = new StaggeredGridDefault();
+            grid.setNumRows(rows);
+        }
         return grid;
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 5719061..d65233c 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -21,6 +21,9 @@
 import android.os.Parcelable;
 import android.support.v4.util.CircularIntArray;
 import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityRecordCompat;
 import android.support.v7.widget.LinearSmoothScroller;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.Recycler;
@@ -203,16 +206,10 @@
                 targetView.requestFocus();
                 mInSelection = false;
             }
-            if (needsDispatchChildSelectedOnStop()) {
-                dispatchChildSelected();
-            }
+            dispatchChildSelected();
             super.onStop();
         }
 
-        boolean needsDispatchChildSelectedOnStop() {
-            return true;
-        }
-
         @Override
         protected void onTargetFound(View targetView,
                 RecyclerView.State state, Action action) {
@@ -254,18 +251,12 @@
         void increasePendingMoves() {
             if (mPendingMoves < MAX_PENDING_MOVES) {
                 mPendingMoves++;
-                if (mPendingMoves == 0) {
-                    dispatchChildSelected();
-                }
             }
         }
 
         void decreasePendingMoves() {
             if (mPendingMoves > -MAX_PENDING_MOVES) {
                 mPendingMoves--;
-                if (mPendingMoves == 0) {
-                    dispatchChildSelected();
-                }
             }
         }
 
@@ -313,43 +304,7 @@
         void consumePendingMovesAfterLayout() {
             if (mStaggeredGrid && mPendingMoves != 0) {
                 // consume pending moves, focus to item on the same row.
-                final int focusedRow = mGrid != null && mFocusPosition != NO_POSITION ?
-                        mGrid.getLocation(mFocusPosition).row : NO_POSITION;
-                View newSelected = null;
-                for (int i = 0, count = getChildCount(); i < count && mPendingMoves != 0; i++) {
-                    int index = mPendingMoves > 0 ? i : count - 1 - i;
-                    final View child = getChildAt(index);
-                    if (!canScrollTo(child)) {
-                        continue;
-                    }
-                    int position = getPositionByIndex(index);
-                    Grid.Location loc = mGrid.getLocation(position);
-                    if (focusedRow == NO_POSITION || (loc != null && loc.row == focusedRow)) {
-                        if (mFocusPosition == NO_POSITION) {
-                            mFocusPosition = position;
-                            mSubFocusPosition = 0;
-                            newSelected = child;
-                        } else if ((mPendingMoves > 0 && position > mFocusPosition)
-                                || (mPendingMoves < 0 && position < mFocusPosition)) {
-                            mFocusPosition = position;
-                            mSubFocusPosition = 0;
-                            if (mPendingMoves > 0) {
-                                mPendingMoves--;
-                            } else {
-                                mPendingMoves++;
-                            }
-                            newSelected = child;
-                        }
-                    }
-                }
-                if (newSelected != null && hasFocus()) {
-                    mInSelection = true;
-                    newSelected.requestFocus();
-                    mInSelection = false;
-                }
-                if (mPendingMoves == 0) {
-                    dispatchChildSelected();
-                }
+                mPendingMoves = processSelectionMoves(true, mPendingMoves);
             }
             if (mPendingMoves == 0 || (mPendingMoves > 0 && hasCreatedLastItem())
                     || (mPendingMoves < 0 && hasCreatedFirstItem())) {
@@ -381,11 +336,6 @@
         }
 
         @Override
-        boolean needsDispatchChildSelectedOnStop() {
-            return mPendingMoves != 0;
-        }
-
-        @Override
         protected void onStop() {
             super.onStop();
             // if we hit wall,  need clear the remaining pending moves.
@@ -593,6 +543,11 @@
     private int mSizePrimary;
 
     /**
+     * Pixels of extra space for layout item (outside the widget)
+     */
+    private int mExtraLayoutSpace;
+
+    /**
      *  Allow DPAD key to navigate out at the front of the View (where position = 0),
      *  default is false.
      */
@@ -1044,7 +999,7 @@
 
             if (mGrid == null || mNumRows != mGrid.getNumRows() ||
                     mReverseFlowPrimary != mGrid.isReversedFlow()) {
-                mGrid = Grid.createStaggeredMultipleRows(mNumRows);
+                mGrid = Grid.createGrid(mNumRows);
                 mGrid.setProvider(mGridProvider);
                 mGrid.setReversedFlow(mReverseFlowPrimary);
             }
@@ -1417,8 +1372,7 @@
                     // avoid lots of childSelected events during a long smooth scrolling and
                     // increase performance.
                     if (index == mFocusPosition && subindex == mSubFocusPosition
-                            && (mPendingMoveSmoothScroller == null
-                            || mPendingMoveSmoothScroller.mPendingMoves == 0)) {
+                            && mPendingMoveSmoothScroller == null) {
                         dispatchChildSelected();
                     }
                 } else if (!mInFastRelayout) {
@@ -1588,17 +1542,31 @@
         }
     }
 
+    void setExtraLayoutSpace(int extraLayoutSpace) {
+        if (mExtraLayoutSpace == extraLayoutSpace) {
+            return;
+        } else if (mExtraLayoutSpace < 0) {
+            throw new IllegalArgumentException("ExtraLayoutSpace must >= 0");
+        }
+        mExtraLayoutSpace = extraLayoutSpace;
+        requestLayout();
+    }
+
+    int getExtraLayoutSpace() {
+        return mExtraLayoutSpace;
+    }
+
     private void removeInvisibleViewsAtEnd() {
         if (mPruneChild) {
             mGrid.removeInvisibleItemsAtEnd(mFocusPosition,
-                    mReverseFlowPrimary ? 0 : mSizePrimary);
+                    mReverseFlowPrimary ? -mExtraLayoutSpace : mSizePrimary + mExtraLayoutSpace);
         }
     }
 
     private void removeInvisibleViewsAtFront() {
         if (mPruneChild) {
             mGrid.removeInvisibleItemsAtFront(mFocusPosition,
-                    mReverseFlowPrimary ? mSizePrimary : 0);
+                    mReverseFlowPrimary ? mSizePrimary + mExtraLayoutSpace: -mExtraLayoutSpace);
         }
     }
 
@@ -1611,11 +1579,13 @@
     }
 
     private void appendVisibleItems() {
-        mGrid.appendVisibleItems(mReverseFlowPrimary ? 0 : mSizePrimary);
+        mGrid.appendVisibleItems(mReverseFlowPrimary ? -mExtraLayoutSpace
+                : mSizePrimary + mExtraLayoutSpace);
     }
 
     private void prependVisibleItems() {
-        mGrid.prependVisibleItems(mReverseFlowPrimary ? mSizePrimary : 0);
+        mGrid.prependVisibleItems(mReverseFlowPrimary ? mSizePrimary + mExtraLayoutSpace
+                : -mExtraLayoutSpace);
     }
 
     /**
@@ -2989,4 +2959,140 @@
         requestLayout();
         if (DEBUG) Log.v(getTag(), "onRestoreInstanceState mFocusPosition " + mFocusPosition);
     }
+
+    @Override
+    public int getRowCountForAccessibility(RecyclerView.Recycler recycler,
+            RecyclerView.State state) {
+        if (mOrientation == HORIZONTAL && mGrid != null) {
+            return mGrid.getNumRows();
+        }
+        return super.getRowCountForAccessibility(recycler, state);
+    }
+
+    @Override
+    public int getColumnCountForAccessibility(RecyclerView.Recycler recycler,
+            RecyclerView.State state) {
+        if (mOrientation == VERTICAL && mGrid != null) {
+            return mGrid.getNumRows();
+        }
+        return super.getColumnCountForAccessibility(recycler, state);
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfoForItem(RecyclerView.Recycler recycler,
+            RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) {
+        ViewGroup.LayoutParams lp = host.getLayoutParams();
+        if (mGrid == null || !(lp instanceof LayoutParams)) {
+            super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info);
+            return;
+        }
+        LayoutParams glp = (LayoutParams) lp;
+        int position = glp.getViewLayoutPosition();
+        int rowIndex = mGrid.getRowIndex(position);
+        int guessSpanIndex = position / mGrid.getNumRows();
+        if (mOrientation == HORIZONTAL) {
+            info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
+                    rowIndex, 1, guessSpanIndex, 1, false, false));
+        } else {
+            info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
+                    guessSpanIndex, 1, rowIndex, 1, false, false));
+        }
+    }
+
+    /*
+     * Leanback widget is different than the default implementation because the "scroll" is driven
+     * by selection change.
+     */
+    @Override
+    public boolean performAccessibilityAction(Recycler recycler, State state, int action,
+            Bundle args) {
+        saveContext(recycler, state);
+        switch (action) {
+            case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD:
+                // try to focus all the way to the last visible item on the same row.
+                processSelectionMoves(false, -mState.getItemCount());
+                break;
+            case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD:
+                processSelectionMoves(false, mState.getItemCount());
+                break;
+        }
+        leaveContext();
+        return true;
+    }
+
+    /*
+     * Move mFocusPosition multiple steps on the same row in main direction.
+     * Stops when moves are all consumed or reach first/last visible item.
+     * Returning remaining moves.
+     */
+    private int processSelectionMoves(boolean preventScroll, int moves) {
+        if (mGrid == null) {
+            return moves;
+        }
+        int focusPosition = mFocusPosition;
+        int focusedRow = focusPosition != NO_POSITION ?
+                mGrid.getRowIndex(focusPosition) : NO_POSITION;
+        View newSelected = null;
+        for (int i = 0, count = getChildCount(); i < count && moves != 0; i++) {
+            int index = moves > 0 ? i : count - 1 - i;
+            final View child = getChildAt(index);
+            if (!canScrollTo(child)) {
+                continue;
+            }
+            int position = getPositionByIndex(index);
+            int rowIndex = mGrid.getRowIndex(position);
+            if (focusedRow == NO_POSITION) {
+                focusPosition = position;
+                newSelected = child;
+                focusedRow = rowIndex;
+            } else if (rowIndex == focusedRow) {
+                if ((moves > 0 && position > focusPosition)
+                        || (moves < 0 && position < focusPosition)) {
+                    focusPosition = position;
+                    newSelected = child;
+                    if (moves > 0) {
+                        moves--;
+                    } else {
+                        moves++;
+                    }
+                }
+            }
+        }
+        if (newSelected != null) {
+            if (preventScroll) {
+                if (hasFocus()) {
+                    mInSelection = true;
+                    newSelected.requestFocus();
+                    mInSelection = false;
+                }
+                mFocusPosition = focusPosition;
+                mSubFocusPosition = 0;
+            } else {
+                scrollToView(newSelected, true);
+            }
+        }
+        return moves;
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfo(Recycler recycler, State state,
+            AccessibilityNodeInfoCompat info) {
+        saveContext(recycler, state);
+        if (mScrollEnabled && !hasCreatedFirstItem()) {
+            info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
+            info.setScrollable(true);
+        }
+        if (mScrollEnabled && !hasCreatedLastItem()) {
+            info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+            info.setScrollable(true);
+        }
+        final AccessibilityNodeInfoCompat.CollectionInfoCompat collectionInfo
+                = AccessibilityNodeInfoCompat.CollectionInfoCompat
+                .obtain(getRowCountForAccessibility(recycler, state),
+                        getColumnCountForAccessibility(recycler, state),
+                        isLayoutHierarchical(recycler, state),
+                        getSelectionModeForAccessibility(recycler, state));
+        info.setCollectionInfo(collectionInfo);
+        leaveContext();
+    }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java b/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java
new file mode 100644
index 0000000..52666ac
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SingleRow.java
@@ -0,0 +1,162 @@
+/*
+ * 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 android.support.v17.leanback.widget;
+
+import android.support.v4.util.CircularIntArray;
+
+import java.io.PrintWriter;
+
+/**
+ * A Grid with restriction to single row.
+ */
+class SingleRow extends Grid {
+
+    private final Location mTmpLocation = new Location(0);
+    private Object[] mTmpItem = new Object[1];
+
+    SingleRow() {
+        setNumRows(1);
+    }
+
+    @Override
+    public final Location getLocation(int index) {
+        // all items are on row 0, share the same Location object.
+        return mTmpLocation;
+    }
+
+    @Override
+    public final void debugPrint(PrintWriter pw) {
+        pw.print("SingleRow<");
+        pw.print(mFirstVisibleIndex);
+        pw.print(",");
+        pw.print(mLastVisibleIndex);
+        pw.print(">");
+        pw.println();
+    }
+
+    int getStartIndexForAppend() {
+        if (mLastVisibleIndex >= 0) {
+            return mLastVisibleIndex + 1;
+        } else if (mStartIndex != START_DEFAULT) {
+            return Math.min(mStartIndex, mProvider.getCount() - 1);
+        } else {
+            return 0;
+        }
+    }
+
+    int getStartIndexForPrepend() {
+        if (mFirstVisibleIndex >= 0) {
+            return mFirstVisibleIndex - 1;
+        } else if (mStartIndex != START_DEFAULT) {
+            return Math.min(mStartIndex, mProvider.getCount() - 1);
+        } else {
+            return mProvider.getCount() - 1;
+        }
+    }
+
+    @Override
+    protected final boolean prependVisibleItems(int toLimit, boolean oneColumnMode) {
+        if (mProvider.getCount() == 0) {
+            return false;
+        }
+        if (!oneColumnMode && checkPrependOverLimit(toLimit)) {
+            return false;
+        }
+        boolean filledOne = false;
+        for (int index = getStartIndexForPrepend(); index >= 0; index--) {
+            int size = mProvider.createItem(index, false, mTmpItem);
+            int edge;
+            if (mFirstVisibleIndex < 0 || mLastVisibleIndex < 0) {
+                edge = mReversedFlow ? Integer.MIN_VALUE : Integer.MAX_VALUE;
+                mLastVisibleIndex = mFirstVisibleIndex = index;
+            } else {
+                if (mReversedFlow) {
+                    edge = mProvider.getEdge(index + 1) + mMargin + size;
+                } else {
+                    edge = mProvider.getEdge(index + 1) - mMargin - size;
+                }
+                mFirstVisibleIndex = index;
+            }
+            mProvider.addItem(mTmpItem[0], index, size, 0, edge);
+            filledOne = true;
+            if (oneColumnMode || checkPrependOverLimit(toLimit)) {
+                break;
+            }
+        }
+        return filledOne;
+    }
+
+    @Override
+    protected final boolean appendVisibleItems(int toLimit, boolean oneColumnMode) {
+        if (mProvider.getCount() == 0) {
+            return false;
+        }
+        if (!oneColumnMode && checkAppendOverLimit(toLimit)) {
+            // not in one column mode, return immediately if over limit
+            return false;
+        }
+        boolean filledOne = false;
+        for (int index = getStartIndexForAppend(); index < mProvider.getCount(); index++) {
+            int size = mProvider.createItem(index, true, mTmpItem);
+            int edge;
+            if (mFirstVisibleIndex < 0 || mLastVisibleIndex< 0) {
+                edge = mReversedFlow ? Integer.MAX_VALUE : Integer.MIN_VALUE;
+                mLastVisibleIndex = mFirstVisibleIndex = index;
+            } else {
+                if (mReversedFlow) {
+                    edge = mProvider.getEdge(index - 1) - mProvider.getSize(index - 1) - mMargin;
+                } else {
+                    edge = mProvider.getEdge(index - 1) + mProvider.getSize(index - 1) + mMargin;
+                }
+                mLastVisibleIndex = index;
+            }
+            mProvider.addItem(mTmpItem[0], index, size, 0, edge);
+            filledOne = true;
+            if (oneColumnMode || checkAppendOverLimit(toLimit)) {
+                break;
+            }
+        }
+        return filledOne;
+    }
+
+    @Override
+    public final CircularIntArray[] getItemPositionsInRows(int startPos, int endPos) {
+        // all items are on the same row:
+        mTmpItemPositionsInRows[0].clear();
+        mTmpItemPositionsInRows[0].addLast(startPos);
+        mTmpItemPositionsInRows[0].addLast(endPos);
+        return mTmpItemPositionsInRows;
+    }
+
+    @Override
+    protected final int findRowMin(boolean findLarge, int indexLimit, int[] indices) {
+        if (indices != null) {
+            indices[0] = 0;
+            indices[1] = indexLimit;
+        }
+        return mReversedFlow ? mProvider.getEdge(indexLimit) - mProvider.getSize(indexLimit)
+                : mProvider.getEdge(indexLimit);
+    }
+
+    @Override
+    protected final int findRowMax(boolean findLarge, int indexLimit, int[] indices) {
+        if (indices != null) {
+            indices[0] = 0;
+            indices[1] = indexLimit;
+        }
+        return mReversedFlow ? mProvider.getEdge(indexLimit)
+                : mProvider.getEdge(indexLimit) + mProvider.getSize(indexLimit);
+    }
+
+}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
index 3651cca..026ed71 100644
--- a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -25,6 +25,10 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
+
 import android.app.Instrumentation;
 import android.content.Intent;
 import android.os.Parcelable;
@@ -1632,4 +1636,105 @@
         waitForTransientStateGone(null);
         assertEquals(0, mGridView.getSelectedPosition());
     }
+
+    public void testExtraLayoutSpace() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+
+        final int windowSize = mGridView.getHeight();
+        final int extraLayoutSize = windowSize;
+        int itemLength = mActivity.mItemLengths[0];
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        // add extra layout space
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setExtraLayoutSpace(extraLayoutSize);
+            }
+        });
+        Thread.sleep(50);
+        View v;
+        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
+        assertTrue(v.getTop() < windowSize + extraLayoutSize);
+        assertTrue(v.getBottom() >= windowSize + extraLayoutSize -
+                mGridView.getVerticalMargin());
+
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+        v = mGridView.getChildAt(0);
+        assertTrue(v.getBottom() > - extraLayoutSize);
+        assertTrue(v.getTop() <= -extraLayoutSize + mGridView.getVerticalMargin());
+
+        // clear extra layout space
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setExtraLayoutSpace(0);
+                verifyMargin();
+            }
+        });
+        Thread.sleep(50);
+        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
+        assertTrue(v.getTop() < windowSize);
+        assertTrue(v.getBottom() >= windowSize - mGridView.getVerticalMargin());
+    }
+
+    public void testAccessibility() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        assertTrue(0 == mGridView.getSelectedPosition());
+
+        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
+                .getCompatAccessibilityDelegate();
+        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
+            }
+        });
+        assertTrue("test sanity", info.isScrollable());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.performAccessibilityAction(mGridView,
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int selectedPosition1 = mGridView.getSelectedPosition();
+        assertTrue(0 < selectedPosition1);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
+            }
+        });
+        assertTrue("test sanity", info.isScrollable());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.performAccessibilityAction(mGridView,
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int selectedPosition2 = mGridView.getSelectedPosition();
+        assertTrue(selectedPosition2 < selectedPosition1);
+    }
+
 }
diff --git a/v17/tests/src/android/support/v17/leanback/widget/SingleRowTest.java b/v17/tests/src/android/support/v17/leanback/widget/SingleRowTest.java
new file mode 100644
index 0000000..43b0a29
--- /dev/null
+++ b/v17/tests/src/android/support/v17/leanback/widget/SingleRowTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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 android.support.v17.leanback.widget;
+
+/**
+ * Testing SingleRow algorithm
+ * @hide
+ */
+public class SingleRowTest extends GridTest {
+
+    SingleRow mSingleRow;
+
+    public void testAppendPrependRemove() throws Throwable {
+        mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
+
+        mSingleRow = new SingleRow();
+        mSingleRow.setMargin(20);
+        mSingleRow.setProvider(mProvider);
+        mSingleRow.appendVisibleItems(200);
+        assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(201);
+        assertEquals(dump(mSingleRow) + " Should filled 3 items",
+                2, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(251);
+        assertEquals(dump(mSingleRow) + " Should filled 4 items",
+                3, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(Integer.MAX_VALUE);
+        assertEquals(dump(mSingleRow) + " Should filled 6 items",
+               5, mSingleRow.mLastVisibleIndex);
+        assertEquals(mProvider.getEdge(0), 0);
+        assertEquals(mProvider.getEdge(1), 100);
+        assertEquals(mProvider.getEdge(2), 200);
+        assertEquals(mProvider.getEdge(3), 250);
+        assertEquals(mProvider.getEdge(4), 370);
+        assertEquals(mProvider.getEdge(5), 430);
+
+        mSingleRow.removeInvisibleItemsAtEnd(0, 200);
+        assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(Integer.MAX_VALUE);
+        assertEquals(dump(mSingleRow) + " Should filled 6 items",
+               5, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.removeInvisibleItemsAtFront(1000, 80);
+        assertEquals(dump(mSingleRow) + " visible index should start from 1",
+                1, mSingleRow.mFirstVisibleIndex);
+
+        mSingleRow.prependVisibleItems(0);
+        assertEquals(dump(mSingleRow) + " visible index should start from 0",
+                0, mSingleRow.mFirstVisibleIndex);
+    }
+
+    public void testAppendPrependRemoveReversed() throws Throwable {
+        mProvider = new Provider(new int[]{80, 80, 30, 100, 40, 10});
+
+        mSingleRow = new SingleRow();
+        mSingleRow.setMargin(20);
+        mSingleRow.setProvider(mProvider);
+        mSingleRow.setReversedFlow(true);
+        mSingleRow.appendVisibleItems(-200);
+        assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(-201);
+        assertEquals(dump(mSingleRow) + " Should filled 3 items",
+                2, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(-251);
+        assertEquals(dump(mSingleRow) + " Should filled 4 items",
+                3, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(Integer.MIN_VALUE);
+        assertEquals(dump(mSingleRow) + " Should filled 6 items",
+               5, mSingleRow.mLastVisibleIndex);
+        assertEquals(mProvider.getEdge(0), 0);
+        assertEquals(mProvider.getEdge(1), -100);
+        assertEquals(mProvider.getEdge(2), -200);
+        assertEquals(mProvider.getEdge(3), -250);
+        assertEquals(mProvider.getEdge(4), -370);
+        assertEquals(mProvider.getEdge(5), -430);
+
+        mSingleRow.removeInvisibleItemsAtEnd(0, -200);
+        assertEquals(dump(mSingleRow) + " Should filled 2 items", 1, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.appendVisibleItems(Integer.MIN_VALUE);
+        assertEquals(dump(mSingleRow) + " Should filled 6 items",
+               5, mSingleRow.mLastVisibleIndex);
+
+        mSingleRow.removeInvisibleItemsAtFront(1000, -80);
+        assertEquals(dump(mSingleRow) + " Should filled 6 items",
+                1, mSingleRow.mFirstVisibleIndex);
+    }
+}
diff --git a/v4/api/current.txt b/v4/api/current.txt
index c335c2b..17a1c4e 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -1147,11 +1147,13 @@
 
   public class DrawableCompat {
     ctor public DrawableCompat();
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
     method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
     method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
     method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
     method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static void setLayoutDirection(android.graphics.drawable.Drawable, int);
     method public static void setTint(android.graphics.drawable.Drawable, int);
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
@@ -3068,6 +3070,7 @@
     method public void closeDrawer(android.view.View);
     method public void closeDrawer(int);
     method public void closeDrawers();
+    method public float getDrawerElevation();
     method public int getDrawerLockMode(int);
     method public int getDrawerLockMode(android.view.View);
     method public java.lang.CharSequence getDrawerTitle(int);
@@ -3080,6 +3083,7 @@
     method protected void onLayout(boolean, int, int, int, int);
     method public void openDrawer(android.view.View);
     method public void openDrawer(int);
+    method public void setDrawerElevation(float);
     method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
     method public void setDrawerLockMode(int);
     method public void setDrawerLockMode(int, int);
diff --git a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java b/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
index 45f67a2..ddcff2e 100644
--- a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
+++ b/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
@@ -107,8 +107,8 @@
             Object sharedElementTransitionObject, final View container,
             final ViewRetriever inFragment, final View nonExistentView,
             EpicenterView epicenterView, final Map<String, String> nameOverrides,
-            final ArrayList<View> enteringViews, final Map<String, View> renamedViews,
-            final ArrayList<View> sharedElementTargets) {
+            final ArrayList<View> enteringViews, final Map<String, View> namedViews,
+            final Map<String, View> renamedViews, final ArrayList<View> sharedElementTargets) {
         if (enterTransitionObject != null || sharedElementTransitionObject != null) {
             final Transition enterTransition = (Transition) enterTransitionObject;
             if (enterTransition != null) {
@@ -116,7 +116,7 @@
             }
             if (sharedElementTransitionObject != null) {
                 setSharedElementTargets(sharedElementTransitionObject, nonExistentView,
-                        renamedViews, sharedElementTargets);
+                        namedViews, sharedElementTargets);
             }
 
             if (inFragment != null) {
diff --git a/v4/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java b/v4/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java
new file mode 100644
index 0000000..975d501
--- /dev/null
+++ b/v4/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java
@@ -0,0 +1,32 @@
+/*
+ * 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 android.support.v4.graphics.drawable;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * Implementation of drawable compatibility that can call M APIs.
+ */
+class DrawableCompatApi23 {
+    public static void setLayoutDirection(Drawable drawable, int layoutDirection) {
+        drawable.setLayoutDirection(layoutDirection);
+    }
+
+    public static int getLayoutDirection(Drawable drawable) {
+        return drawable.getLayoutDirection();
+    }
+}
diff --git a/v4/java/android/support/v4/app/BackStackRecord.java b/v4/java/android/support/v4/app/BackStackRecord.java
index 647cc38..f2eaad5 100644
--- a/v4/java/android/support/v4/app/BackStackRecord.java
+++ b/v4/java/android/support/v4/app/BackStackRecord.java
@@ -19,9 +19,8 @@
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.v4.app.FragmentTransitionCompat21;
-import android.support.v4.util.LogWriter;
 import android.support.v4.util.ArrayMap;
+import android.support.v4.util.LogWriter;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.SparseArray;
@@ -1207,7 +1206,7 @@
             FragmentTransitionCompat21.addTransitionTargets(enterTransition,
                     sharedElementTransition, sceneRoot, viewRetriever, state.nonExistentView,
                     state.enteringEpicenterView, state.nameOverrides, enteringViews,
-                    renamedViews, sharedElementTargets);
+                    namedViews, renamedViews, sharedElementTargets);
             excludeHiddenFragmentsAfterEnter(sceneRoot, state, containerId, transition);
 
             // We want to exclude hidden views later, so we need a non-null list in the
diff --git a/v4/java/android/support/v4/content/ModernAsyncTask.java b/v4/java/android/support/v4/content/ModernAsyncTask.java
index 503f1a2..e76ca21 100644
--- a/v4/java/android/support/v4/content/ModernAsyncTask.java
+++ b/v4/java/android/support/v4/content/ModernAsyncTask.java
@@ -30,7 +30,9 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import android.os.AsyncTask;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.Process;
 
@@ -72,7 +74,7 @@
     private static final int MESSAGE_POST_RESULT = 0x1;
     private static final int MESSAGE_POST_PROGRESS = 0x2;
 
-    private static final InternalHandler sHandler = new InternalHandler();
+    private static InternalHandler sHandler;
 
     private static volatile Executor sDefaultExecutor = THREAD_POOL_EXECUTOR;
     private final WorkerRunnable<Params, Result> mWorker;
@@ -101,9 +103,13 @@
         FINISHED,
     }
 
-    /** @hide Used to force static handler to be created. */
-    public static void init() {
-        sHandler.getLooper();
+    private static Handler getHandler() {
+        synchronized (ModernAsyncTask.class) {
+            if (sHandler == null) {
+                sHandler = new InternalHandler();
+            }
+            return sHandler;
+        }
     }
 
     /** @hide */
@@ -154,7 +160,7 @@
     }
 
     private Result postResult(Result result) {
-        Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
+        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
                 new AsyncTaskResult<Result>(this, result));
         message.sendToTarget();
         return result;
@@ -449,7 +455,7 @@
      */
     protected final void publishProgress(Progress... values) {
         if (!isCancelled()) {
-            sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
+            getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
                     new AsyncTaskResult<Progress>(this, values)).sendToTarget();
         }
     }
@@ -464,6 +470,10 @@
     }
 
     private static class InternalHandler extends Handler {
+        public InternalHandler() {
+            super(Looper.getMainLooper());
+        }
+
         @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
         @Override
         public void handleMessage(Message msg) {
diff --git a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java b/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
index 99c762f..7d868b4 100644
--- a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
+++ b/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
@@ -19,6 +19,7 @@
 import android.content.res.ColorStateList;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.support.v4.view.ViewCompat;
 
 /**
  * Helper for accessing features in {@link android.graphics.drawable.Drawable}
@@ -38,6 +39,8 @@
         void setTintList(Drawable drawable, ColorStateList tint);
         void setTintMode(Drawable drawable, PorterDuff.Mode tintMode);
         Drawable wrap(Drawable drawable);
+        void setLayoutDirection(Drawable drawable, int layoutDirection);
+        int getLayoutDirection(Drawable drawable);
     }
 
     /**
@@ -84,6 +87,16 @@
         public Drawable wrap(Drawable drawable) {
             return DrawableCompatBase.wrapForTinting(drawable);
         }
+
+        @Override
+        public void setLayoutDirection(Drawable drawable, int layoutDirection) {
+            // No op for API < 23
+        }
+
+        @Override
+        public int getLayoutDirection(Drawable drawable) {
+            return ViewCompat.LAYOUT_DIRECTION_LTR;
+        }
     }
 
     /**
@@ -167,12 +180,29 @@
     }
 
     /**
+     * Interface implementation for devices with at least M APIs.
+     */
+    static class MDrawableImpl extends LollipopMr1DrawableImpl {
+        @Override
+        public void setLayoutDirection(Drawable drawable, int layoutDirection) {
+            DrawableCompatApi23.setLayoutDirection(drawable, layoutDirection);
+        }
+
+        @Override
+        public int getLayoutDirection(Drawable drawable) {
+            return DrawableCompatApi23.getLayoutDirection(drawable);
+        }
+    }
+
+    /**
      * Select the correct implementation to use for the current platform.
      */
     static final DrawableImpl IMPL;
     static {
         final int version = android.os.Build.VERSION.SDK_INT;
-        if (version >= 22) {
+        if (version >= 23) {
+            IMPL = new MDrawableImpl();
+        } else if (version >= 22) {
             IMPL = new LollipopMr1DrawableImpl();
         } else if (version >= 21) {
             IMPL = new LollipopDrawableImpl();
@@ -315,4 +345,29 @@
         }
         return (T) drawable;
     }
+
+    /**
+     * Set the layout direction for this drawable. Should be a resolved
+     * layout direction, as the Drawable has no capacity to do the resolution on
+     * its own.
+     *
+     * @param layoutDirection the resolved layout direction for the drawable,
+     *                        either {@link ViewCompat#LAYOUT_DIRECTION_LTR}
+     *                        or {@link ViewCompat#LAYOUT_DIRECTION_RTL}
+     * @see #getLayoutDirection(Drawable)
+     */
+    public static void setLayoutDirection(Drawable drawable, int layoutDirection) {
+        IMPL.setLayoutDirection(drawable, layoutDirection);
+    }
+
+    /**
+     * Returns the resolved layout direction for this Drawable.
+     *
+     * @return One of {@link ViewCompat#LAYOUT_DIRECTION_LTR},
+     *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
+     * @see #setLayoutDirection(Drawable, int)
+     */
+    public static int getLayoutDirection(Drawable drawable) {
+        return IMPL.getLayoutDirection(drawable);
+    }
 }
diff --git a/v4/java/android/support/v4/widget/DrawerLayout.java b/v4/java/android/support/v4/widget/DrawerLayout.java
index d939b35..b68bc28 100644
--- a/v4/java/android/support/v4/widget/DrawerLayout.java
+++ b/v4/java/android/support/v4/widget/DrawerLayout.java
@@ -34,6 +34,7 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.view.AccessibilityDelegateCompat;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.KeyEventCompat;
@@ -135,6 +136,7 @@
 
 
     private static final int MIN_DRAWER_MARGIN = 64; // dp
+    private static final int DRAWER_ELEVATION = 10; //dp
 
     private static final int DEFAULT_SCRIM_COLOR = 0x99000000;
 
@@ -164,8 +166,13 @@
     /** Whether we can use NO_HIDE_DESCENDANTS accessibility importance. */
     private static final boolean CAN_HIDE_DESCENDANTS = Build.VERSION.SDK_INT >= 19;
 
+    /** Whether the drawer shadow comes from setting elevation on the drawer. */
+    private static final boolean SET_DRAWER_SHADOW_FROM_ELEVATION =
+            Build.VERSION.SDK_INT >= 21;
+
     private final ChildAccessibilityDelegate mChildAccessibilityDelegate =
             new ChildAccessibilityDelegate();
+    private float mDrawerElevation;
 
     private int mMinDrawerMargin;
 
@@ -190,9 +197,9 @@
     private float mInitialMotionX;
     private float mInitialMotionY;
 
-    private Drawable mShadowLeft;
-    private Drawable mShadowRight;
     private Drawable mStatusBarBackground;
+    private Drawable mShadowLeftResolved;
+    private Drawable mShadowRightResolved;
 
     private CharSequence mTitleLeft;
     private CharSequence mTitleRight;
@@ -200,6 +207,12 @@
     private Object mLastInsets;
     private boolean mDrawStatusBarBackground;
 
+    /** Shadow drawables for different gravity */
+    private Drawable mShadowStart = null;
+    private Drawable mShadowEnd = null;
+    private Drawable mShadowLeft = null;
+    private Drawable mShadowRight = null;
+
     /**
      * Listener for monitoring events about drawers.
      */
@@ -362,6 +375,38 @@
             IMPL.configureApplyInsets(this);
             mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context);
         }
+
+        mDrawerElevation = DRAWER_ELEVATION * density;
+    }
+
+    /**
+     * Sets the base elevation of the drawer(s) relative to the parent, in pixels. Note that the
+     * elevation change is only supported in API 21 and above.
+     *
+     * @param elevation The base depth position of the view, in pixels.
+     */
+    public void setDrawerElevation(float elevation) {
+        mDrawerElevation = elevation;
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+            if (isDrawerView(child)) {
+                ViewCompat.setElevation(child, mDrawerElevation);
+            }
+        }
+    }
+
+    /**
+     * The base elevation of the drawer(s) relative to the parent, in pixels. Note that the
+     * elevation change is only supported in API 21 and above. For unsupported API levels, 0 will
+     * be returned as the elevation.
+     *
+     * @return The base depth position of the view, in pixels.
+     */
+    public float getDrawerElevation() {
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            return mDrawerElevation;
+        }
+        return 0f;
     }
 
     /**
@@ -377,8 +422,15 @@
     }
 
     /**
-     * Set a simple drawable used for the left or right shadow.
-     * The drawable provided must have a nonzero intrinsic width.
+     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
+     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
+     * instead of the drawable provided.
+     *
+     * <p>Note that for better support for both left-to-right and right-to-left layout
+     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
+     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
+     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
+     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
      *
      * @param shadowDrawable Shadow drawable to use at the edge of a drawer
      * @param gravity Which drawer the shadow should apply to
@@ -389,22 +441,35 @@
          * They're probably nuts, but we might want to consider registering callbacks,
          * setting states, etc. properly.
          */
-
-        final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
-                ViewCompat.getLayoutDirection(this));
-        if ((absGravity & Gravity.LEFT) == Gravity.LEFT) {
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            // No op. Drawer shadow will come from setting an elevation on the drawer.
+            return;
+        }
+        if ((gravity & GravityCompat.START) == GravityCompat.START) {
+            mShadowStart = shadowDrawable;
+        } else if ((gravity & GravityCompat.END) == GravityCompat.END) {
+            mShadowEnd = shadowDrawable;
+        } else if ((gravity & Gravity.LEFT) == Gravity.LEFT) {
             mShadowLeft = shadowDrawable;
-            invalidate();
-        }
-        if ((absGravity & Gravity.RIGHT) == Gravity.RIGHT) {
+        } else if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {
             mShadowRight = shadowDrawable;
-            invalidate();
+        } else {
+            return;
         }
+        resolveShadowDrawables();
+        invalidate();
     }
 
     /**
-     * Set a simple drawable used for the left or right shadow.
-     * The drawable provided must have a nonzero intrinsic width.
+     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
+     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
+     * instead of the drawable provided.
+     *
+     * <p>Note that for better support for both left-to-right and right-to-left layout
+     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
+     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
+     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
+     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
      *
      * @param resId Resource id of a shadow drawable to use at the edge of a drawer
      * @param gravity Which drawer the shadow should apply to
@@ -868,6 +933,11 @@
                         heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);
                 child.measure(contentWidthSpec, contentHeightSpec);
             } else if (isDrawerView(child)) {
+                if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+                    if (ViewCompat.getElevation(child) != mDrawerElevation) {
+                        ViewCompat.setElevation(child, mDrawerElevation);
+                    }
+                }
                 final int childGravity =
                         getDrawerViewAbsoluteGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK;
                 if ((foundDrawers & childGravity) != 0) {
@@ -890,6 +960,65 @@
         }
     }
 
+    private void resolveShadowDrawables() {
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            return;
+        }
+        mShadowLeftResolved = resolveLeftShadow();
+        mShadowRightResolved = resolveRightShadow();
+    }
+
+    private Drawable resolveLeftShadow() {
+        int layoutDirection = ViewCompat.getLayoutDirection(this);
+        // Prefer shadows defined with start/end gravity over left and right.
+        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+            if (mShadowStart != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowStart, layoutDirection);
+                return mShadowStart;
+            }
+        } else {
+            if (mShadowEnd != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowEnd, layoutDirection);
+                return mShadowEnd;
+            }
+        }
+        return mShadowLeft;
+    }
+
+    private Drawable resolveRightShadow() {
+        int layoutDirection = ViewCompat.getLayoutDirection(this);
+        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+            if (mShadowEnd != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowEnd, layoutDirection);
+                return mShadowEnd;
+            }
+        } else {
+            if (mShadowStart != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowStart, layoutDirection);
+                return mShadowStart;
+            }
+        }
+        return mShadowRight;
+    }
+
+    /**
+     * Change the layout direction of the given drawable.
+     * Return true if auto-mirror is supported and drawable's layout direction can be changed.
+     * Otherwise, return false.
+     */
+    private boolean mirror(Drawable drawable, int layoutDirection) {
+        if (drawable == null || !DrawableCompat.isAutoMirrored(drawable)) {
+            return false;
+        }
+
+        DrawableCompat.setLayoutDirection(drawable, layoutDirection);
+        return true;
+    }
+
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         mInLayout = true;
@@ -1048,6 +1177,10 @@
         invalidate();
     }
 
+    public void onRtlPropertiesChanged(int layoutDirection) {
+        resolveShadowDrawables();
+    }
+
     @Override
     public void onDraw(Canvas c) {
         super.onDraw(c);
@@ -1097,27 +1230,29 @@
             mScrimPaint.setColor(color);
 
             canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint);
-        } else if (mShadowLeft != null && checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
-            final int shadowWidth = mShadowLeft.getIntrinsicWidth();
+        } else if (mShadowLeftResolved != null
+                &&  checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
+            final int shadowWidth = mShadowLeftResolved.getIntrinsicWidth();
             final int childRight = child.getRight();
             final int drawerPeekDistance = mLeftDragger.getEdgeSize();
             final float alpha =
                     Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f));
-            mShadowLeft.setBounds(childRight, child.getTop(),
+            mShadowLeftResolved.setBounds(childRight, child.getTop(),
                     childRight + shadowWidth, child.getBottom());
-            mShadowLeft.setAlpha((int) (0xff * alpha));
-            mShadowLeft.draw(canvas);
-        } else if (mShadowRight != null && checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) {
-            final int shadowWidth = mShadowRight.getIntrinsicWidth();
+            mShadowLeftResolved.setAlpha((int) (0xff * alpha));
+            mShadowLeftResolved.draw(canvas);
+        } else if (mShadowRightResolved != null
+                &&  checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) {
+            final int shadowWidth = mShadowRightResolved.getIntrinsicWidth();
             final int childLeft = child.getLeft();
             final int showing = getWidth() - childLeft;
             final int drawerPeekDistance = mRightDragger.getEdgeSize();
             final float alpha =
                     Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f));
-            mShadowRight.setBounds(childLeft - shadowWidth, child.getTop(),
+            mShadowRightResolved.setBounds(childLeft - shadowWidth, child.getTop(),
                     childLeft, child.getBottom());
-            mShadowRight.setAlpha((int) (0xff * alpha));
-            mShadowRight.draw(canvas);
+            mShadowRightResolved.setAlpha((int) (0xff * alpha));
+            mShadowRightResolved.draw(canvas);
         }
         return result;
     }
diff --git a/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java b/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
index b827b1f..091d5a4 100644
--- a/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
+++ b/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
@@ -18,8 +18,13 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
 import android.graphics.Matrix;
+import android.graphics.Paint;
 import android.graphics.RectF;
 import android.graphics.pdf.PdfDocument.Page;
 import android.net.Uri;
@@ -208,16 +213,20 @@
                                         WriteResultCallback writeResultCallback) {
                         PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mContext,
                                 mAttributes);
+
+                        Bitmap maybeGrayscale = convertBitmapForColorMode(bitmap,
+                                mAttributes.getColorMode());
                         try {
                             Page page = pdfDocument.startPage(1);
 
                             RectF content = new RectF(page.getInfo().getContentRect());
 
-                            Matrix matrix = getMatrix(bitmap.getWidth(), bitmap.getHeight(),
+                            Matrix matrix = getMatrix(
+                                    maybeGrayscale.getWidth(), maybeGrayscale.getHeight(),
                                     content, fittingMode);
 
                             // Draw the bitmap.
-                            page.getCanvas().drawBitmap(bitmap, matrix, null);
+                            page.getCanvas().drawBitmap(maybeGrayscale, matrix, null);
 
                             // Finish the page.
                             pdfDocument.finishPage(page);
@@ -245,6 +254,10 @@
                                     /* ignore */
                                 }
                             }
+                            // If we created a new instance for grayscaling, then recycle it here.
+                            if (maybeGrayscale != bitmap) {
+                                maybeGrayscale.recycle();
+                            }
                         }
                     }
 
@@ -401,6 +414,10 @@
                 if (callback != null) {
                     callback.onFinish();
                 }
+                if (mBitmap != null) {
+                    mBitmap.recycle();
+                    mBitmap = null;
+                }
             }
 
             @Override
@@ -409,6 +426,8 @@
                                 WriteResultCallback writeResultCallback) {
                 PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mContext,
                         mAttributes);
+                Bitmap maybeGrayscale = convertBitmapForColorMode(mBitmap,
+                        mAttributes.getColorMode());
                 try {
 
                     Page page = pdfDocument.startPage(1);
@@ -419,7 +438,7 @@
                             content, fittingMode);
 
                     // Draw the bitmap.
-                    page.getCanvas().drawBitmap(mBitmap, matrix, null);
+                    page.getCanvas().drawBitmap(maybeGrayscale, matrix, null);
 
                     // Finish the page.
                     pdfDocument.finishPage(page);
@@ -447,6 +466,10 @@
                             /* ignore */
                         }
                     }
+                    // If we created a new instance for grayscaling, then recycle it here.
+                    if (maybeGrayscale != mBitmap) {
+                        maybeGrayscale.recycle();
+                    }
                 }
             }
         };
@@ -541,4 +564,23 @@
             }
         }
     }
+
+    private Bitmap convertBitmapForColorMode(Bitmap original, int colorMode) {
+        if (colorMode != COLOR_MODE_MONOCHROME) {
+            return original;
+        }
+        // Create a grayscale bitmap
+        Bitmap grayscale = Bitmap.createBitmap(original.getWidth(), original.getHeight(),
+                Config.ARGB_8888);
+        Canvas c = new Canvas(grayscale);
+        Paint p = new Paint();
+        ColorMatrix cm = new ColorMatrix();
+        cm.setSaturation(0);
+        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
+        p.setColorFilter(f);
+        c.drawBitmap(original, 0, 0, p);
+        c.setBitmap(null);
+
+        return grayscale;
+    }
 }
\ No newline at end of file
diff --git a/v7/appcompat/api/current.txt b/v7/appcompat/api/current.txt
index 2d5553b..b26b4e8 100644
--- a/v7/appcompat/api/current.txt
+++ b/v7/appcompat/api/current.txt
@@ -416,7 +416,6 @@
     field public static int defaultQueryHint;
     field public static int dialogPreferredPadding;
     field public static int dialogTheme;
-    field public static int disableChildrenWhenDisabled;
     field public static int displayOptions;
     field public static int divider;
     field public static int dividerHorizontal;
@@ -470,13 +469,11 @@
     field public static int panelMenuListTheme;
     field public static int panelMenuListWidth;
     field public static int popupMenuStyle;
-    field public static int popupPromptView;
     field public static int popupTheme;
     field public static int popupWindowStyle;
     field public static int preserveIconSpacing;
     field public static int progressBarPadding;
     field public static int progressBarStyle;
-    field public static int prompt;
     field public static int queryBackground;
     field public static int queryHint;
     field public static int radioButtonStyle;
@@ -492,7 +489,6 @@
     field public static int singleChoiceItemLayout;
     field public static int spinBars;
     field public static int spinnerDropDownItemStyle;
-    field public static int spinnerMode;
     field public static int spinnerStyle;
     field public static int splitTrack;
     field public static int state_above_anchor;
@@ -805,9 +801,7 @@
     field public static int customPanel;
     field public static int decor_content_parent;
     field public static int default_activity_button;
-    field public static int dialog;
     field public static int disableHome;
-    field public static int dropdown;
     field public static int edit_query;
     field public static int end;
     field public static int end_padder;
@@ -905,7 +899,6 @@
     field public static int abc_search_dropdown_item_icons_2line;
     field public static int abc_search_view;
     field public static int abc_select_dialog_material;
-    field public static int abc_simple_dropdown_hint;
     field public static int notification_media_action;
     field public static int notification_media_cancel_action;
     field public static int notification_template_big_media;
@@ -1025,6 +1018,8 @@
     field public static int Base_V21_Theme_AppCompat_Dialog;
     field public static int Base_V21_Theme_AppCompat_Light;
     field public static int Base_V21_Theme_AppCompat_Light_Dialog;
+    field public static int Base_V22_Theme_AppCompat;
+    field public static int Base_V22_Theme_AppCompat_Light;
     field public static int Base_V23_Theme_AppCompat;
     field public static int Base_V23_Theme_AppCompat_Light;
     field public static int Base_V7_Theme_AppCompat;
@@ -1080,19 +1075,20 @@
     field public static int Base_Widget_AppCompat_SearchView;
     field public static int Base_Widget_AppCompat_SearchView_ActionBar;
     field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_DropDown_ActionBar;
     field public static int Base_Widget_AppCompat_Spinner_Underlined;
     field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
     field public static int Base_Widget_AppCompat_Toolbar;
     field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
     field public static int Platform_AppCompat;
     field public static int Platform_AppCompat_Light;
+    field public static int Platform_ThemeOverlay_AppCompat;
     field public static int Platform_ThemeOverlay_AppCompat_Dark;
     field public static int Platform_ThemeOverlay_AppCompat_Light;
     field public static int Platform_V11_AppCompat;
     field public static int Platform_V11_AppCompat_Light;
     field public static int Platform_V14_AppCompat;
     field public static int Platform_V14_AppCompat_Light;
+    field public static int Platform_Widget_AppCompat_Spinner;
     field public static int RtlOverlay_DialogWindowTitle_AppCompat;
     field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
     field public static int RtlOverlay_Widget_AppCompat_ActionButton_Overflow;
@@ -1397,17 +1393,10 @@
     field public static int SearchView_suggestionRowLayout;
     field public static int SearchView_voiceIcon;
     field public static final int[] Spinner;
-    field public static int Spinner_android_background;
-    field public static int Spinner_android_dropDownHorizontalOffset;
-    field public static int Spinner_android_dropDownSelector;
-    field public static int Spinner_android_dropDownVerticalOffset;
     field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_gravity;
     field public static int Spinner_android_popupBackground;
-    field public static int Spinner_disableChildrenWhenDisabled;
-    field public static int Spinner_popupPromptView;
-    field public static int Spinner_prompt;
-    field public static int Spinner_spinnerMode;
+    field public static int Spinner_android_prompt;
+    field public static int Spinner_popupTheme;
     field public static final int[] SwitchCompat;
     field public static int SwitchCompat_android_textOff;
     field public static int SwitchCompat_android_textOn;
@@ -1720,8 +1709,11 @@
 
   public class AppCompatSpinner extends android.widget.Spinner {
     ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
     ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
     ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
   }
 
   public class AppCompatTextView extends android.widget.TextView {
@@ -1949,6 +1941,11 @@
     method public void setTrackResource(int);
   }
 
+  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
+    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
+    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
+  }
+
   public class Toolbar extends android.view.ViewGroup {
     ctor public Toolbar(android.content.Context);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet);
diff --git a/v7/appcompat/res-public/values/public_attrs.xml b/v7/appcompat/res-public/values/public_attrs.xml
index 0f03c4a..3db510d 100644
--- a/v7/appcompat/res-public/values/public_attrs.xml
+++ b/v7/appcompat/res-public/values/public_attrs.xml
@@ -124,6 +124,7 @@
      <public type="attr" name="listPreferredItemPaddingLeft"/>
      <public type="attr" name="listPreferredItemPaddingRight"/>
      <public type="attr" name="logo"/>
+     <public type="attr" name="logoDescription"/>
      <public type="attr" name="measureWithLargestChild"/>
      <public type="attr" name="middleBarArrowSize"/>
      <public type="attr" name="navigationContentDescription"/>
@@ -160,6 +161,7 @@
      <public type="attr" name="submitBackground"/>
      <public type="attr" name="subtitle"/>
      <public type="attr" name="subtitleTextAppearance"/>
+     <public type="attr" name="subtitleTextColor"/>
      <public type="attr" name="subtitleTextStyle"/>
      <public type="attr" name="suggestionRowLayout"/>
      <public type="attr" name="switchMinWidth"/>
@@ -184,6 +186,7 @@
      <public type="attr" name="titleMarginStart"/>
      <public type="attr" name="titleMarginTop"/>
      <public type="attr" name="titleTextAppearance"/>
+     <public type="attr" name="titleTextColor"/>
      <public type="attr" name="titleTextStyle"/>
      <public type="attr" name="toolbarNavigationButtonStyle"/>
      <public type="attr" name="toolbarStyle"/>
diff --git a/v7/appcompat/res-public/values/public_styles.xml b/v7/appcompat/res-public/values/public_styles.xml
index 424241b..2c04266 100644
--- a/v7/appcompat/res-public/values/public_styles.xml
+++ b/v7/appcompat/res-public/values/public_styles.xml
@@ -53,16 +53,14 @@
     <public type="style" name="TextAppearance.AppCompat.Widget.ActionMode.Subtitle.Inverse"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.ActionMode.Title"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.ActionMode.Title.Inverse"/>
+    <public type="style" name="TextAppearance.AppCompat.Widget.Button"/>
+    <public type="style" name="TextAppearance.AppCompat.Widget.Button.Inverse"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.DropDownItem"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.PopupMenu.Large"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.PopupMenu.Small"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.Switch"/>
     <public type="style" name="TextAppearance.AppCompat.Widget.TextView.SpinnerItem"/>
     <public type="style" name="Theme.AppCompat"/>
-    <public type="style" name="Theme.AppCompat.Dialog"/>
-    <public type="style" name="Theme.AppCompat.Dialog.Alert"/>
-    <public type="style" name="Theme.AppCompat.Dialog.MinWidth"/>
-    <public type="style" name="Theme.AppCompat.DialogWhenLarge"/>
     <public type="style" name="Theme.AppCompat.DayNight"/>
     <public type="style" name="Theme.AppCompat.DayNight.DarkActionBar"/>
     <public type="style" name="Theme.AppCompat.DayNight.Dialog"/>
@@ -70,6 +68,10 @@
     <public type="style" name="Theme.AppCompat.DayNight.Dialog.MinWidth"/>
     <public type="style" name="Theme.AppCompat.DayNight.DialogWhenLarge"/>
     <public type="style" name="Theme.AppCompat.DayNight.NoActionBar"/>
+    <public type="style" name="Theme.AppCompat.Dialog"/>
+    <public type="style" name="Theme.AppCompat.Dialog.Alert"/>
+    <public type="style" name="Theme.AppCompat.Dialog.MinWidth"/>
+    <public type="style" name="Theme.AppCompat.DialogWhenLarge"/>
     <public type="style" name="Theme.AppCompat.Light"/>
     <public type="style" name="Theme.AppCompat.Light.DarkActionBar"/>
     <public type="style" name="Theme.AppCompat.Light.Dialog"/>
diff --git a/v7/appcompat/res/layout/abc_simple_dropdown_hint.xml b/v7/appcompat/res/layout/abc_simple_dropdown_hint.xml
deleted file mode 100644
index 8326b5c..0000000
--- a/v7/appcompat/res/layout/abc_simple_dropdown_hint.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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.
--->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-          android:id="@android:id/text1"
-          android:textAppearance="?android:attr/dropDownHintAppearance"
-          android:singleLine="true"
-          android:layout_margin="3dip"
-          android:layout_width="match_parent"
-          android:layout_height="wrap_content" />
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v11/styles_base.xml b/v7/appcompat/res/values-v11/styles_base.xml
index 0bbf7e3..f651320 100644
--- a/v7/appcompat/res/values-v11/styles_base.xml
+++ b/v7/appcompat/res/values-v11/styles_base.xml
@@ -21,11 +21,7 @@
      variants are for direct use or use as parent styles by the app. -->
     <eat-comment/>
 
-    <style name="Base.Widget.AppCompat.Spinner" parent="android:Widget.Holo.Spinner">
-        <item name="android:background">@drawable/abc_spinner_mtrl_am_alpha</item>
-        <item name="android:dropDownSelector">?attr/listChoiceBackgroundIndicator</item>
-        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
-    </style>
+    <style name="Platform.Widget.AppCompat.Spinner" parent="android:Widget.Holo.Spinner" />
 
     <!-- Progress Bar -->
 
diff --git a/v7/appcompat/res/values-v21/styles_base.xml b/v7/appcompat/res/values-v21/styles_base.xml
index 241cb04..47681f2 100644
--- a/v7/appcompat/res/values-v21/styles_base.xml
+++ b/v7/appcompat/res/values-v21/styles_base.xml
@@ -115,12 +115,6 @@
 
     <style name="Base.Widget.AppCompat.Spinner.Underlined" parent="android:Widget.Material.Spinner.Underlined" />
 
-    <style name="Base.Widget.AppCompat.Spinner.DropDown.ActionBar" parent="android:Widget.Material.Spinner">
-        <item name="spinnerMode">dropdown</item>
-        <item name="disableChildrenWhenDisabled">true</item>
-        <item name="popupPromptView">@layout/abc_simple_dropdown_hint</item>
-    </style>
-
     <style name="Base.Widget.AppCompat.ListView" parent="android:Widget.Material.ListView" />
     <style name="Base.Widget.AppCompat.ListView.Menu" />
 
diff --git a/v7/appcompat/res/values-v21/themes_base.xml b/v7/appcompat/res/values-v21/themes_base.xml
index 4c45186..9d193d5 100644
--- a/v7/appcompat/res/values-v21/themes_base.xml
+++ b/v7/appcompat/res/values-v21/themes_base.xml
@@ -52,7 +52,6 @@
         <item name="actionMenuTextAppearance">?android:attr/actionMenuTextAppearance</item>
         <item name="actionModeBackground">?android:attr/actionModeBackground</item>
         <item name="actionModeCloseDrawable">?android:attr/actionModeCloseDrawable</item>
-        <item name="actionModeShareDrawable">?android:attr/actionModeShareDrawable</item>
         <item name="actionOverflowButtonStyle">?android:attr/actionOverflowButtonStyle</item>
         <item name="homeAsUpIndicator">?android:attr/homeAsUpIndicator</item>
 
@@ -102,7 +101,6 @@
         <item name="actionMenuTextAppearance">?android:attr/actionMenuTextAppearance</item>
         <item name="actionModeBackground">?android:attr/actionModeBackground</item>
         <item name="actionModeCloseDrawable">?android:attr/actionModeCloseDrawable</item>
-        <item name="actionModeShareDrawable">?android:attr/actionModeShareDrawable</item>
         <item name="actionOverflowButtonStyle">?android:attr/actionOverflowButtonStyle</item>
         <item name="homeAsUpIndicator">?android:attr/homeAsUpIndicator</item>
 
@@ -153,7 +151,7 @@
     <style name="Base.Theme.AppCompat.Dialog" parent="Base.V21.Theme.AppCompat.Dialog" />
     <style name="Base.Theme.AppCompat.Light.Dialog" parent="Base.V21.Theme.AppCompat.Light.Dialog" />
 
-    <style name="Platform.ThemeOverlay.AppCompat.Dark" parent="">
+    <style name="Platform.ThemeOverlay.AppCompat" parent="">
         <!-- Copy our color theme attributes to the framework -->
         <item name="android:colorPrimary">?attr/colorPrimary</item>
         <item name="android:colorPrimaryDark">?attr/colorPrimaryDark</item>
@@ -164,15 +162,8 @@
         <item name="android:colorButtonNormal">?attr/colorButtonNormal</item>
     </style>
 
-    <style name="Platform.ThemeOverlay.AppCompat.Light" parent="">
-        <!-- Copy our color theme attributes to the framework -->
-        <item name="android:colorPrimary">?attr/colorPrimary</item>
-        <item name="android:colorPrimaryDark">?attr/colorPrimaryDark</item>
-        <item name="android:colorAccent">?attr/colorAccent</item>
-        <item name="android:colorControlNormal">?attr/colorControlNormal</item>
-        <item name="android:colorControlActivated">?attr/colorControlActivated</item>
-        <item name="android:colorControlHighlight">?attr/colorControlHighlight</item>
-        <item name="android:colorButtonNormal">?attr/colorButtonNormal</item>
-    </style>
+    <style name="Platform.ThemeOverlay.AppCompat.Dark" />
+
+    <style name="Platform.ThemeOverlay.AppCompat.Light" />
 
 </resources>
diff --git a/v7/appcompat/res/values-v22/themes_base.xml b/v7/appcompat/res/values-v22/themes_base.xml
new file mode 100644
index 0000000..8a38724
--- /dev/null
+++ b/v7/appcompat/res/values-v22/themes_base.xml
@@ -0,0 +1,31 @@
+<?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="Base.Theme.AppCompat" parent="Base.V22.Theme.AppCompat" />
+    <style name="Base.Theme.AppCompat.Light" parent="Base.V22.Theme.AppCompat.Light" />
+
+    <style name="Base.V22.Theme.AppCompat" parent="Base.V21.Theme.AppCompat">
+        <item name="actionModeShareDrawable">?android:attr/actionModeShareDrawable</item>
+    </style>
+
+    <style name="Base.V22.Theme.AppCompat.Light" parent="Base.V21.Theme.AppCompat.Light">
+        <item name="actionModeShareDrawable">?android:attr/actionModeShareDrawable</item>
+    </style>
+
+</resources>
diff --git a/v7/appcompat/res/values-v23/themes_base.xml b/v7/appcompat/res/values-v23/themes_base.xml
index 5a0074f..becb1f2 100644
--- a/v7/appcompat/res/values-v23/themes_base.xml
+++ b/v7/appcompat/res/values-v23/themes_base.xml
@@ -20,14 +20,14 @@
     <style name="Base.Theme.AppCompat" parent="Base.V23.Theme.AppCompat" />
     <style name="Base.Theme.AppCompat.Light" parent="Base.V23.Theme.AppCompat.Light" />
 
-    <style name="Base.V23.Theme.AppCompat" parent="Base.V21.Theme.AppCompat">
+    <style name="Base.V23.Theme.AppCompat" parent="Base.V22.Theme.AppCompat">
         <!-- We can use the platform drawable on v23+ -->
         <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
 
         <item name="controlBackground">@drawable/abc_control_background_material</item>
     </style>
 
-    <style name="Base.V23.Theme.AppCompat.Light" parent="Base.V21.Theme.AppCompat.Light">
+    <style name="Base.V23.Theme.AppCompat.Light" parent="Base.V22.Theme.AppCompat.Light">
         <!-- We can use the platform drawable on v23+ -->
         <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
 
diff --git a/v7/appcompat/res/values/attrs.xml b/v7/appcompat/res/values/attrs.xml
index c727a2a..9b029d4 100644
--- a/v7/appcompat/res/values/attrs.xml
+++ b/v7/appcompat/res/values/attrs.xml
@@ -674,37 +674,13 @@
 
     <declare-styleable name="Spinner">
         <!-- The prompt to display when the spinner's dialog is shown. -->
-        <attr name="prompt" format="reference" />
-        <!-- Display mode for spinner options. -->
-        <attr name="spinnerMode" format="enum">
-            <!-- Spinner options will be presented to the user as a dialog window. -->
-            <enum name="dialog" value="0" />
-            <!-- Spinner options will be presented to the user as an inline dropdown
-                 anchored to the spinner widget itself. -->
-            <enum name="dropdown" value="1" />
-        </attr>
-        <!-- List selector to use for spinnerMode="dropdown" display. -->
-        <attr name="android:dropDownSelector" />
+        <attr name="android:prompt" />
+        <!-- Theme to use for the drop-down or dialog popup window. -->
+        <attr name="popupTheme" />
         <!-- Background drawable to use for the dropdown in spinnerMode="dropdown". -->
         <attr name="android:popupBackground" />
-        <!-- Vertical offset from the spinner widget for positioning the dropdown in
-             spinnerMode="dropdown". -->
-        <attr name="android:dropDownVerticalOffset" />
-        <!-- Horizontal offset from the spinner widget for positioning the dropdown
-             in spinnerMode="dropdown". -->
-        <attr name="android:dropDownHorizontalOffset" />
         <!-- Width of the dropdown in spinnerMode="dropdown". -->
         <attr name="android:dropDownWidth" />
-        <!-- Reference to a layout to use for displaying a prompt in the dropdown for
-             spinnerMode="dropdown". This layout must contain a TextView with the id
-             {@code @android:id/text1} to be populated with the prompt text. -->
-        <attr name="popupPromptView" format="reference" />
-        <!-- Gravity setting for positioning the currently selected item. -->
-        <attr name="android:gravity" />
-        <!-- Whether this spinner should mark child views as enabled/disabled when
-             the spinner itself is enabled/disabled. -->
-        <attr name="disableChildrenWhenDisabled" format="boolean" />
-        <attr name="android:background" />
     </declare-styleable>
 
     <declare-styleable name="SearchView">
diff --git a/v7/appcompat/res/values/styles.xml b/v7/appcompat/res/values/styles.xml
index 1b74fc2..7585d05 100644
--- a/v7/appcompat/res/values/styles.xml
+++ b/v7/appcompat/res/values/styles.xml
@@ -121,7 +121,7 @@
 
     <style name="Widget.AppCompat.Spinner.DropDown" />
 
-    <style name="Widget.AppCompat.Spinner.DropDown.ActionBar" parent="Base.Widget.AppCompat.Spinner.DropDown.ActionBar" />
+    <style name="Widget.AppCompat.Spinner.DropDown.ActionBar" />
 
     <!-- This style has an extra indirection to properly set RTL attributes. See styles_rtl.xml -->
     <style name="Widget.AppCompat.DropDownItem.Spinner" parent="RtlOverlay.Widget.AppCompat.Search.DropDown.Text" />
diff --git a/v7/appcompat/res/values/styles_base.xml b/v7/appcompat/res/values/styles_base.xml
index 91f51c9..c1cfce1 100644
--- a/v7/appcompat/res/values/styles_base.xml
+++ b/v7/appcompat/res/values/styles_base.xml
@@ -178,32 +178,24 @@
 
     <!-- Spinner Widgets -->
 
-    <style name="Base.Widget.AppCompat.Spinner" parent="android:Widget.Spinner">
+    <style name="Platform.Widget.AppCompat.Spinner" parent="android:Widget.Spinner" />
+
+    <style name="Base.Widget.AppCompat.Spinner" parent="Platform.Widget.AppCompat.Spinner">
         <item name="android:background">@drawable/abc_spinner_mtrl_am_alpha</item>
+        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
         <item name="android:dropDownSelector">?attr/listChoiceBackgroundIndicator</item>
         <item name="android:dropDownVerticalOffset">0dip</item>
+        <item name="android:dropDownHorizontalOffset">0dip</item>
+        <item name="android:dropDownWidth">wrap_content</item>
+        <item name="android:clickable">true</item>
+        <item name="android:gravity">left|start|center_vertical</item>
+        <item name="overlapAnchor">true</item>
     </style>
 
     <style name="Base.Widget.AppCompat.Spinner.Underlined">
         <item name="android:background">@drawable/abc_spinner_textfield_background_material</item>
     </style>
 
-    <style name="Base.Widget.AppCompat.Spinner.DropDown.ActionBar" parent="android:Widget">
-        <item name="spinnerMode">dropdown</item>
-
-        <item name="android:clickable">true</item>
-        <item name="android:background">@drawable/abc_spinner_mtrl_am_alpha</item>
-        <item name="android:dropDownSelector">?attr/listChoiceBackgroundIndicator</item>
-        <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item>
-        <item name="android:dropDownVerticalOffset">0dip</item>
-        <item name="android:dropDownHorizontalOffset">0dip</item>
-        <item name="overlapAnchor">true</item>
-        <item name="android:dropDownWidth">wrap_content</item>
-        <item name="popupPromptView">@layout/abc_simple_dropdown_hint</item>
-        <item name="android:gravity">left|start|center_vertical</item>
-        <item name="disableChildrenWhenDisabled">true</item>
-    </style>
-
     <style name="Base.Widget.AppCompat.DropDownItem.Spinner" parent="">
         <item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.DropDownItem</item>
         <item name="android:paddingLeft">8dp</item>
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index d488025..9e9a4ab 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -521,9 +521,11 @@
     <style name="Base.Theme.AppCompat.Light.DialogWhenLarge" parent="Theme.AppCompat.Light" />
 
     <!-- Overlay themes -->
-    <style name="Base.ThemeOverlay.AppCompat" parent="" />
+    <style name="Platform.ThemeOverlay.AppCompat" parent="" />
 
-    <style name="Platform.ThemeOverlay.AppCompat.Dark" parent="">
+    <style name="Base.ThemeOverlay.AppCompat" parent="Platform.ThemeOverlay.AppCompat" />
+
+    <style name="Platform.ThemeOverlay.AppCompat.Dark">
         <!-- Action Bar styles -->
         <item name="actionBarItemBackground">@drawable/abc_item_background_holo_dark</item>
         <item name="actionDropDownStyle">@style/Widget.AppCompat.Spinner.DropDown.ActionBar</item>
@@ -534,7 +536,7 @@
         <item name="android:dropDownItemStyle">@style/Widget.AppCompat.DropDownItem.Spinner</item>
     </style>
 
-    <style name="Platform.ThemeOverlay.AppCompat.Light" parent="">
+    <style name="Platform.ThemeOverlay.AppCompat.Light">
         <item name="actionBarItemBackground">@drawable/abc_item_background_holo_light</item>
         <item name="actionDropDownStyle">@style/Widget.AppCompat.Light.Spinner.DropDown.ActionBar</item>
         <item name="selectableItemBackground">@drawable/abc_item_background_holo_light</item>
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
index 562086e..1c5f98e 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
@@ -42,7 +42,7 @@
     final AppCompatCallback mAppCompatCallback;
 
     ActionBar mActionBar;
-    private MenuInflater mMenuInflater;
+    MenuInflater mMenuInflater;
 
     // true if this activity has an action bar.
     boolean mHasActionBar;
@@ -92,14 +92,13 @@
         return mActionBar;
     }
 
-    final void setSupportActionBar(ActionBar actionBar) {
-        mActionBar = actionBar;
-    }
-
     @Override
     public MenuInflater getMenuInflater() {
+        // Make sure that action views can get an appropriate theme.
         if (mMenuInflater == null) {
-            mMenuInflater = new SupportMenuInflater(getActionBarThemedContext());
+            initWindowDecorActionBar();
+            mMenuInflater = new SupportMenuInflater(
+                    mActionBar != null ? mActionBar.getThemedContext() : mContext);
         }
         return mMenuInflater;
     }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
index 681e6d7..cea89c7 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
@@ -200,10 +200,12 @@
                     "by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set " +
                     "windowActionBar to false in your theme to use a Toolbar instead.");
         }
+        // Clear out the MenuInflater to make sure that it is valid for the new Action Bar
+        mMenuInflater = null;
 
         ToolbarActionBar tbab = new ToolbarActionBar(toolbar, ((Activity) mContext).getTitle(),
                 mAppCompatWindowCallback);
-        setSupportActionBar(tbab);
+        mActionBar = tbab;
         mWindow.setCallback(tbab.getWrappedWindowCallback());
         tbab.invalidateOptionsMenu();
     }
@@ -367,7 +369,13 @@
 
             if (mSubDecor == null) {
                 throw new IllegalArgumentException(
-                        "AppCompat does not support the current theme features");
+                        "AppCompat does not support the current theme features: { "
+                                + "windowActionBar: " + mHasActionBar
+                                + ", windowActionBarOverlay: "+ mOverlayActionBar
+                                + ", android:windowIsFloating: " + mIsFloating
+                                + ", windowActionModeOverlay: " + mOverlayActionMode
+                                + ", windowNoTitle: " + mWindowNoTitle
+                                + " }");
             }
 
             if (mDecorContentParent == null) {
diff --git a/v7/appcompat/src/android/support/v7/app/TwilightManager.java b/v7/appcompat/src/android/support/v7/app/TwilightManager.java
index 5872330..b17d578 100644
--- a/v7/appcompat/src/android/support/v7/app/TwilightManager.java
+++ b/v7/appcompat/src/android/support/v7/app/TwilightManager.java
@@ -16,10 +16,12 @@
 
 package android.support.v7.app;
 
+import android.Manifest;
 import android.content.Context;
 import android.location.Location;
 import android.location.LocationManager;
 import android.support.annotation.NonNull;
+import android.support.v4.content.PermissionChecker;
 import android.text.format.DateUtils;
 import android.util.Log;
 
@@ -77,8 +79,20 @@
     }
 
     private Location getLastKnownLocation() {
-        Location coarseLocation = getLastKnownLocationForProvider(LocationManager.NETWORK_PROVIDER);
-        Location fineLocation = getLastKnownLocationForProvider(LocationManager.GPS_PROVIDER);
+        Location coarseLocation = null;
+        Location fineLocation = null;
+
+        int permission = PermissionChecker.checkSelfPermission(mContext,
+                Manifest.permission.ACCESS_FINE_LOCATION);
+        if (permission == PermissionChecker.PERMISSION_GRANTED) {
+            coarseLocation = getLastKnownLocationForProvider(LocationManager.NETWORK_PROVIDER);
+        }
+
+        permission = PermissionChecker.checkSelfPermission(mContext,
+                Manifest.permission.ACCESS_COARSE_LOCATION);
+        if (permission == PermissionChecker.PERMISSION_GRANTED) {
+            fineLocation = getLastKnownLocationForProvider(LocationManager.GPS_PROVIDER);
+        }
 
         if (coarseLocation != null && fineLocation != null) {
             // If we have both a fine and coarse location, use the latest
diff --git a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java b/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
index 439b3fb..a9e23de 100644
--- a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
+++ b/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
@@ -208,12 +208,16 @@
 
     @Override
     public void setAlpha(int alpha) {
-        mPaint.setAlpha(alpha);
+        if (alpha != mPaint.getAlpha()) {
+            mPaint.setAlpha(alpha);
+            invalidateSelf();
+        }
     }
 
     @Override
     public void setColorFilter(ColorFilter colorFilter) {
         mPaint.setColorFilter(colorFilter);
+        invalidateSelf();
     }
 
     @Override
@@ -247,8 +251,10 @@
      * position.</p>
      */
     public void setProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {
-        mProgress = progress;
-        invalidateSelf();
+        if (mProgress != progress) {
+            mProgress = progress;
+            invalidateSelf();
+        }
     }
 
     /**
diff --git a/v7/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java b/v7/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java
index 189260a..41e684a 100644
--- a/v7/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java
+++ b/v7/appcompat/src/android/support/v7/internal/app/NavItemSelectedListener.java
@@ -18,8 +18,8 @@
 package android.support.v7.internal.app;
 
 import android.support.v7.app.ActionBar;
-import android.support.v7.internal.widget.AdapterViewCompat;
 import android.view.View;
+import android.widget.AdapterView;
 
 /**
  * Wrapper to adapt the ActionBar.OnNavigationListener in an AdapterView.OnItemSelectedListener
@@ -27,7 +27,7 @@
  *
  * @hide
  */
-class NavItemSelectedListener implements AdapterViewCompat.OnItemSelectedListener {
+class NavItemSelectedListener implements AdapterView.OnItemSelectedListener {
     private final ActionBar.OnNavigationListener mListener;
 
     public NavItemSelectedListener(ActionBar.OnNavigationListener listener) {
@@ -35,14 +35,14 @@
     }
 
     @Override
-    public void onItemSelected(AdapterViewCompat<?> parent, View view, int position, long id) {
+    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
         if (mListener != null) {
             mListener.onNavigationItemSelected(position, id);
         }
     }
 
     @Override
-    public void onNothingSelected(AdapterViewCompat<?> parent) {
+    public void onNothingSelected(AdapterView<?> parent) {
         // Do nothing
     }
 }
\ No newline at end of file
diff --git a/v7/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java b/v7/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java
index e414203..d8932ee 100644
--- a/v7/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java
+++ b/v7/appcompat/src/android/support/v7/internal/view/ContextThemeWrapper.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.res.Resources;
+import android.support.annotation.StyleRes;
 import android.support.v7.appcompat.R;
 import android.view.LayoutInflater;
 
@@ -33,15 +34,22 @@
     private Resources.Theme mTheme;
     private LayoutInflater mInflater;
 
-    public ContextThemeWrapper(Context base, int themeres) {
+    public ContextThemeWrapper(Context base, @StyleRes int themeResId) {
         super(base);
-        mThemeResource = themeres;
+        mThemeResource = themeResId;
+    }
+
+    public ContextThemeWrapper(Context base, Resources.Theme theme) {
+        super(base);
+        mTheme = theme;
     }
 
     @Override
     public void setTheme(int resid) {
-        mThemeResource = resid;
-        initializeTheme();
+        if (mThemeResource != resid) {
+            mThemeResource = resid;
+            initializeTheme();
+        }
     }
 
     public int getThemeResId() {
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java b/v7/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java
deleted file mode 100644
index 0ec8e7a..0000000
--- a/v7/appcompat/src/android/support/v7/internal/widget/AbsSpinnerCompat.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2006 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 android.support.v7.internal.widget;
-
-import android.content.Context;
-import android.database.DataSetObserver;
-import android.graphics.Rect;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.SpinnerAdapter;
-
-/**
- * An abstract base class for spinner widgets. SDK users will probably not
- * need to use this class.
- */
-abstract class AbsSpinnerCompat extends AdapterViewCompat<SpinnerAdapter> {
-    SpinnerAdapter mAdapter;
-
-    int mHeightMeasureSpec;
-    int mWidthMeasureSpec;
-
-    int mSelectionLeftPadding = 0;
-    int mSelectionTopPadding = 0;
-    int mSelectionRightPadding = 0;
-    int mSelectionBottomPadding = 0;
-    final Rect mSpinnerPadding = new Rect();
-
-    final RecycleBin mRecycler = new RecycleBin();
-    private DataSetObserver mDataSetObserver;
-
-    /** Temporary frame to hold a child View's frame rectangle */
-    private Rect mTouchFrame;
-
-    AbsSpinnerCompat(Context context) {
-        super(context);
-        initAbsSpinner();
-    }
-
-    AbsSpinnerCompat(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    AbsSpinnerCompat(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        initAbsSpinner();
-    }
-
-    /**
-     * Common code for different constructor flavors
-     */
-    private void initAbsSpinner() {
-        setFocusable(true);
-        setWillNotDraw(false);
-    }
-
-    /**
-     * The Adapter is used to provide the data which backs this Spinner.
-     * It also provides methods to transform spinner items based on their position
-     * relative to the selected item.
-     * @param adapter The SpinnerAdapter to use for this Spinner
-     */
-    @Override
-    public void setAdapter(SpinnerAdapter adapter) {
-        if (null != mAdapter) {
-            mAdapter.unregisterDataSetObserver(mDataSetObserver);
-            resetList();
-        }
-
-        mAdapter = adapter;
-
-        mOldSelectedPosition = INVALID_POSITION;
-        mOldSelectedRowId = INVALID_ROW_ID;
-
-        if (mAdapter != null) {
-            mOldItemCount = mItemCount;
-            mItemCount = mAdapter.getCount();
-            checkFocus();
-
-            mDataSetObserver = new AdapterDataSetObserver();
-            mAdapter.registerDataSetObserver(mDataSetObserver);
-
-            int position = mItemCount > 0 ? 0 : INVALID_POSITION;
-
-            setSelectedPositionInt(position);
-            setNextSelectedPositionInt(position);
-
-            if (mItemCount == 0) {
-                // Nothing selected
-                checkSelectionChanged();
-            }
-
-        } else {
-            checkFocus();
-            resetList();
-            // Nothing selected
-            checkSelectionChanged();
-        }
-
-        requestLayout();
-    }
-
-    /**
-     * Clear out all children from the list
-     */
-    void resetList() {
-        mDataChanged = false;
-        mNeedSync = false;
-
-        removeAllViewsInLayout();
-        mOldSelectedPosition = INVALID_POSITION;
-        mOldSelectedRowId = INVALID_ROW_ID;
-
-        setSelectedPositionInt(INVALID_POSITION);
-        setNextSelectedPositionInt(INVALID_POSITION);
-        invalidate();
-    }
-
-    /**
-     * @see android.view.View#measure(int, int)
-     *
-     * Figure out the dimensions of this Spinner. The width comes from
-     * the widthMeasureSpec as Spinnners can't have their width set to
-     * UNSPECIFIED. The height is based on the height of the selected item
-     * plus padding.
-     */
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int widthSize;
-        int heightSize;
-
-        final int paddingLeft = getPaddingLeft();
-        final int paddingTop = getPaddingTop();
-        final int paddingRight = getPaddingRight();
-        final int paddingBottom = getPaddingBottom();
-
-        mSpinnerPadding.left = paddingLeft > mSelectionLeftPadding ? paddingLeft
-                : mSelectionLeftPadding;
-        mSpinnerPadding.top = paddingTop > mSelectionTopPadding ? paddingTop
-                : mSelectionTopPadding;
-        mSpinnerPadding.right = paddingRight > mSelectionRightPadding ? paddingRight
-                : mSelectionRightPadding;
-        mSpinnerPadding.bottom = paddingBottom > mSelectionBottomPadding ? paddingBottom
-                : mSelectionBottomPadding;
-
-        if (mDataChanged) {
-            handleDataChanged();
-        }
-
-        int preferredHeight = 0;
-        int preferredWidth = 0;
-        boolean needsMeasuring = true;
-
-        int selectedPosition = getSelectedItemPosition();
-        if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) {
-            // Try looking in the recycler. (Maybe we were measured once already)
-            View view = mRecycler.get(selectedPosition);
-            if (view == null) {
-                // Make a new one
-                view = mAdapter.getView(selectedPosition, null, this);
-            }
-
-            if (view != null) {
-                // Put in recycler for re-measuring and/or layout
-                mRecycler.put(selectedPosition, view);
-
-                if (view.getLayoutParams() == null) {
-                    mBlockLayoutRequests = true;
-                    view.setLayoutParams(generateDefaultLayoutParams());
-                    mBlockLayoutRequests = false;
-                }
-                measureChild(view, widthMeasureSpec, heightMeasureSpec);
-
-                preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom;
-                preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right;
-
-                needsMeasuring = false;
-            }
-        }
-
-        if (needsMeasuring) {
-            // No views -- just use padding
-            preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom;
-            if (widthMode == MeasureSpec.UNSPECIFIED) {
-                preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right;
-            }
-        }
-
-        preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight());
-        preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());
-
-        heightSize = ViewCompat.resolveSizeAndState(preferredHeight, heightMeasureSpec, 0);
-        widthSize = ViewCompat.resolveSizeAndState(preferredWidth, widthMeasureSpec, 0);
-
-        setMeasuredDimension(widthSize, heightSize);
-        mHeightMeasureSpec = heightMeasureSpec;
-        mWidthMeasureSpec = widthMeasureSpec;
-    }
-
-    int getChildHeight(View child) {
-        return child.getMeasuredHeight();
-    }
-
-    int getChildWidth(View child) {
-        return child.getMeasuredWidth();
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT);
-    }
-
-    void recycleAllViews() {
-        final int childCount = getChildCount();
-        final AbsSpinnerCompat.RecycleBin recycleBin = mRecycler;
-        final int position = mFirstPosition;
-
-        // All views go in recycler
-        for (int i = 0; i < childCount; i++) {
-            View v = getChildAt(i);
-            int index = position + i;
-            recycleBin.put(index, v);
-        }
-    }
-
-    /**
-     * Jump directly to a specific item in the adapter data.
-     */
-    public void setSelection(int position, boolean animate) {
-        // Animate only if requested position is already on screen somewhere
-        boolean shouldAnimate = animate && mFirstPosition <= position &&
-                position <= mFirstPosition + getChildCount() - 1;
-        setSelectionInt(position, shouldAnimate);
-    }
-
-    @Override
-    public void setSelection(int position) {
-        setNextSelectedPositionInt(position);
-        requestLayout();
-        invalidate();
-    }
-
-
-    /**
-     * Makes the item at the supplied position selected.
-     *
-     * @param position Position to select
-     * @param animate Should the transition be animated
-     *
-     */
-    void setSelectionInt(int position, boolean animate) {
-        if (position != mOldSelectedPosition) {
-            mBlockLayoutRequests = true;
-            int delta  = position - mSelectedPosition;
-            setNextSelectedPositionInt(position);
-            layout(delta, animate);
-            mBlockLayoutRequests = false;
-        }
-    }
-
-    abstract void layout(int delta, boolean animate);
-
-    @Override
-    public View getSelectedView() {
-        if (mItemCount > 0 && mSelectedPosition >= 0) {
-            return getChildAt(mSelectedPosition - mFirstPosition);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Override to prevent spamming ourselves with layout requests
-     * as we place views
-     *
-     * @see android.view.View#requestLayout()
-     */
-    @Override
-    public void requestLayout() {
-        if (!mBlockLayoutRequests) {
-            super.requestLayout();
-        }
-    }
-
-    @Override
-    public SpinnerAdapter getAdapter() {
-        return mAdapter;
-    }
-
-    @Override
-    public int getCount() {
-        return mItemCount;
-    }
-
-    /**
-     * Maps a point to a position in the list.
-     *
-     * @param x X in local coordinate
-     * @param y Y in local coordinate
-     * @return The position of the item which contains the specified point, or
-     *         {@link #INVALID_POSITION} if the point does not intersect an item.
-     */
-    public int pointToPosition(int x, int y) {
-        Rect frame = mTouchFrame;
-        if (frame == null) {
-            mTouchFrame = new Rect();
-            frame = mTouchFrame;
-        }
-
-        final int count = getChildCount();
-        for (int i = count - 1; i >= 0; i--) {
-            View child = getChildAt(i);
-            if (child.getVisibility() == View.VISIBLE) {
-                child.getHitRect(frame);
-                if (frame.contains(x, y)) {
-                    return mFirstPosition + i;
-                }
-            }
-        }
-        return INVALID_POSITION;
-    }
-
-    static class SavedState extends BaseSavedState {
-        long selectedId;
-        int position;
-
-        /**
-         * Constructor called from {@link AbsSpinnerCompat#onSaveInstanceState()}
-         */
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        /**
-         * Constructor called from {@link #CREATOR}
-         */
-        SavedState(Parcel in) {
-            super(in);
-            selectedId = in.readLong();
-            position = in.readInt();
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeLong(selectedId);
-            out.writeInt(position);
-        }
-
-        @Override
-        public String toString() {
-            return "AbsSpinner.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " selectedId=" + selectedId
-                    + " position=" + position + "}";
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = new Parcelable.Creator<SavedState>() {
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState ss = new SavedState(superState);
-        ss.selectedId = getSelectedItemId();
-        if (ss.selectedId >= 0) {
-            ss.position = getSelectedItemPosition();
-        } else {
-            ss.position = INVALID_POSITION;
-        }
-        return ss;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Parcelable state) {
-        SavedState ss = (SavedState) state;
-
-        super.onRestoreInstanceState(ss.getSuperState());
-
-        if (ss.selectedId >= 0) {
-            mDataChanged = true;
-            mNeedSync = true;
-            mSyncRowId = ss.selectedId;
-            mSyncPosition = ss.position;
-            mSyncMode = SYNC_SELECTED_POSITION;
-            requestLayout();
-        }
-    }
-
-    class RecycleBin {
-        private final SparseArray<View> mScrapHeap = new SparseArray<View>();
-
-        public void put(int position, View v) {
-            mScrapHeap.put(position, v);
-        }
-
-        View get(int position) {
-            // System.out.print("Looking for " + position);
-            View result = mScrapHeap.get(position);
-            if (result != null) {
-                // System.out.println(" HIT");
-                mScrapHeap.delete(position);
-            } else {
-                // System.out.println(" MISS");
-            }
-            return result;
-        }
-
-        void clear() {
-            final SparseArray<View> scrapHeap = mScrapHeap;
-            final int count = scrapHeap.size();
-            for (int i = 0; i < count; i++) {
-                final View view = scrapHeap.valueAt(i);
-                if (view != null) {
-                    removeDetachedView(view, true);
-                }
-            }
-            scrapHeap.clear();
-        }
-    }
-}
\ No newline at end of file
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java b/v7/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java
deleted file mode 100644
index bdce3c8..0000000
--- a/v7/appcompat/src/android/support/v7/internal/widget/AdapterViewCompat.java
+++ /dev/null
@@ -1,1150 +0,0 @@
-package android.support.v7.internal.widget;
-
-/*
- * Copyright (C) 2006 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.
- */
-
-import android.content.Context;
-import android.database.DataSetObserver;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.ViewDebug;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.Adapter;
-import android.widget.AdapterView;
-import android.widget.ListView;
-
-
-/**
- * An AdapterView is a view whose children are determined by an {@link android.widget.Adapter}.
- *
- * <p>
- * See {@link ListView}, {@link android.widget.GridView}, {@link android.widget.Spinner} and
- *      {@link android.widget.Gallery} for commonly used subclasses of AdapterView.
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about using AdapterView, read the
- * <a href="{@docRoot}guide/topics/ui/binding.html">Binding to Data with AdapterView</a>
- * developer guide.</p></div>
- *
- * @hide
- */
-public abstract class AdapterViewCompat<T extends Adapter> extends ViewGroup {
-
-    /**
-     * The item view type returned by {@link Adapter#getItemViewType(int)} when
-     * the adapter does not want the item's view recycled.
-     */
-    static final int ITEM_VIEW_TYPE_IGNORE = -1;
-
-    /**
-     * The item view type returned by {@link Adapter#getItemViewType(int)} when
-     * the item is a header or footer.
-     */
-    static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -2;
-
-    /**
-     * The position of the first child displayed
-     */
-    @ViewDebug.ExportedProperty(category = "scrolling")
-    int mFirstPosition = 0;
-
-    /**
-     * The offset in pixels from the top of the AdapterView to the top
-     * of the view to select during the next layout.
-     */
-    int mSpecificTop;
-
-    /**
-     * Position from which to start looking for mSyncRowId
-     */
-    int mSyncPosition;
-
-    /**
-     * Row id to look for when data has changed
-     */
-    long mSyncRowId = INVALID_ROW_ID;
-
-    /**
-     * Height of the view when mSyncPosition and mSyncRowId where set
-     */
-    long mSyncHeight;
-
-    /**
-     * True if we need to sync to mSyncRowId
-     */
-    boolean mNeedSync = false;
-
-    /**
-     * Indicates whether to sync based on the selection or position. Possible
-     * values are {@link #SYNC_SELECTED_POSITION} or
-     * {@link #SYNC_FIRST_POSITION}.
-     */
-    int mSyncMode;
-
-    /**
-     * Our height after the last layout
-     */
-    private int mLayoutHeight;
-
-    /**
-     * Sync based on the selected child
-     */
-    static final int SYNC_SELECTED_POSITION = 0;
-
-    /**
-     * Sync based on the first child displayed
-     */
-    static final int SYNC_FIRST_POSITION = 1;
-
-    /**
-     * Maximum amount of time to spend in {@link #findSyncPosition()}
-     */
-    static final int SYNC_MAX_DURATION_MILLIS = 100;
-
-    /**
-     * Indicates that this view is currently being laid out.
-     */
-    boolean mInLayout = false;
-
-    /**
-     * The listener that receives notifications when an item is selected.
-     */
-    OnItemSelectedListener mOnItemSelectedListener;
-
-    /**
-     * The listener that receives notifications when an item is clicked.
-     */
-    OnItemClickListener mOnItemClickListener;
-
-    /**
-     * The listener that receives notifications when an item is long clicked.
-     */
-    OnItemLongClickListener mOnItemLongClickListener;
-
-    /**
-     * True if the data has changed since the last layout
-     */
-    boolean mDataChanged;
-
-    /**
-     * The position within the adapter's data set of the item to select
-     * during the next layout.
-     */
-    @ViewDebug.ExportedProperty(category = "list")
-    int mNextSelectedPosition = INVALID_POSITION;
-
-    /**
-     * The item id of the item to select during the next layout.
-     */
-    long mNextSelectedRowId = INVALID_ROW_ID;
-
-    /**
-     * The position within the adapter's data set of the currently selected item.
-     */
-    @ViewDebug.ExportedProperty(category = "list")
-    int mSelectedPosition = INVALID_POSITION;
-
-    /**
-     * The item id of the currently selected item.
-     */
-    long mSelectedRowId = INVALID_ROW_ID;
-
-    /**
-     * View to show if there are no items to show.
-     */
-    private View mEmptyView;
-
-    /**
-     * The number of items in the current adapter.
-     */
-    @ViewDebug.ExportedProperty(category = "list")
-    int mItemCount;
-
-    /**
-     * The number of items in the adapter before a data changed event occurred.
-     */
-    int mOldItemCount;
-
-    /**
-     * Represents an invalid position. All valid positions are in the range 0 to 1 less than the
-     * number of items in the current adapter.
-     */
-    public static final int INVALID_POSITION = -1;
-
-    /**
-     * Represents an empty or invalid row id
-     */
-    public static final long INVALID_ROW_ID = Long.MIN_VALUE;
-
-    /**
-     * The last selected position we used when notifying
-     */
-    int mOldSelectedPosition = INVALID_POSITION;
-
-    /**
-     * The id of the last selected position we used when notifying
-     */
-    long mOldSelectedRowId = INVALID_ROW_ID;
-
-    /**
-     * Indicates what focusable state is requested when calling setFocusable().
-     * In addition to this, this view has other criteria for actually
-     * determining the focusable state (such as whether its empty or the text
-     * filter is shown).
-     *
-     * @see #setFocusable(boolean)
-     * @see #checkFocus()
-     */
-    private boolean mDesiredFocusableState;
-    private boolean mDesiredFocusableInTouchModeState;
-
-    private SelectionNotifier mSelectionNotifier;
-    /**
-     * When set to true, calls to requestLayout() will not propagate up the parent hierarchy.
-     * This is used to layout the children during a layout pass.
-     */
-    boolean mBlockLayoutRequests = false;
-
-    AdapterViewCompat(Context context) {
-        super(context);
-    }
-
-    AdapterViewCompat(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    AdapterViewCompat(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    /**
-     * Interface definition for a callback to be invoked when an item in this
-     * AdapterView has been clicked.
-     */
-    public interface OnItemClickListener {
-
-        /**
-         * Callback method to be invoked when an item in this AdapterView has
-         * been clicked.
-         * <p>
-         * Implementers can call getItemAtPosition(position) if they need
-         * to access the data associated with the selected item.
-         *
-         * @param parent The AdapterView where the click happened.
-         * @param view The view within the AdapterView that was clicked (this
-         *            will be a view provided by the adapter)
-         * @param position The position of the view in the adapter.
-         * @param id The row id of the item that was clicked.
-         */
-        void onItemClick(AdapterViewCompat<?> parent, View view, int position, long id);
-    }
-
-    class OnItemClickListenerWrapper implements AdapterView.OnItemClickListener {
-
-        private final OnItemClickListener mWrappedListener;
-
-        public OnItemClickListenerWrapper(OnItemClickListener listener) {
-            mWrappedListener = listener;
-        }
-
-        @Override
-        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            mWrappedListener.onItemClick(AdapterViewCompat.this, view, position, id);
-        }
-    }
-
-    /**
-     * Register a callback to be invoked when an item in this AdapterView has
-     * been clicked.
-     *
-     * @param listener The callback that will be invoked.
-     */
-    public void setOnItemClickListener(OnItemClickListener listener) {
-        mOnItemClickListener = listener;
-    }
-
-    /**
-     * @return The callback to be invoked with an item in this AdapterView has
-     *         been clicked, or null id no callback has been set.
-     */
-    public final OnItemClickListener getOnItemClickListener() {
-        return mOnItemClickListener;
-    }
-
-    /**
-     * Call the OnItemClickListener, if it is defined.
-     *
-     * @param view The view within the AdapterView that was clicked.
-     * @param position The position of the view in the adapter.
-     * @param id The row id of the item that was clicked.
-     * @return True if there was an assigned OnItemClickListener that was
-     *         called, false otherwise is returned.
-     */
-    public boolean performItemClick(View view, int position, long id) {
-        if (mOnItemClickListener != null) {
-            playSoundEffect(SoundEffectConstants.CLICK);
-            if (view != null) {
-                view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
-            }
-            mOnItemClickListener.onItemClick(this, view, position, id);
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Interface definition for a callback to be invoked when an item in this
-     * view has been clicked and held.
-     */
-    public interface OnItemLongClickListener {
-        /**
-         * Callback method to be invoked when an item in this view has been
-         * clicked and held.
-         *
-         * Implementers can call getItemAtPosition(position) if they need to access
-         * the data associated with the selected item.
-         *
-         * @param parent The AbsListView where the click happened
-         * @param view The view within the AbsListView that was clicked
-         * @param position The position of the view in the list
-         * @param id The row id of the item that was clicked
-         *
-         * @return true if the callback consumed the long click, false otherwise
-         */
-        boolean onItemLongClick(AdapterViewCompat<?> parent, View view, int position, long id);
-    }
-
-
-    /**
-     * Register a callback to be invoked when an item in this AdapterView has
-     * been clicked and held
-     *
-     * @param listener The callback that will run
-     */
-    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
-        if (!isLongClickable()) {
-            setLongClickable(true);
-        }
-        mOnItemLongClickListener = listener;
-    }
-
-    /**
-     * @return The callback to be invoked with an item in this AdapterView has
-     *         been clicked and held, or null id no callback as been set.
-     */
-    public final OnItemLongClickListener getOnItemLongClickListener() {
-        return mOnItemLongClickListener;
-    }
-
-    /**
-     * Interface definition for a callback to be invoked when
-     * an item in this view has been selected.
-     */
-    public interface OnItemSelectedListener {
-        /**
-         * <p>Callback method to be invoked when an item in this view has been
-         * selected. This callback is invoked only when the newly selected
-         * position is different from the previously selected position or if
-         * there was no selected item.</p>
-         *
-         * Impelmenters can call getItemAtPosition(position) if they need to access the
-         * data associated with the selected item.
-         *
-         * @param parent The AdapterView where the selection happened
-         * @param view The view within the AdapterView that was clicked
-         * @param position The position of the view in the adapter
-         * @param id The row id of the item that is selected
-         */
-        void onItemSelected(AdapterViewCompat<?> parent, View view, int position, long id);
-
-        /**
-         * Callback method to be invoked when the selection disappears from this
-         * view. The selection can disappear for instance when touch is activated
-         * or when the adapter becomes empty.
-         *
-         * @param parent The AdapterView that now contains no selected item.
-         */
-        void onNothingSelected(AdapterViewCompat<?> parent);
-    }
-
-
-    /**
-     * Register a callback to be invoked when an item in this AdapterView has
-     * been selected.
-     *
-     * @param listener The callback that will run
-     */
-    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
-        mOnItemSelectedListener = listener;
-    }
-
-    public final OnItemSelectedListener getOnItemSelectedListener() {
-        return mOnItemSelectedListener;
-    }
-
-    /**
-     * Extra menu information provided to the
-     * {@link android.view.View.OnCreateContextMenuListener#onCreateContextMenu(ContextMenu, View, ContextMenuInfo) }
-     * callback when a context menu is brought up for this AdapterView.
-     *
-     */
-    public static class AdapterContextMenuInfo implements ContextMenu.ContextMenuInfo {
-
-        public AdapterContextMenuInfo(View targetView, int position, long id) {
-            this.targetView = targetView;
-            this.position = position;
-            this.id = id;
-        }
-
-        /**
-         * The child view for which the context menu is being displayed. This
-         * will be one of the children of this AdapterView.
-         */
-        public View targetView;
-
-        /**
-         * The position in the adapter for which the context menu is being
-         * displayed.
-         */
-        public int position;
-
-        /**
-         * The row id of the item for which the context menu is being displayed.
-         */
-        public long id;
-    }
-
-    /**
-     * Returns the adapter currently associated with this widget.
-     *
-     * @return The adapter used to provide this view's content.
-     */
-    public abstract T getAdapter();
-
-    /**
-     * Sets the adapter that provides the data and the views to represent the data
-     * in this widget.
-     *
-     * @param adapter The adapter to use to create this view's content.
-     */
-    public abstract void setAdapter(T adapter);
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param child Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void addView(View child) {
-        throw new UnsupportedOperationException("addView(View) is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param child Ignored.
-     * @param index Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void addView(View child, int index) {
-        throw new UnsupportedOperationException("addView(View, int) is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param child Ignored.
-     * @param params Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void addView(View child, LayoutParams params) {
-        throw new UnsupportedOperationException("addView(View, LayoutParams) "
-                + "is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param child Ignored.
-     * @param index Ignored.
-     * @param params Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void addView(View child, int index, LayoutParams params) {
-        throw new UnsupportedOperationException("addView(View, int, LayoutParams) "
-                + "is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param child Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void removeView(View child) {
-        throw new UnsupportedOperationException("removeView(View) is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @param index Ignored.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void removeViewAt(int index) {
-        throw new UnsupportedOperationException("removeViewAt(int) is not supported in AdapterView");
-    }
-
-    /**
-     * This method is not supported and throws an UnsupportedOperationException when called.
-     *
-     * @throws UnsupportedOperationException Every time this method is invoked.
-     */
-    @Override
-    public void removeAllViews() {
-        throw new UnsupportedOperationException("removeAllViews() is not supported in AdapterView");
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        mLayoutHeight = getHeight();
-    }
-
-    /**
-     * Return the position of the currently selected item within the adapter's data set
-     *
-     * @return int Position (starting at 0), or {@link #INVALID_POSITION} if there is nothing selected.
-     */
-    @ViewDebug.CapturedViewProperty
-    public int getSelectedItemPosition() {
-        return mNextSelectedPosition;
-    }
-
-    /**
-     * @return The id corresponding to the currently selected item, or {@link #INVALID_ROW_ID}
-     * if nothing is selected.
-     */
-    @ViewDebug.CapturedViewProperty
-    public long getSelectedItemId() {
-        return mNextSelectedRowId;
-    }
-
-    /**
-     * @return The view corresponding to the currently selected item, or null
-     * if nothing is selected
-     */
-    public abstract View getSelectedView();
-
-    /**
-     * @return The data corresponding to the currently selected item, or
-     * null if there is nothing selected.
-     */
-    public Object getSelectedItem() {
-        T adapter = getAdapter();
-        int selection = getSelectedItemPosition();
-        if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
-            return adapter.getItem(selection);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @return The number of items owned by the Adapter associated with this
-     *         AdapterView. (This is the number of data items, which may be
-     *         larger than the number of visible views.)
-     */
-    @ViewDebug.CapturedViewProperty
-    public int getCount() {
-        return mItemCount;
-    }
-
-    /**
-     * Get the position within the adapter's data set for the view, where view is a an adapter item
-     * or a descendant of an adapter item.
-     *
-     * @param view an adapter item, or a descendant of an adapter item. This must be visible in this
-     *        AdapterView at the time of the call.
-     * @return the position within the adapter's data set of the view, or {@link #INVALID_POSITION}
-     *         if the view does not correspond to a list item (or it is not currently visible).
-     */
-    public int getPositionForView(View view) {
-        View listItem = view;
-        try {
-            View v;
-            while (!(v = (View) listItem.getParent()).equals(this)) {
-                listItem = v;
-            }
-        } catch (ClassCastException e) {
-            // We made it up to the window without find this list view
-            return INVALID_POSITION;
-        }
-
-        // Search the children for the list item
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            if (getChildAt(i).equals(listItem)) {
-                return mFirstPosition + i;
-            }
-        }
-
-        // Child not found!
-        return INVALID_POSITION;
-    }
-
-    /**
-     * Returns the position within the adapter's data set for the first item
-     * displayed on screen.
-     *
-     * @return The position within the adapter's data set
-     */
-    public int getFirstVisiblePosition() {
-        return mFirstPosition;
-    }
-
-    /**
-     * Returns the position within the adapter's data set for the last item
-     * displayed on screen.
-     *
-     * @return The position within the adapter's data set
-     */
-    public int getLastVisiblePosition() {
-        return mFirstPosition + getChildCount() - 1;
-    }
-
-    /**
-     * Sets the currently selected item. To support accessibility subclasses that
-     * override this method must invoke the overriden super method first.
-     *
-     * @param position Index (starting at 0) of the data item to be selected.
-     */
-    public abstract void setSelection(int position);
-
-    /**
-     * Sets the view to show if the adapter is empty
-     */
-    public void setEmptyView(View emptyView) {
-        mEmptyView = emptyView;
-
-        final T adapter = getAdapter();
-        final boolean empty = ((adapter == null) || adapter.isEmpty());
-        updateEmptyStatus(empty);
-    }
-
-    /**
-     * When the current adapter is empty, the AdapterView can display a special view
-     * call the empty view. The empty view is used to provide feedback to the user
-     * that no data is available in this AdapterView.
-     *
-     * @return The view to show if the adapter is empty.
-     */
-    public View getEmptyView() {
-        return mEmptyView;
-    }
-
-    /**
-     * Indicates whether this view is in filter mode. Filter mode can for instance
-     * be enabled by a user when typing on the keyboard.
-     *
-     * @return True if the view is in filter mode, false otherwise.
-     */
-    boolean isInFilterMode() {
-        return false;
-    }
-
-    @Override
-    public void setFocusable(boolean focusable) {
-        final T adapter = getAdapter();
-        final boolean empty = adapter == null || adapter.getCount() == 0;
-
-        mDesiredFocusableState = focusable;
-        if (!focusable) {
-            mDesiredFocusableInTouchModeState = false;
-        }
-
-        super.setFocusable(focusable && (!empty || isInFilterMode()));
-    }
-
-    @Override
-    public void setFocusableInTouchMode(boolean focusable) {
-        final T adapter = getAdapter();
-        final boolean empty = adapter == null || adapter.getCount() == 0;
-
-        mDesiredFocusableInTouchModeState = focusable;
-        if (focusable) {
-            mDesiredFocusableState = true;
-        }
-
-        super.setFocusableInTouchMode(focusable && (!empty || isInFilterMode()));
-    }
-
-    void checkFocus() {
-        final T adapter = getAdapter();
-        final boolean empty = adapter == null || adapter.getCount() == 0;
-        final boolean focusable = !empty || isInFilterMode();
-        // The order in which we set focusable in touch mode/focusable may matter
-        // for the client, see View.setFocusableInTouchMode() comments for more
-        // details
-        super.setFocusableInTouchMode(focusable && mDesiredFocusableInTouchModeState);
-        super.setFocusable(focusable && mDesiredFocusableState);
-        if (mEmptyView != null) {
-            updateEmptyStatus((adapter == null) || adapter.isEmpty());
-        }
-    }
-
-    /**
-     * Update the status of the list based on the empty parameter.  If empty is true and
-     * we have an empty view, display it.  In all the other cases, make sure that the listview
-     * is VISIBLE and that the empty view is GONE (if it's not null).
-     */
-    private void updateEmptyStatus(boolean empty) {
-        if (isInFilterMode()) {
-            empty = false;
-        }
-
-        if (empty) {
-            if (mEmptyView != null) {
-                mEmptyView.setVisibility(View.VISIBLE);
-                setVisibility(View.GONE);
-            } else {
-                // If the caller just removed our empty view, make sure the list view is visible
-                setVisibility(View.VISIBLE);
-            }
-
-            // We are now GONE, so pending layouts will not be dispatched.
-            // Force one here to make sure that the state of the list matches
-            // the state of the adapter.
-            if (mDataChanged) {
-                this.onLayout(false, getLeft(), getTop(), getRight(), getBottom());
-            }
-        } else {
-            if (mEmptyView != null) mEmptyView.setVisibility(View.GONE);
-            setVisibility(View.VISIBLE);
-        }
-    }
-
-    /**
-     * Gets the data associated with the specified position in the list.
-     *
-     * @param position Which data to get
-     * @return The data associated with the specified position in the list
-     */
-    public Object getItemAtPosition(int position) {
-        T adapter = getAdapter();
-        return (adapter == null || position < 0) ? null : adapter.getItem(position);
-    }
-
-    public long getItemIdAtPosition(int position) {
-        T adapter = getAdapter();
-        return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
-    }
-
-    @Override
-    public void setOnClickListener(OnClickListener l) {
-        throw new RuntimeException("Don't call setOnClickListener for an AdapterView. "
-                + "You probably want setOnItemClickListener instead");
-    }
-
-    /**
-     * Override to prevent freezing of any views created by the adapter.
-     */
-    @Override
-    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
-        dispatchFreezeSelfOnly(container);
-    }
-
-    /**
-     * Override to prevent thawing of any views created by the adapter.
-     */
-    @Override
-    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
-        dispatchThawSelfOnly(container);
-    }
-
-    class AdapterDataSetObserver extends DataSetObserver {
-
-        private Parcelable mInstanceState = null;
-
-        @Override
-        public void onChanged() {
-            mDataChanged = true;
-            mOldItemCount = mItemCount;
-            mItemCount = getAdapter().getCount();
-
-            // Detect the case where a cursor that was previously invalidated has
-            // been repopulated with new data.
-            if (AdapterViewCompat.this.getAdapter().hasStableIds() && mInstanceState != null
-                    && mOldItemCount == 0 && mItemCount > 0) {
-                AdapterViewCompat.this.onRestoreInstanceState(mInstanceState);
-                mInstanceState = null;
-            } else {
-                rememberSyncState();
-            }
-            checkFocus();
-            requestLayout();
-        }
-
-        @Override
-        public void onInvalidated() {
-            mDataChanged = true;
-
-            if (AdapterViewCompat.this.getAdapter().hasStableIds()) {
-                // Remember the current state for the case where our hosting activity is being
-                // stopped and later restarted
-                mInstanceState = AdapterViewCompat.this.onSaveInstanceState();
-            }
-
-            // Data is invalid so we should reset our state
-            mOldItemCount = mItemCount;
-            mItemCount = 0;
-            mSelectedPosition = INVALID_POSITION;
-            mSelectedRowId = INVALID_ROW_ID;
-            mNextSelectedPosition = INVALID_POSITION;
-            mNextSelectedRowId = INVALID_ROW_ID;
-            mNeedSync = false;
-
-            checkFocus();
-            requestLayout();
-        }
-
-        public void clearSavedState() {
-            mInstanceState = null;
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        removeCallbacks(mSelectionNotifier);
-    }
-
-    private class SelectionNotifier implements Runnable {
-        public void run() {
-            if (mDataChanged) {
-                // Data has changed between when this SelectionNotifier
-                // was posted and now. We need to wait until the AdapterView
-                // has been synched to the new data.
-                if (getAdapter() != null) {
-                    post(this);
-                }
-            } else {
-                fireOnSelected();
-            }
-        }
-    }
-
-    void selectionChanged() {
-        if (mOnItemSelectedListener != null) {
-            if (mInLayout || mBlockLayoutRequests) {
-                // If we are in a layout traversal, defer notification
-                // by posting. This ensures that the view tree is
-                // in a consistent state and is able to accomodate
-                // new layout or invalidate requests.
-                if (mSelectionNotifier == null) {
-                    mSelectionNotifier = new SelectionNotifier();
-                }
-                post(mSelectionNotifier);
-            } else {
-                fireOnSelected();
-            }
-        }
-
-        // we fire selection events here not in View
-        if (mSelectedPosition != ListView.INVALID_POSITION && isShown() && !isInTouchMode()) {
-            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
-        }
-    }
-
-    private void fireOnSelected() {
-        if (mOnItemSelectedListener == null)
-            return;
-
-        int selection = this.getSelectedItemPosition();
-        if (selection >= 0) {
-            View v = getSelectedView();
-            mOnItemSelectedListener.onItemSelected(this, v, selection,
-                    getAdapter().getItemId(selection));
-        } else {
-            mOnItemSelectedListener.onNothingSelected(this);
-        }
-    }
-
-    @Override
-    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
-        View selectedView = getSelectedView();
-        if (selectedView != null && selectedView.getVisibility() == VISIBLE
-                && selectedView.dispatchPopulateAccessibilityEvent(event)) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean canAnimate() {
-        return super.canAnimate() && mItemCount > 0;
-    }
-
-    void handleDataChanged() {
-        final int count = mItemCount;
-        boolean found = false;
-
-        if (count > 0) {
-
-            int newPos;
-
-            // Find the row we are supposed to sync to
-            if (mNeedSync) {
-                // Update this first, since setNextSelectedPositionInt inspects
-                // it
-                mNeedSync = false;
-
-                // See if we can find a position in the new data with the same
-                // id as the old selection
-                newPos = findSyncPosition();
-                if (newPos >= 0) {
-                    // Verify that new selection is selectable
-                    int selectablePos = lookForSelectablePosition(newPos, true);
-                    if (selectablePos == newPos) {
-                        // Same row id is selected
-                        setNextSelectedPositionInt(newPos);
-                        found = true;
-                    }
-                }
-            }
-            if (!found) {
-                // Try to use the same position if we can't find matching data
-                newPos = getSelectedItemPosition();
-
-                // Pin position to the available range
-                if (newPos >= count) {
-                    newPos = count - 1;
-                }
-                if (newPos < 0) {
-                    newPos = 0;
-                }
-
-                // Make sure we select something selectable -- first look down
-                int selectablePos = lookForSelectablePosition(newPos, true);
-                if (selectablePos < 0) {
-                    // Looking down didn't work -- try looking up
-                    selectablePos = lookForSelectablePosition(newPos, false);
-                }
-                if (selectablePos >= 0) {
-                    setNextSelectedPositionInt(selectablePos);
-                    checkSelectionChanged();
-                    found = true;
-                }
-            }
-        }
-        if (!found) {
-            // Nothing is selected
-            mSelectedPosition = INVALID_POSITION;
-            mSelectedRowId = INVALID_ROW_ID;
-            mNextSelectedPosition = INVALID_POSITION;
-            mNextSelectedRowId = INVALID_ROW_ID;
-            mNeedSync = false;
-            checkSelectionChanged();
-        }
-    }
-
-    void checkSelectionChanged() {
-        if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) {
-            selectionChanged();
-            mOldSelectedPosition = mSelectedPosition;
-            mOldSelectedRowId = mSelectedRowId;
-        }
-    }
-
-    /**
-     * Searches the adapter for a position matching mSyncRowId. The search starts at mSyncPosition
-     * and then alternates between moving up and moving down until 1) we find the right position, or
-     * 2) we run out of time, or 3) we have looked at every position
-     *
-     * @return Position of the row that matches mSyncRowId, or {@link #INVALID_POSITION} if it can't
-     *         be found
-     */
-    int findSyncPosition() {
-        int count = mItemCount;
-
-        if (count == 0) {
-            return INVALID_POSITION;
-        }
-
-        long idToMatch = mSyncRowId;
-        int seed = mSyncPosition;
-
-        // If there isn't a selection don't hunt for it
-        if (idToMatch == INVALID_ROW_ID) {
-            return INVALID_POSITION;
-        }
-
-        // Pin seed to reasonable values
-        seed = Math.max(0, seed);
-        seed = Math.min(count - 1, seed);
-
-        long endTime = SystemClock.uptimeMillis() + SYNC_MAX_DURATION_MILLIS;
-
-        long rowId;
-
-        // first position scanned so far
-        int first = seed;
-
-        // last position scanned so far
-        int last = seed;
-
-        // True if we should move down on the next iteration
-        boolean next = false;
-
-        // True when we have looked at the first item in the data
-        boolean hitFirst;
-
-        // True when we have looked at the last item in the data
-        boolean hitLast;
-
-        // Get the item ID locally (instead of getItemIdAtPosition), so
-        // we need the adapter
-        T adapter = getAdapter();
-        if (adapter == null) {
-            return INVALID_POSITION;
-        }
-
-        while (SystemClock.uptimeMillis() <= endTime) {
-            rowId = adapter.getItemId(seed);
-            if (rowId == idToMatch) {
-                // Found it!
-                return seed;
-            }
-
-            hitLast = last == count - 1;
-            hitFirst = first == 0;
-
-            if (hitLast && hitFirst) {
-                // Looked at everything
-                break;
-            }
-
-            if (hitFirst || (next && !hitLast)) {
-                // Either we hit the top, or we are trying to move down
-                last++;
-                seed = last;
-                // Try going up next time
-                next = false;
-            } else if (hitLast || (!next && !hitFirst)) {
-                // Either we hit the bottom, or we are trying to move up
-                first--;
-                seed = first;
-                // Try going down next time
-                next = true;
-            }
-
-        }
-
-        return INVALID_POSITION;
-    }
-
-    /**
-     * Find a position that can be selected (i.e., is not a separator).
-     *
-     * @param position The starting position to look at.
-     * @param lookDown Whether to look down for other positions.
-     * @return The next selectable position starting at position and then searching either up or
-     *         down. Returns {@link #INVALID_POSITION} if nothing can be found.
-     */
-    int lookForSelectablePosition(int position, boolean lookDown) {
-        return position;
-    }
-
-    /**
-     * Utility to keep mSelectedPosition and mSelectedRowId in sync
-     * @param position Our current position
-     */
-    void setSelectedPositionInt(int position) {
-        mSelectedPosition = position;
-        mSelectedRowId = getItemIdAtPosition(position);
-    }
-
-    /**
-     * Utility to keep mNextSelectedPosition and mNextSelectedRowId in sync
-     * @param position Intended value for mSelectedPosition the next time we go
-     * through layout
-     */
-    void setNextSelectedPositionInt(int position) {
-        mNextSelectedPosition = position;
-        mNextSelectedRowId = getItemIdAtPosition(position);
-        // If we are trying to sync to the selection, update that too
-        if (mNeedSync && mSyncMode == SYNC_SELECTED_POSITION && position >= 0) {
-            mSyncPosition = position;
-            mSyncRowId = mNextSelectedRowId;
-        }
-    }
-
-    /**
-     * Remember enough information to restore the screen state when the data has
-     * changed.
-     *
-     */
-    void rememberSyncState() {
-        if (getChildCount() > 0) {
-            mNeedSync = true;
-            mSyncHeight = mLayoutHeight;
-            if (mSelectedPosition >= 0) {
-                // Sync the selection state
-                View v = getChildAt(mSelectedPosition - mFirstPosition);
-                mSyncRowId = mNextSelectedRowId;
-                mSyncPosition = mNextSelectedPosition;
-                if (v != null) {
-                    mSpecificTop = v.getTop();
-                }
-                mSyncMode = SYNC_SELECTED_POSITION;
-            } else {
-                // Sync the based on the offset of the first view
-                View v = getChildAt(0);
-                T adapter = getAdapter();
-                if (mFirstPosition >= 0 && mFirstPosition < adapter.getCount()) {
-                    mSyncRowId = adapter.getItemId(mFirstPosition);
-                } else {
-                    mSyncRowId = NO_ID;
-                }
-                mSyncPosition = mFirstPosition;
-                if (v != null) {
-                    mSpecificTop = v.getTop();
-                }
-                mSyncMode = SYNC_FIRST_POSITION;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java b/v7/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java
index ebaee2a..52d53b3 100644
--- a/v7/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java
+++ b/v7/appcompat/src/android/support/v7/internal/widget/DecorToolbar.java
@@ -28,6 +28,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.widget.AdapterView;
 import android.widget.SpinnerAdapter;
 
 /**
@@ -74,7 +75,7 @@
     void setHomeButtonEnabled(boolean enable);
     int getNavigationMode();
     void setNavigationMode(int mode);
-    void setDropdownParams(SpinnerAdapter adapter, AdapterViewCompat.OnItemSelectedListener listener);
+    void setDropdownParams(SpinnerAdapter adapter, AdapterView.OnItemSelectedListener listener);
     void setDropdownSelectedPosition(int position);
     int getDropdownSelectedPosition();
     int getDropdownItemCount();
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java b/v7/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java
index 7c5c2cb..0d27d32 100644
--- a/v7/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java
+++ b/v7/appcompat/src/android/support/v7/internal/widget/ScrollingTabContainerView.java
@@ -26,6 +26,7 @@
 import android.support.v7.app.ActionBar;
 import android.support.v7.appcompat.R;
 import android.support.v7.internal.view.ActionBarPolicy;
+import android.support.v7.widget.AppCompatSpinner;
 import android.support.v7.widget.AppCompatTextView;
 import android.support.v7.widget.LinearLayoutCompat;
 import android.text.TextUtils;
@@ -38,10 +39,12 @@
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
+import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.HorizontalScrollView;
 import android.widget.ImageView;
 import android.widget.ListView;
+import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -52,14 +55,14 @@
  * @hide
  */
 public class ScrollingTabContainerView extends HorizontalScrollView
-        implements AdapterViewCompat.OnItemClickListener {
+        implements AdapterView.OnItemSelectedListener {
 
     private static final String TAG = "ScrollingTabContainerView";
     Runnable mTabSelector;
     private TabClickListener mTabClickListener;
 
     private LinearLayoutCompat mTabLayout;
-    private SpinnerCompat mTabSpinner;
+    private Spinner mTabSpinner;
     private boolean mAllowCollapse;
 
     int mMaxTabWidth;
@@ -206,12 +209,13 @@
         return tabLayout;
     }
 
-    private SpinnerCompat createSpinner() {
-        final SpinnerCompat spinner = new SpinnerCompat(getContext(), null,
+    private Spinner createSpinner() {
+        final Spinner spinner = new AppCompatSpinner(getContext(), null,
                 R.attr.actionDropDownStyle);
         spinner.setLayoutParams(new LinearLayoutCompat.LayoutParams(
-                LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT));
-        spinner.setOnItemClickListenerInt(this);
+                LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
+                LinearLayoutCompat.LayoutParams.MATCH_PARENT));
+        spinner.setOnItemSelectedListener(this);
         return spinner;
     }
 
@@ -362,11 +366,16 @@
     }
 
     @Override
-    public void onItemClick(AdapterViewCompat<?> parent, View view, int position, long id) {
+    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
         TabView tabView = (TabView) view;
         tabView.getTab().select();
     }
 
+    @Override
+    public void onNothingSelected(AdapterView<?> adapterView) {
+        // no-op
+    }
+
     private class TabView extends LinearLayoutCompat implements OnLongClickListener {
         private final int[] BG_ATTRS = {
                 android.R.attr.background
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java b/v7/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java
deleted file mode 100644
index b2b8af2..0000000
--- a/v7/appcompat/src/android/support/v7/internal/widget/SpinnerCompat.java
+++ /dev/null
@@ -1,1102 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.support.v7.internal.widget;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.database.DataSetObserver;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.appcompat.R;
-import android.support.v7.widget.ListPopupWindow;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.AdapterView;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.PopupWindow;
-import android.widget.SpinnerAdapter;
-
-
-/**
- * A view that displays one child at a time and lets the user pick among them. The items in the
- * Spinner come from the {@link android.widget.Adapter} associated with this view.
- *
- * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-spinner.html">Spinner
- * tutorial</a>.</p>
- */
-class SpinnerCompat extends AbsSpinnerCompat implements DialogInterface.OnClickListener {
-    private static final String TAG = "Spinner";
-
-    // Only measure this many items to get a decent max width.
-    private static final int MAX_ITEMS_MEASURED = 15;
-
-    /**
-     * Use a dialog window for selecting spinner options.
-     */
-    public static final int MODE_DIALOG = 0;
-
-    /**
-     * Use a dropdown anchored to the Spinner for selecting spinner options.
-     */
-    public static final int MODE_DROPDOWN = 1;
-
-    /**
-     * Use the theme-supplied value to select the dropdown mode.
-     */
-    private static final int MODE_THEME = -1;
-
-    /**
-     * Forwarding listener used to implement drag-to-open.
-     */
-    private ListPopupWindow.ForwardingListener mForwardingListener;
-
-    private SpinnerPopup mPopup;
-
-    private DropDownAdapter mTempAdapter;
-
-    int mDropDownWidth;
-
-    private int mGravity;
-
-    private boolean mDisableChildrenWhenDisabled;
-
-    private Rect mTempRect = new Rect();
-
-    private final TintManager mTintManager;
-
-    /**
-     * Construct a new spinner with the given context's theme.
-     *
-     * @param context The Context the view is running in, through which it can access the current
-     *                theme, resources, etc.
-     */
-    SpinnerCompat(Context context) {
-        this(context, null);
-    }
-
-    /**
-     * Construct a new spinner with the given context's theme and the supplied mode of displaying
-     * choices. <code>mode</code> may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}.
-     *
-     * @param context The Context the view is running in, through which it can access the current
-     *                theme, resources, etc.
-     * @param mode    Constant describing how the user will select choices from the spinner.
-     * @see #MODE_DIALOG
-     * @see #MODE_DROPDOWN
-     */
-    SpinnerCompat(Context context, int mode) {
-        this(context, null, R.attr.spinnerStyle, mode);
-    }
-
-    /**
-     * Construct a new spinner with the given context's theme and the supplied attribute set.
-     *
-     * @param context The Context the view is running in, through which it can access the current
-     *                theme, resources, etc.
-     * @param attrs   The attributes of the XML tag that is inflating the view.
-     */
-    SpinnerCompat(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.spinnerStyle);
-    }
-
-    /**
-     * Construct a new spinner with the given context's theme, the supplied attribute set, and
-     * default style.
-     *
-     * @param context  The Context the view is running in, through which it can access the current
-     *                 theme, resources, etc.
-     * @param attrs    The attributes of the XML tag that is inflating the view.
-     * @param defStyle The default style to apply to this view. If 0, no style will be applied
-     *                 (beyond what is included in the theme). This may either be an attribute
-     *                 resource, whose value will be retrieved from the current theme, or an
-     *                 explicit style resource.
-     */
-    SpinnerCompat(Context context, AttributeSet attrs, int defStyle) {
-        this(context, attrs, defStyle, MODE_THEME);
-    }
-
-    /**
-     * Construct a new spinner with the given context's theme, the supplied attribute set, and
-     * default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}
-     * and determines how the user will select choices from the spinner.
-     *
-     * @param context  The Context the view is running in, through which it can access the current
-     *                 theme, resources, etc.
-     * @param attrs    The attributes of the XML tag that is inflating the view.
-     * @param defStyle The default style to apply to this view. If 0, no style will be applied
-     *                 (beyond what is included in the theme). This may either be an attribute
-     *                 resource, whose value will be retrieved from the current theme, or an
-     *                 explicit style resource.
-     * @param mode     Constant describing how the user will select choices from the spinner.
-     * @see #MODE_DIALOG
-     * @see #MODE_DROPDOWN
-     */
-    SpinnerCompat(Context context, AttributeSet attrs, int defStyle, int mode) {
-        super(context, attrs, defStyle);
-
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
-                R.styleable.Spinner, defStyle, 0);
-
-        // Need to reset this for tinting purposes
-        if (a.hasValue(R.styleable.Spinner_android_background)) {
-            setBackgroundDrawable(a.getDrawable(R.styleable.Spinner_android_background));
-        }
-
-        if (mode == MODE_THEME) {
-            mode = a.getInt(R.styleable.Spinner_spinnerMode, MODE_DIALOG);
-        }
-
-        switch (mode) {
-            case MODE_DIALOG: {
-                mPopup = new DialogPopup();
-                break;
-            }
-
-            case MODE_DROPDOWN: {
-                final DropdownPopup popup = new DropdownPopup(context, attrs, defStyle);
-
-                mDropDownWidth = a.getLayoutDimension(R.styleable.Spinner_android_dropDownWidth,
-                        ViewGroup.LayoutParams.WRAP_CONTENT);
-
-                popup.setBackgroundDrawable(
-                        a.getDrawable(R.styleable.Spinner_android_popupBackground));
-
-                mPopup = popup;
-                mForwardingListener = new ListPopupWindow.ForwardingListener(this) {
-                    @Override
-                    public ListPopupWindow getPopup() {
-                        return popup;
-                    }
-
-                    @Override
-                    public boolean onForwardingStarted() {
-                        if (!mPopup.isShowing()) {
-                            mPopup.show();
-                        }
-                        return true;
-                    }
-                };
-                break;
-            }
-        }
-
-        mGravity = a.getInt(R.styleable.Spinner_android_gravity, Gravity.CENTER);
-
-        mPopup.setPromptText(a.getString(R.styleable.Spinner_prompt));
-
-        mDisableChildrenWhenDisabled = a.getBoolean(
-                R.styleable.Spinner_disableChildrenWhenDisabled, false);
-
-        a.recycle();
-
-        // Base constructor can call setAdapter before we initialize mPopup.
-        // Finish setting things up if this happened.
-        if (mTempAdapter != null) {
-            mPopup.setAdapter(mTempAdapter);
-            mTempAdapter = null;
-        }
-
-        // Keep the TintManager in case we need it later
-        mTintManager = a.getTintManager();
-    }
-
-    /**
-     * Set the background drawable for the spinner's popup window of choices. Only valid in {@link
-     * #MODE_DROPDOWN}; this method is a no-op in other modes.
-     *
-     * @param background Background drawable
-     */
-    public void setPopupBackgroundDrawable(Drawable background) {
-        if (!(mPopup instanceof DropdownPopup)) {
-            Log.e(TAG, "setPopupBackgroundDrawable: incompatible spinner mode; ignoring...");
-            return;
-        }
-        ((DropdownPopup) mPopup).setBackgroundDrawable(background);
-    }
-
-    /**
-     * Set the background drawable for the spinner's popup window of choices. Only valid in {@link
-     * #MODE_DROPDOWN}; this method is a no-op in other modes.
-     *
-     * @param resId Resource ID of a background drawable
-     */
-    public void setPopupBackgroundResource(int resId) {
-        setPopupBackgroundDrawable(mTintManager.getDrawable(resId));
-    }
-
-    /**
-     * Get the background drawable for the spinner's popup window of choices. Only valid in {@link
-     * #MODE_DROPDOWN}; other modes will return null.
-     *
-     * @return background Background drawable
-     */
-    public Drawable getPopupBackground() {
-        return mPopup.getBackground();
-    }
-
-    /**
-     * Set a vertical offset in pixels for the spinner's popup window of choices. Only valid in
-     * {@link #MODE_DROPDOWN}; this method is a no-op in other modes.
-     *
-     * @param pixels Vertical offset in pixels
-     */
-    public void setDropDownVerticalOffset(int pixels) {
-        mPopup.setVerticalOffset(pixels);
-    }
-
-    /**
-     * Get the configured vertical offset in pixels for the spinner's popup window of choices. Only
-     * valid in {@link #MODE_DROPDOWN}; other modes will return 0.
-     *
-     * @return Vertical offset in pixels
-     */
-    public int getDropDownVerticalOffset() {
-        return mPopup.getVerticalOffset();
-    }
-
-    /**
-     * Set a horizontal offset in pixels for the spinner's popup window of choices. Only valid in
-     * {@link #MODE_DROPDOWN}; this method is a no-op in other modes.
-     *
-     * @param pixels Horizontal offset in pixels
-     */
-    public void setDropDownHorizontalOffset(int pixels) {
-        mPopup.setHorizontalOffset(pixels);
-    }
-
-    /**
-     * Get the configured horizontal offset in pixels for the spinner's popup window of choices.
-     * Only valid in {@link #MODE_DROPDOWN}; other modes will return 0.
-     *
-     * @return Horizontal offset in pixels
-     */
-    public int getDropDownHorizontalOffset() {
-        return mPopup.getHorizontalOffset();
-    }
-
-    /**
-     * Set the width of the spinner's popup window of choices in pixels. This value may also be set
-     * to {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} to match the width of the Spinner
-     * itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} to wrap to the measured
-     * size of contained dropdown list items.
-     *
-     * <p>Only valid in {@link #MODE_DROPDOWN}; this method is a no-op in other modes.</p>
-     *
-     * @param pixels Width in pixels, WRAP_CONTENT, or MATCH_PARENT
-     */
-    public void setDropDownWidth(int pixels) {
-        if (!(mPopup instanceof DropdownPopup)) {
-            Log.e(TAG, "Cannot set dropdown width for MODE_DIALOG, ignoring");
-            return;
-        }
-        mDropDownWidth = pixels;
-    }
-
-    /**
-     * Get the configured width of the spinner's popup window of choices in pixels. The returned
-     * value may also be {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} meaning the popup
-     * window will match the width of the Spinner itself, or {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}
-     * to wrap to the measured size of contained dropdown list items.
-     *
-     * @return Width in pixels, WRAP_CONTENT, or MATCH_PARENT
-     */
-    public int getDropDownWidth() {
-        return mDropDownWidth;
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        super.setEnabled(enabled);
-        if (mDisableChildrenWhenDisabled) {
-            final int count = getChildCount();
-            for (int i = 0; i < count; i++) {
-                getChildAt(i).setEnabled(enabled);
-            }
-        }
-    }
-
-    /**
-     * Describes how the selected item view is positioned. Currently only the horizontal component
-     * is used. The default is determined by the current theme.
-     *
-     * @param gravity See {@link android.view.Gravity}
-     */
-    public void setGravity(int gravity) {
-        if (mGravity != gravity) {
-            if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) {
-                gravity |= GravityCompat.START;
-            }
-            mGravity = gravity;
-            requestLayout();
-        }
-    }
-
-    @Override
-    public void setAdapter(SpinnerAdapter adapter) {
-        super.setAdapter(adapter);
-
-        mRecycler.clear();
-
-        final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
-        if (targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP
-                && adapter != null && adapter.getViewTypeCount() != 1) {
-            throw new IllegalArgumentException("Spinner adapter view type count must be 1");
-        }
-        if (mPopup != null) {
-            mPopup.setAdapter(new DropDownAdapter(adapter));
-        } else {
-            mTempAdapter = new DropDownAdapter(adapter);
-        }
-    }
-
-    @Override
-    public int getBaseline() {
-        View child = null;
-
-        if (getChildCount() > 0) {
-            child = getChildAt(0);
-        } else if (mAdapter != null && mAdapter.getCount() > 0) {
-            child = makeView(0, false);
-            mRecycler.put(0, child);
-        }
-
-        if (child != null) {
-            final int childBaseline = child.getBaseline();
-            return childBaseline >= 0 ? child.getTop() + childBaseline : -1;
-        } else {
-            return -1;
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-
-        if (mPopup != null && mPopup.isShowing()) {
-            mPopup.dismiss();
-        }
-    }
-
-    /**
-     * <p>A spinner does not support item click events. Calling this method will raise an
-     * exception.</p>
-     *
-     * @param l this listener will be ignored
-     */
-    @Override
-    public void setOnItemClickListener(OnItemClickListener l) {
-        throw new RuntimeException("setOnItemClickListener cannot be used with a spinner.");
-    }
-
-    void setOnItemClickListenerInt(OnItemClickListener l) {
-        super.setOnItemClickListener(l);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        if (mForwardingListener != null && mForwardingListener.onTouch(this, event)) {
-            return true;
-        }
-
-        return super.onTouchEvent(event);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        if (mPopup != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
-            final int measuredWidth = getMeasuredWidth();
-            setMeasuredDimension(Math.min(Math.max(measuredWidth,
-                    measureContentWidth(getAdapter(), getBackground())),
-                    MeasureSpec.getSize(widthMeasureSpec)),
-                    getMeasuredHeight());
-        }
-    }
-
-    /**
-     * @see android.view.View#onLayout(boolean, int, int, int, int)
-     *
-     * Creates and positions all views
-     */
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-        mInLayout = true;
-        layout(0, false);
-        mInLayout = false;
-    }
-
-    /**
-     * Creates and positions all views for this Spinner.
-     *
-     * @param delta Change in the selected position. +1 means selection is moving to the right, so
-     *              views are scrolling to the left. -1 means selection is moving to the left.
-     */
-    @Override
-    void layout(int delta, boolean animate) {
-        int childrenLeft = mSpinnerPadding.left;
-        int childrenWidth = getRight() - getLeft() - mSpinnerPadding.left - mSpinnerPadding.right;
-
-        if (mDataChanged) {
-            handleDataChanged();
-        }
-
-        // Handle the empty set by removing all views
-        if (mItemCount == 0) {
-            resetList();
-            return;
-        }
-
-        if (mNextSelectedPosition >= 0) {
-            setSelectedPositionInt(mNextSelectedPosition);
-        }
-
-        recycleAllViews();
-
-        // Clear out old views
-        removeAllViewsInLayout();
-
-        // Make selected view and position it
-        mFirstPosition = mSelectedPosition;
-        if (mAdapter != null) {
-            View sel = makeView(mSelectedPosition, true);
-            int width = sel.getMeasuredWidth();
-            int selectedOffset = childrenLeft;
-            final int layoutDirection = ViewCompat.getLayoutDirection(this);
-            final int absoluteGravity = GravityCompat.getAbsoluteGravity(mGravity, layoutDirection);
-            switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
-                case Gravity.CENTER_HORIZONTAL:
-                    selectedOffset = childrenLeft + (childrenWidth / 2) - (width / 2);
-                    break;
-                case Gravity.RIGHT:
-                    selectedOffset = childrenLeft + childrenWidth - width;
-                    break;
-            }
-            sel.offsetLeftAndRight(selectedOffset);
-        }
-
-        // Flush any cached views that did not get reused above
-        mRecycler.clear();
-
-        invalidate();
-
-        checkSelectionChanged();
-
-        mDataChanged = false;
-        mNeedSync = false;
-        setNextSelectedPositionInt(mSelectedPosition);
-    }
-
-    /**
-     * Obtain a view, either by pulling an existing view from the recycler or by getting a new one
-     * from the adapter. If we are animating, make sure there is enough information in the view's
-     * layout parameters to animate from the old to new positions.
-     *
-     * @param position Position in the spinner for the view to obtain
-     * @param addChild true to add the child to the spinner, false to obtain and configure only.
-     * @return A view for the given position
-     */
-    private View makeView(int position, boolean addChild) {
-
-        View child;
-
-        if (!mDataChanged) {
-            child = mRecycler.get(position);
-            if (child != null) {
-                // Position the view
-                setUpChild(child, addChild);
-
-                return child;
-            }
-        }
-
-        // Nothing found in the recycler -- ask the adapter for a view
-        child = mAdapter.getView(position, null, this);
-
-        // Position the view
-        setUpChild(child, addChild);
-
-        return child;
-    }
-
-    /**
-     * Helper for makeAndAddView to set the position of a view and fill out its layout paramters.
-     *
-     * @param child    The view to position
-     * @param addChild true if the child should be added to the Spinner during setup
-     */
-    private void setUpChild(View child, boolean addChild) {
-
-        // Respect layout params that are already in the view. Otherwise
-        // make some up...
-        ViewGroup.LayoutParams lp = child.getLayoutParams();
-        if (lp == null) {
-            lp = generateDefaultLayoutParams();
-        }
-
-        if (addChild) {
-            addViewInLayout(child, 0, lp);
-        }
-
-        child.setSelected(hasFocus());
-        if (mDisableChildrenWhenDisabled) {
-            child.setEnabled(isEnabled());
-        }
-
-        // Get measure specs
-        int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec,
-                mSpinnerPadding.top + mSpinnerPadding.bottom, lp.height);
-        int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
-                mSpinnerPadding.left + mSpinnerPadding.right, lp.width);
-
-        // Measure child
-        child.measure(childWidthSpec, childHeightSpec);
-
-        int childLeft;
-        int childRight;
-
-        // Position vertically based on gravity setting
-        int childTop = mSpinnerPadding.top
-                + ((getMeasuredHeight() - mSpinnerPadding.bottom -
-                mSpinnerPadding.top - child.getMeasuredHeight()) / 2);
-        int childBottom = childTop + child.getMeasuredHeight();
-
-        int width = child.getMeasuredWidth();
-        childLeft = 0;
-        childRight = childLeft + width;
-
-        child.layout(childLeft, childTop, childRight, childBottom);
-    }
-
-    @Override
-    public boolean performClick() {
-        boolean handled = super.performClick();
-
-        if (!handled) {
-            handled = true;
-
-            if (!mPopup.isShowing()) {
-                mPopup.show();
-            }
-        }
-
-        return handled;
-    }
-
-    public void onClick(DialogInterface dialog, int which) {
-        setSelection(which);
-        dialog.dismiss();
-    }
-
-    /**
-     * Sets the prompt to display when the dialog is shown.
-     * @param prompt the prompt to set
-     */
-    public void setPrompt(CharSequence prompt) {
-        mPopup.setPromptText(prompt);
-    }
-
-    /**
-     * Sets the prompt to display when the dialog is shown.
-     * @param promptId the resource ID of the prompt to display when the dialog is shown
-     */
-    public void setPromptId(int promptId) {
-        setPrompt(getContext().getText(promptId));
-    }
-
-    /**
-     * @return The prompt to display when the dialog is shown
-     */
-    public CharSequence getPrompt() {
-        return mPopup.getHintText();
-    }
-
-    int measureContentWidth(SpinnerAdapter adapter, Drawable background) {
-        if (adapter == null) {
-            return 0;
-        }
-
-        int width = 0;
-        View itemView = null;
-        int itemType = 0;
-        final int widthMeasureSpec =
-                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-        final int heightMeasureSpec =
-                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-
-        // Make sure the number of items we'll measure is capped. If it's a huge data set
-        // with wildly varying sizes, oh well.
-        int start = Math.max(0, getSelectedItemPosition());
-        final int end = Math.min(adapter.getCount(), start + MAX_ITEMS_MEASURED);
-        final int count = end - start;
-        start = Math.max(0, start - (MAX_ITEMS_MEASURED - count));
-        for (int i = start; i < end; i++) {
-            final int positionType = adapter.getItemViewType(i);
-            if (positionType != itemType) {
-                itemType = positionType;
-                itemView = null;
-            }
-            itemView = adapter.getView(i, itemView, this);
-            if (itemView.getLayoutParams() == null) {
-                itemView.setLayoutParams(new ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.WRAP_CONTENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT));
-            }
-            itemView.measure(widthMeasureSpec, heightMeasureSpec);
-            width = Math.max(width, itemView.getMeasuredWidth());
-        }
-
-        // Add background padding to measured width
-        if (background != null) {
-            background.getPadding(mTempRect);
-            width += mTempRect.left + mTempRect.right;
-        }
-
-        return width;
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        final SavedState ss = new SavedState(super.onSaveInstanceState());
-        ss.showDropdown = mPopup != null && mPopup.isShowing();
-        return ss;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Parcelable state) {
-        SavedState ss = (SavedState) state;
-
-        super.onRestoreInstanceState(ss.getSuperState());
-
-        if (ss.showDropdown) {
-            ViewTreeObserver vto = getViewTreeObserver();
-            if (vto != null) {
-                final ViewTreeObserver.OnGlobalLayoutListener listener
-                        = new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        if (!mPopup.isShowing()) {
-                            mPopup.show();
-                        }
-                        final ViewTreeObserver vto = getViewTreeObserver();
-                        if (vto != null) {
-                            vto.removeGlobalOnLayoutListener(this);
-                        }
-                    }
-                };
-                vto.addOnGlobalLayoutListener(listener);
-            }
-        }
-    }
-
-    static class SavedState extends AbsSpinnerCompat.SavedState {
-
-        boolean showDropdown;
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        private SavedState(Parcel in) {
-            super(in);
-            showDropdown = in.readByte() != 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeByte((byte) (showDropdown ? 1 : 0));
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR =
-                new Parcelable.Creator<SavedState>() {
-                    public SavedState createFromParcel(Parcel in) {
-                        return new SavedState(in);
-                    }
-
-                    public SavedState[] newArray(int size) {
-                        return new SavedState[size];
-                    }
-                };
-    }
-
-    /**
-     * <p>Wrapper class for an Adapter. Transforms the embedded Adapter instance into a
-     * ListAdapter.</p>
-     */
-    private static class DropDownAdapter implements ListAdapter, SpinnerAdapter {
-
-        private SpinnerAdapter mAdapter;
-
-        private ListAdapter mListAdapter;
-
-        /**
-         * <p>Creates a new ListAdapter wrapper for the specified adapter.</p>
-         *
-         * @param adapter the Adapter to transform into a ListAdapter
-         */
-        public DropDownAdapter(SpinnerAdapter adapter) {
-            this.mAdapter = adapter;
-            if (adapter instanceof ListAdapter) {
-                this.mListAdapter = (ListAdapter) adapter;
-            }
-        }
-
-        public int getCount() {
-            return mAdapter == null ? 0 : mAdapter.getCount();
-        }
-
-        public Object getItem(int position) {
-            return mAdapter == null ? null : mAdapter.getItem(position);
-        }
-
-        public long getItemId(int position) {
-            return mAdapter == null ? -1 : mAdapter.getItemId(position);
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            return getDropDownView(position, convertView, parent);
-        }
-
-        public View getDropDownView(int position, View convertView, ViewGroup parent) {
-            return (mAdapter == null) ? null
-                    : mAdapter.getDropDownView(position, convertView, parent);
-        }
-
-        public boolean hasStableIds() {
-            return mAdapter != null && mAdapter.hasStableIds();
-        }
-
-        public void registerDataSetObserver(DataSetObserver observer) {
-            if (mAdapter != null) {
-                mAdapter.registerDataSetObserver(observer);
-            }
-        }
-
-        public void unregisterDataSetObserver(DataSetObserver observer) {
-            if (mAdapter != null) {
-                mAdapter.unregisterDataSetObserver(observer);
-            }
-        }
-
-        /**
-         * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. Otherwise,
-         * return true.
-         */
-        public boolean areAllItemsEnabled() {
-            final ListAdapter adapter = mListAdapter;
-            if (adapter != null) {
-                return adapter.areAllItemsEnabled();
-            } else {
-                return true;
-            }
-        }
-
-        /**
-         * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. Otherwise,
-         * return true.
-         */
-        public boolean isEnabled(int position) {
-            final ListAdapter adapter = mListAdapter;
-            if (adapter != null) {
-                return adapter.isEnabled(position);
-            } else {
-                return true;
-            }
-        }
-
-        public int getItemViewType(int position) {
-            return 0;
-        }
-
-        public int getViewTypeCount() {
-            return 1;
-        }
-
-        public boolean isEmpty() {
-            return getCount() == 0;
-        }
-    }
-
-    /**
-     * Implements some sort of popup selection interface for selecting a spinner option. Allows for
-     * different spinner modes.
-     */
-    private interface SpinnerPopup {
-
-        public void setAdapter(ListAdapter adapter);
-
-        /**
-         * Show the popup
-         */
-        public void show();
-
-        /**
-         * Dismiss the popup
-         */
-        public void dismiss();
-
-        /**
-         * @return true if the popup is showing, false otherwise.
-         */
-        public boolean isShowing();
-
-        /**
-         * Set hint text to be displayed to the user. This should provide a description of the
-         * choice being made.
-         *
-         * @param hintText Hint text to set.
-         */
-        public void setPromptText(CharSequence hintText);
-
-        public CharSequence getHintText();
-
-        public void setBackgroundDrawable(Drawable bg);
-
-        public void setVerticalOffset(int px);
-
-        public void setHorizontalOffset(int px);
-
-        public Drawable getBackground();
-
-        public int getVerticalOffset();
-
-        public int getHorizontalOffset();
-    }
-
-    private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener {
-
-        private AlertDialog mPopup;
-
-        private ListAdapter mListAdapter;
-
-        private CharSequence mPrompt;
-
-        public void dismiss() {
-            if (mPopup != null) {
-                mPopup.dismiss();
-                mPopup = null;
-            }
-        }
-
-        public boolean isShowing() {
-            return mPopup != null ? mPopup.isShowing() : false;
-        }
-
-        public void setAdapter(ListAdapter adapter) {
-            mListAdapter = adapter;
-        }
-
-        public void setPromptText(CharSequence hintText) {
-            mPrompt = hintText;
-        }
-
-        public CharSequence getHintText() {
-            return mPrompt;
-        }
-
-        public void show() {
-            if (mListAdapter == null) {
-                return;
-            }
-            AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
-            if (mPrompt != null) {
-                builder.setTitle(mPrompt);
-            }
-            mPopup = builder.setSingleChoiceItems(mListAdapter,
-                    getSelectedItemPosition(), this).create();
-            mPopup.show();
-        }
-
-        public void onClick(DialogInterface dialog, int which) {
-            setSelection(which);
-            if (mOnItemClickListener != null) {
-                performItemClick(null, which, mListAdapter.getItemId(which));
-            }
-            dismiss();
-        }
-
-        @Override
-        public void setBackgroundDrawable(Drawable bg) {
-            Log.e(TAG, "Cannot set popup background for MODE_DIALOG, ignoring");
-        }
-
-        @Override
-        public void setVerticalOffset(int px) {
-            Log.e(TAG, "Cannot set vertical offset for MODE_DIALOG, ignoring");
-        }
-
-        @Override
-        public void setHorizontalOffset(int px) {
-            Log.e(TAG, "Cannot set horizontal offset for MODE_DIALOG, ignoring");
-        }
-
-        @Override
-        public Drawable getBackground() {
-            return null;
-        }
-
-        @Override
-        public int getVerticalOffset() {
-            return 0;
-        }
-
-        @Override
-        public int getHorizontalOffset() {
-            return 0;
-        }
-    }
-
-    private class DropdownPopup extends ListPopupWindow implements SpinnerPopup {
-
-        private CharSequence mHintText;
-
-        private ListAdapter mAdapter;
-
-        public DropdownPopup(
-                Context context, AttributeSet attrs, int defStyleAttr) {
-            super(context, attrs, defStyleAttr);
-
-            setAnchorView(SpinnerCompat.this);
-            setModal(true);
-            setPromptPosition(POSITION_PROMPT_ABOVE);
-
-            setOnItemClickListener(new AdapterView.OnItemClickListener() {
-                @Override
-                public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
-                    SpinnerCompat.this.setSelection(position);
-                    if (mOnItemClickListener != null) {
-                        SpinnerCompat.this
-                                .performItemClick(v, position, mAdapter.getItemId(position));
-                    }
-                    dismiss();
-                }
-            });
-        }
-
-        @Override
-        public void setAdapter(ListAdapter adapter) {
-            super.setAdapter(adapter);
-            mAdapter = adapter;
-        }
-
-        public CharSequence getHintText() {
-            return mHintText;
-        }
-
-        public void setPromptText(CharSequence hintText) {
-            // Hint text is ignored for dropdowns, but maintain it here.
-            mHintText = hintText;
-        }
-
-        void computeContentWidth() {
-            final Drawable background = getBackground();
-            int hOffset = 0;
-            if (background != null) {
-                background.getPadding(mTempRect);
-                hOffset = ViewUtils.isLayoutRtl(SpinnerCompat.this) ? mTempRect.right
-                        : -mTempRect.left;
-            } else {
-                mTempRect.left = mTempRect.right = 0;
-            }
-
-            final int spinnerPaddingLeft = SpinnerCompat.this.getPaddingLeft();
-            final int spinnerPaddingRight = SpinnerCompat.this.getPaddingRight();
-            final int spinnerWidth = SpinnerCompat.this.getWidth();
-            if (mDropDownWidth == WRAP_CONTENT) {
-                int contentWidth = measureContentWidth(
-                        (SpinnerAdapter) mAdapter, getBackground());
-                final int contentWidthLimit = getContext().getResources()
-                        .getDisplayMetrics().widthPixels - mTempRect.left - mTempRect.right;
-                if (contentWidth > contentWidthLimit) {
-                    contentWidth = contentWidthLimit;
-                }
-                setContentWidth(Math.max(
-                        contentWidth, spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight));
-            } else if (mDropDownWidth == MATCH_PARENT) {
-                setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight);
-            } else {
-                setContentWidth(mDropDownWidth);
-            }
-            if (ViewUtils.isLayoutRtl(SpinnerCompat.this)) {
-                hOffset += spinnerWidth - spinnerPaddingRight - getWidth();
-            } else {
-                hOffset += spinnerPaddingLeft;
-            }
-            setHorizontalOffset(hOffset);
-        }
-
-        public void show(int textDirection, int textAlignment) {
-            final boolean wasShowing = isShowing();
-
-            computeContentWidth();
-            setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
-            super.show();
-            final ListView listView = getListView();
-            listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-            //listView.setTextDirection(textDirection);
-            //listView.setTextAlignment(textAlignment);
-            setSelection(SpinnerCompat.this.getSelectedItemPosition());
-
-            if (wasShowing) {
-                // Skip setting up the layout/dismiss listener below. If we were previously
-                // showing it will still stick around.
-                return;
-            }
-
-            // Make sure we hide if our anchor goes away.
-            // TODO: This might be appropriate to push all the way down to PopupWindow,
-            // but it may have other side effects to investigate first. (Text editing handles, etc.)
-            final ViewTreeObserver vto = getViewTreeObserver();
-            if (vto != null) {
-                final ViewTreeObserver.OnGlobalLayoutListener layoutListener
-                        = new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        computeContentWidth();
-
-                        // Use super.show here to update; we don't want to move the selected
-                        // position or adjust other things that would be reset otherwise.
-                        DropdownPopup.super.show();
-                    }
-                };
-                vto.addOnGlobalLayoutListener(layoutListener);
-                setOnDismissListener(new PopupWindow.OnDismissListener() {
-                    @Override
-                    public void onDismiss() {
-                        final ViewTreeObserver vto = getViewTreeObserver();
-                        if (vto != null) {
-                            vto.removeGlobalOnLayoutListener(layoutListener);
-                        }
-                    }
-                });
-            }
-        }
-    }
-}
diff --git a/v7/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java b/v7/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java
index 8315397..50e03c9 100644
--- a/v7/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java
+++ b/v7/appcompat/src/android/support/v7/internal/widget/ToolbarWidgetWrapper.java
@@ -29,6 +29,7 @@
 import android.support.v7.internal.view.menu.MenuBuilder;
 import android.support.v7.internal.view.menu.MenuPresenter;
 import android.support.v7.widget.ActionMenuPresenter;
+import android.support.v7.widget.AppCompatSpinner;
 import android.support.v7.widget.Toolbar;
 import android.text.TextUtils;
 import android.util.Log;
@@ -39,6 +40,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.Spinner;
 import android.widget.SpinnerAdapter;
 
 /**
@@ -64,7 +67,7 @@
 
     private int mDisplayOpts;
     private View mTabView;
-    private SpinnerCompat mSpinner;
+    private Spinner mSpinner;
     private View mCustomView;
 
     private Drawable mIcon;
@@ -524,7 +527,7 @@
 
     private void ensureSpinner() {
         if (mSpinner == null) {
-            mSpinner = new SpinnerCompat(getContext(), null, R.attr.actionDropDownStyle);
+            mSpinner = new AppCompatSpinner(getContext(), null, R.attr.actionDropDownStyle);
             Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                     ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL);
             mSpinner.setLayoutParams(lp);
@@ -533,7 +536,7 @@
 
     @Override
     public void setDropdownParams(SpinnerAdapter adapter,
-            AdapterViewCompat.OnItemSelectedListener listener) {
+            AdapterView.OnItemSelectedListener listener) {
         ensureSpinner();
         mSpinner.setAdapter(adapter);
         mSpinner.setOnItemSelectedListener(listener);
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java b/v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java
index c50afb5..2c3426c 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java
@@ -16,32 +16,47 @@
 
 package android.support.v7.widget;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
 import android.graphics.PorterDuff;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.Nullable;
 import android.support.v4.view.TintableBackgroundView;
+import android.support.v4.view.ViewCompat;
 import android.support.v7.appcompat.R;
+import android.support.v7.internal.view.ContextThemeWrapper;
 import android.support.v7.internal.widget.TintManager;
 import android.support.v7.internal.widget.TintTypedArray;
+import android.support.v7.internal.widget.ViewUtils;
 import android.util.AttributeSet;
-import android.widget.ListPopupWindow;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.PopupWindow;
 import android.widget.Spinner;
+import android.widget.SpinnerAdapter;
 
-import java.lang.reflect.Field;
 
 /**
  * A {@link Spinner} which supports compatible features on older version of the platform,
  * including:
  * <ul>
- *     <li>Allows dynamic tint of it background via the background tint methods in
- *     {@link android.support.v4.view.ViewCompat}.</li>
- *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
- *     {@link R.attr#backgroundTintMode}.</li>
+ * <li>Allows dynamic tint of it background via the background tint methods in
+ * {@link android.support.v4.view.ViewCompat}.</li>
+ * <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
+ * {@link R.attr#backgroundTintMode}.</li>
+ * <li>Allows setting of the popups theme using {@link R.attr#popupTheme}.</li>
  * </ul>
  *
  * <p>This will automatically be used when you use {@link Spinner} in your layouts.
@@ -49,59 +64,382 @@
  */
 public class AppCompatSpinner extends Spinner implements TintableBackgroundView {
 
-    private static final int[] TINT_ATTRS = {
-            android.R.attr.popupBackground
-    };
+    private static final boolean IS_AT_LEAST_M =
+            "MNC".equals(Build.VERSION.CODENAME) || Build.VERSION.SDK_INT >= 23;
+    private static final boolean IS_AT_LEAST_JB = Build.VERSION.SDK_INT >= 16;
+
+    private static final int[] ATTRS_ANDROID_SPINNERMODE = {android.R.attr.spinnerMode};
+
+    private static final int MAX_ITEMS_MEASURED = 15;
+
+    private static final String TAG = "AppCompatSpinner";
+
+    private static final int MODE_DIALOG = 0;
+    private static final int MODE_DROPDOWN = 1;
+    private static final int MODE_THEME = -1;
 
     private TintManager mTintManager;
+
     private AppCompatBackgroundHelper mBackgroundTintHelper;
 
+    /** Context used to inflate the popup window or dialog. */
+    private Context mPopupContext;
+
+    /** Forwarding listener used to implement drag-to-open. */
+    private ListPopupWindow.ForwardingListener mForwardingListener;
+
+    /** Temporary holder for setAdapter() calls from the super constructor. */
+    private SpinnerAdapter mTempAdapter;
+
+    private boolean mPopupSet;
+
+    private DropdownPopup mPopup;
+
+    private int mDropDownWidth;
+
+    private final Rect mTempRect = new Rect();
+
+    /**
+     * Construct a new spinner with the given context's theme.
+     *
+     * @param context The Context the view is running in, through which it can
+     *                access the current theme, resources, etc.
+     */
     public AppCompatSpinner(Context context) {
         this(context, null);
     }
 
+    /**
+     * Construct a new spinner with the given context's theme and the supplied
+     * mode of displaying choices. <code>mode</code> may be one of
+     * {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}.
+     *
+     * @param context The Context the view is running in, through which it can
+     *                access the current theme, resources, etc.
+     * @param mode    Constant describing how the user will select choices from the spinner.
+     * @see #MODE_DIALOG
+     * @see #MODE_DROPDOWN
+     */
+    public AppCompatSpinner(Context context, int mode) {
+        this(context, null, R.attr.spinnerStyle, mode);
+    }
+
+    /**
+     * Construct a new spinner with the given context's theme and the supplied attribute set.
+     *
+     * @param context The Context the view is running in, through which it can
+     *                access the current theme, resources, etc.
+     * @param attrs   The attributes of the XML tag that is inflating the view.
+     */
     public AppCompatSpinner(Context context, AttributeSet attrs) {
         this(context, attrs, R.attr.spinnerStyle);
     }
 
+    /**
+     * Construct a new spinner with the given context's theme, the supplied attribute set,
+     * and default style attribute.
+     *
+     * @param context      The Context the view is running in, through which it can
+     *                     access the current theme, resources, etc.
+     * @param attrs        The attributes of the XML tag that is inflating the view.
+     * @param defStyleAttr An attribute in the current theme that contains a
+     *                     reference to a style resource that supplies default values for
+     *                     the view. Can be 0 to not look for defaults.
+     */
     public AppCompatSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, MODE_THEME);
+    }
+
+    /**
+     * Construct a new spinner with the given context's theme, the supplied attribute set,
+     * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
+     * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
+     *
+     * @param context      The Context the view is running in, through which it can
+     *                     access the current theme, resources, etc.
+     * @param attrs        The attributes of the XML tag that is inflating the view.
+     * @param defStyleAttr An attribute in the current theme that contains a
+     *                     reference to a style resource that supplies default values for
+     *                     the view. Can be 0 to not look for defaults.
+     * @param mode         Constant describing how the user will select choices from the spinner.
+     * @see #MODE_DIALOG
+     * @see #MODE_DROPDOWN
+     */
+    public AppCompatSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
+        this(context, attrs, defStyleAttr, mode, null);
+    }
+
+
+    /**
+     * Constructs a new spinner with the given context's theme, the supplied
+     * attribute set, default styles, popup mode (one of {@link #MODE_DIALOG}
+     * or {@link #MODE_DROPDOWN}), and the context against which the popup
+     * should be inflated.
+     *
+     * @param context      The context against which the view is inflated, which
+     *                     provides access to the current theme, resources, etc.
+     * @param attrs        The attributes of the XML tag that is inflating the view.
+     * @param defStyleAttr An attribute in the current theme that contains a
+     *                     reference to a style resource that supplies default
+     *                     values for the view. Can be 0 to not look for
+     *                     defaults.
+     * @param mode         Constant describing how the user will select choices from
+     *                     the spinner.
+     * @param popupTheme   The theme against which the dialog or dropdown popup
+     *                     should be inflated. May be {@code null} to use the
+     *                     view theme. If set, this will override any value
+     *                     specified by
+     *                     {@link R.styleable#Spinner_popupTheme}.
+     * @see #MODE_DIALOG
+     * @see #MODE_DROPDOWN
+     */
+    public AppCompatSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode,
+            Resources.Theme popupTheme) {
         super(context, attrs, defStyleAttr);
 
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
-                TINT_ATTRS, defStyleAttr, 0);
+        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
+                R.styleable.Spinner, defStyleAttr, 0);
+
         mTintManager = a.getTintManager();
         mBackgroundTintHelper = new AppCompatBackgroundHelper(this, mTintManager);
 
-        if (a.hasValue(0)) {
-            final Drawable popupBackground = a.getDrawable(0);
-            if (Build.VERSION.SDK_INT >= 16) {
-                setPopupBackgroundDrawable(popupBackground);
-            } else if (Build.VERSION.SDK_INT >= 11) {
-                setPopupBackgroundDrawableV11(this, popupBackground);
+        if (popupTheme != null) {
+            mPopupContext = new ContextThemeWrapper(context, popupTheme);
+        } else {
+            final int popupThemeResId = a.getResourceId(R.styleable.Spinner_popupTheme, 0);
+            if (popupThemeResId != 0) {
+                mPopupContext = new ContextThemeWrapper(context, popupThemeResId);
+            } else {
+                // If we're running on a < M device, we'll use the current context and still handle
+                // any dropdown popup
+                mPopupContext = !IS_AT_LEAST_M ? context : null;
+            }
+        }
+
+        if (mPopupContext != null) {
+            if (mode == MODE_THEME) {
+                if (Build.VERSION.SDK_INT >= 11) {
+                    // If we're running on API v11+ we will try and read android:spinnerMode
+                    TypedArray aa = null;
+                    try {
+                        aa = context.obtainStyledAttributes(attrs, ATTRS_ANDROID_SPINNERMODE,
+                                defStyleAttr, 0);
+                        if (aa.hasValue(0)) {
+                            mode = aa.getInt(0, MODE_DIALOG);
+                        }
+                    } catch (Exception e) {
+                        Log.i(TAG, "Could not read android:spinnerMode", e);
+                    } finally {
+                        if (aa != null) {
+                            aa.recycle();
+                        }
+                    }
+                } else {
+                    // Else, we use a default mode of dropdown
+                    mode = MODE_DROPDOWN;
+                }
+            }
+
+            if (mode == MODE_DROPDOWN) {
+                final DropdownPopup popup = new DropdownPopup(mPopupContext, attrs, defStyleAttr);
+                final TintTypedArray pa = TintTypedArray.obtainStyledAttributes(
+                        mPopupContext, attrs, R.styleable.Spinner, defStyleAttr, 0);
+                mDropDownWidth = pa.getLayoutDimension(R.styleable.Spinner_android_dropDownWidth,
+                        LayoutParams.WRAP_CONTENT);
+                popup.setBackgroundDrawable(
+                        pa.getDrawable(R.styleable.Spinner_android_popupBackground));
+                popup.setPromptText(a.getString(R.styleable.Spinner_android_prompt));
+                pa.recycle();
+
+                mPopup = popup;
+                mForwardingListener = new ListPopupWindow.ForwardingListener(this) {
+                    @Override
+                    public ListPopupWindow getPopup() {
+                        return popup;
+                    }
+
+                    @Override
+                    public boolean onForwardingStarted() {
+                        if (!mPopup.isShowing()) {
+                            mPopup.show();
+                        }
+                        return true;
+                    }
+                };
             }
         }
         a.recycle();
 
-        mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr);
+        mPopupSet = true;
 
+        // Base constructors can call setAdapter before we initialize mPopup.
+        // Finish setting things up if this happened.
+        if (mTempAdapter != null) {
+            setAdapter(mTempAdapter);
+            mTempAdapter = null;
+        }
+
+        mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr);
     }
 
-    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-    private static void setPopupBackgroundDrawableV11(Spinner view, Drawable background) {
-        try {
-            Field popupField = Spinner.class.getDeclaredField("mPopup");
-            popupField.setAccessible(true);
-
-            Object popup = popupField.get(view);
-
-            if (popup instanceof ListPopupWindow) {
-                ((ListPopupWindow) popup).setBackgroundDrawable(background);
-            }
-        } catch (NoSuchFieldException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
+    /**
+     * @return the context used to inflate the Spinner's popup or dialog window
+     */
+    public Context getPopupContext() {
+        if (mPopup != null) {
+            return mPopupContext;
+        } else if (IS_AT_LEAST_M) {
+            return super.getPopupContext();
         }
+        return null;
+    }
+
+    public void setPopupBackgroundDrawable(Drawable background) {
+        if (mPopup != null) {
+            mPopup.setBackgroundDrawable(background);
+        } else if (IS_AT_LEAST_JB) {
+            super.setPopupBackgroundDrawable(background);
+        }
+    }
+
+    public void setPopupBackgroundResource(@DrawableRes int resId) {
+        setPopupBackgroundDrawable(getPopupContext().getDrawable(resId));
+    }
+
+    public Drawable getPopupBackground() {
+        if (mPopup != null) {
+            return mPopup.getBackground();
+        } else if (IS_AT_LEAST_JB) {
+            return super.getPopupBackground();
+        }
+        return null;
+    }
+
+    public void setDropDownVerticalOffset(int pixels) {
+        if (mPopup != null) {
+            mPopup.setVerticalOffset(pixels);
+        } else if (IS_AT_LEAST_JB) {
+            super.setDropDownVerticalOffset(pixels);
+        }
+    }
+
+    public int getDropDownVerticalOffset() {
+        if (mPopup != null) {
+            return mPopup.getVerticalOffset();
+        } else if (IS_AT_LEAST_JB) {
+            return super.getDropDownVerticalOffset();
+        }
+        return 0;
+    }
+
+    public void setDropDownHorizontalOffset(int pixels) {
+        if (mPopup != null) {
+            mPopup.setHorizontalOffset(pixels);
+        } else if (IS_AT_LEAST_JB) {
+            super.setDropDownHorizontalOffset(pixels);
+        }
+    }
+
+    /**
+     * Get the configured horizontal offset in pixels for the spinner's popup window of choices.
+     * Only valid in {@link #MODE_DROPDOWN}; other modes will return 0.
+     *
+     * @return Horizontal offset in pixels
+     */
+    public int getDropDownHorizontalOffset() {
+        if (mPopup != null) {
+            return mPopup.getHorizontalOffset();
+        } else if (IS_AT_LEAST_JB) {
+            return super.getDropDownHorizontalOffset();
+        }
+        return 0;
+    }
+
+    public void setDropDownWidth(int pixels) {
+        if (mPopup != null) {
+            mDropDownWidth = pixels;
+        } else if (IS_AT_LEAST_JB) {
+            super.setDropDownWidth(pixels);
+        }
+    }
+
+    public int getDropDownWidth() {
+        if (mPopup != null) {
+            return mDropDownWidth;
+        } else if (IS_AT_LEAST_JB) {
+            return super.getDropDownWidth();
+        }
+        return 0;
+    }
+
+    @Override
+    public void setAdapter(SpinnerAdapter adapter) {
+        // The super constructor may call setAdapter before we're prepared.
+        // Postpone doing anything until we've finished construction.
+        if (!mPopupSet) {
+            mTempAdapter = adapter;
+            return;
+        }
+
+        super.setAdapter(adapter);
+
+        if (mPopup != null) {
+            final Context popupContext = mPopupContext == null ? getContext() : mPopupContext;
+            mPopup.setAdapter(new DropDownAdapter(adapter, popupContext.getTheme()));
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+
+        if (mPopup != null && mPopup.isShowing()) {
+            mPopup.dismiss();
+        }
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (mForwardingListener != null && mForwardingListener.onTouch(this, event)) {
+            return true;
+        }
+        return super.onTouchEvent(event);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        if (mPopup != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
+            final int measuredWidth = getMeasuredWidth();
+            setMeasuredDimension(Math.min(Math.max(measuredWidth,
+                                    compatMeasureContentWidth(getAdapter(), getBackground())),
+                            MeasureSpec.getSize(widthMeasureSpec)),
+                    getMeasuredHeight());
+        }
+    }
+
+    @Override
+    public boolean performClick() {
+        if (mPopup != null && !mPopup.isShowing()) {
+            mPopup.show();
+            return true;
+        }
+        return super.performClick();
+    }
+
+    @Override
+    public void setPrompt(CharSequence prompt) {
+        if (mPopup != null) {
+            mPopup.setPromptText(prompt);
+        } else {
+            super.setPrompt(prompt);
+        }
+    }
+
+    @Override
+    public CharSequence getPrompt() {
+        return mPopup != null ? mPopup.getHintText() : super.getPrompt();
     }
 
     @Override
@@ -122,7 +460,8 @@
 
     /**
      * This should be accessed via
-     * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)}
+     * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View,
+     * ColorStateList)}
      *
      * @hide
      */
@@ -148,7 +487,8 @@
 
     /**
      * This should be accessed via
-     * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)}
+     * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View,
+     * PorterDuff.Mode)}
      *
      * @hide
      */
@@ -179,4 +519,300 @@
             mBackgroundTintHelper.applySupportBackgroundTint();
         }
     }
+
+    private int compatMeasureContentWidth(SpinnerAdapter adapter, Drawable background) {
+        if (adapter == null) {
+            return 0;
+        }
+
+        int width = 0;
+        View itemView = null;
+        int itemType = 0;
+        final int widthMeasureSpec =
+                MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.UNSPECIFIED);
+        final int heightMeasureSpec =
+                MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED);
+
+        // Make sure the number of items we'll measure is capped. If it's a huge data set
+        // with wildly varying sizes, oh well.
+        int start = Math.max(0, getSelectedItemPosition());
+        final int end = Math.min(adapter.getCount(), start + MAX_ITEMS_MEASURED);
+        final int count = end - start;
+        start = Math.max(0, start - (MAX_ITEMS_MEASURED - count));
+        for (int i = start; i < end; i++) {
+            final int positionType = adapter.getItemViewType(i);
+            if (positionType != itemType) {
+                itemType = positionType;
+                itemView = null;
+            }
+            itemView = adapter.getView(i, itemView, this);
+            if (itemView.getLayoutParams() == null) {
+                itemView.setLayoutParams(new LayoutParams(
+                        LayoutParams.WRAP_CONTENT,
+                        LayoutParams.WRAP_CONTENT));
+            }
+            itemView.measure(widthMeasureSpec, heightMeasureSpec);
+            width = Math.max(width, itemView.getMeasuredWidth());
+        }
+
+        // Add background padding to measured width
+        if (background != null) {
+            background.getPadding(mTempRect);
+            width += mTempRect.left + mTempRect.right;
+        }
+
+        return width;
+    }
+
+    /**
+     * <p>Wrapper class for an Adapter. Transforms the embedded Adapter instance
+     * into a ListAdapter.</p>
+     */
+    private static class DropDownAdapter implements ListAdapter, SpinnerAdapter {
+
+        private SpinnerAdapter mAdapter;
+
+        private ListAdapter mListAdapter;
+
+        /**
+         * Creates a new ListAdapter wrapper for the specified adapter.
+         *
+         * @param adapter       the SpinnerAdapter to transform into a ListAdapter
+         * @param dropDownTheme the theme against which to inflate drop-down
+         *                      views, may be {@null} to use default theme
+         */
+        public DropDownAdapter(@Nullable SpinnerAdapter adapter,
+                @Nullable Resources.Theme dropDownTheme) {
+            mAdapter = adapter;
+
+            if (adapter instanceof ListAdapter) {
+                mListAdapter = (ListAdapter) adapter;
+            }
+
+            if (dropDownTheme != null) {
+                 if (IS_AT_LEAST_M && adapter instanceof android.widget.ThemedSpinnerAdapter) {
+                    final android.widget.ThemedSpinnerAdapter themedAdapter =
+                            (android.widget.ThemedSpinnerAdapter) adapter;
+                    if (themedAdapter.getDropDownViewTheme() != dropDownTheme) {
+                        themedAdapter.setDropDownViewTheme(dropDownTheme);
+                    }
+                } else if (adapter instanceof ThemedSpinnerAdapter) {
+                    final ThemedSpinnerAdapter themedAdapter = (ThemedSpinnerAdapter) adapter;
+                    if (themedAdapter.getDropDownViewTheme() == null) {
+                        themedAdapter.setDropDownViewTheme(dropDownTheme);
+                    }
+                }
+            }
+        }
+
+        public int getCount() {
+            return mAdapter == null ? 0 : mAdapter.getCount();
+        }
+
+        public Object getItem(int position) {
+            return mAdapter == null ? null : mAdapter.getItem(position);
+        }
+
+        public long getItemId(int position) {
+            return mAdapter == null ? -1 : mAdapter.getItemId(position);
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            return getDropDownView(position, convertView, parent);
+        }
+
+        public View getDropDownView(int position, View convertView, ViewGroup parent) {
+            return (mAdapter == null) ? null
+                    : mAdapter.getDropDownView(position, convertView, parent);
+        }
+
+        public boolean hasStableIds() {
+            return mAdapter != null && mAdapter.hasStableIds();
+        }
+
+        public void registerDataSetObserver(DataSetObserver observer) {
+            if (mAdapter != null) {
+                mAdapter.registerDataSetObserver(observer);
+            }
+        }
+
+        public void unregisterDataSetObserver(DataSetObserver observer) {
+            if (mAdapter != null) {
+                mAdapter.unregisterDataSetObserver(observer);
+            }
+        }
+
+        /**
+         * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call.
+         * Otherwise, return true.
+         */
+        public boolean areAllItemsEnabled() {
+            final ListAdapter adapter = mListAdapter;
+            if (adapter != null) {
+                return adapter.areAllItemsEnabled();
+            } else {
+                return true;
+            }
+        }
+
+        /**
+         * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call.
+         * Otherwise, return true.
+         */
+        public boolean isEnabled(int position) {
+            final ListAdapter adapter = mListAdapter;
+            if (adapter != null) {
+                return adapter.isEnabled(position);
+            } else {
+                return true;
+            }
+        }
+
+        public int getItemViewType(int position) {
+            return 0;
+        }
+
+        public int getViewTypeCount() {
+            return 1;
+        }
+
+        public boolean isEmpty() {
+            return getCount() == 0;
+        }
+    }
+
+    private class DropdownPopup extends ListPopupWindow {
+        private CharSequence mHintText;
+        private ListAdapter mAdapter;
+        private final Rect mVisibleRect = new Rect();
+
+        public DropdownPopup(Context context, AttributeSet attrs, int defStyleAttr) {
+            super(context, attrs, defStyleAttr);
+
+            setAnchorView(AppCompatSpinner.this);
+            setModal(true);
+            setPromptPosition(POSITION_PROMPT_ABOVE);
+
+            setOnItemClickListener(new AdapterView.OnItemClickListener() {
+                @Override
+                public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+                    AppCompatSpinner.this.setSelection(position);
+                    if (getOnItemClickListener() != null) {
+                        AppCompatSpinner.this
+                                .performItemClick(v, position, mAdapter.getItemId(position));
+                    }
+                    dismiss();
+                }
+            });
+        }
+
+        @Override
+        public void setAdapter(ListAdapter adapter) {
+            super.setAdapter(adapter);
+            mAdapter = adapter;
+        }
+
+        public CharSequence getHintText() {
+            return mHintText;
+        }
+
+        public void setPromptText(CharSequence hintText) {
+            // Hint text is ignored for dropdowns, but maintain it here.
+            mHintText = hintText;
+        }
+
+        void computeContentWidth() {
+            final Drawable background = getBackground();
+            int hOffset = 0;
+            if (background != null) {
+                background.getPadding(mTempRect);
+                hOffset = ViewUtils.isLayoutRtl(AppCompatSpinner.this) ? mTempRect.right
+                        : -mTempRect.left;
+            } else {
+                mTempRect.left = mTempRect.right = 0;
+            }
+
+            final int spinnerPaddingLeft = AppCompatSpinner.this.getPaddingLeft();
+            final int spinnerPaddingRight = AppCompatSpinner.this.getPaddingRight();
+            final int spinnerWidth = AppCompatSpinner.this.getWidth();
+            if (mDropDownWidth == WRAP_CONTENT) {
+                int contentWidth = compatMeasureContentWidth(
+                        (SpinnerAdapter) mAdapter, getBackground());
+                final int contentWidthLimit = getContext().getResources()
+                        .getDisplayMetrics().widthPixels - mTempRect.left - mTempRect.right;
+                if (contentWidth > contentWidthLimit) {
+                    contentWidth = contentWidthLimit;
+                }
+                setContentWidth(Math.max(
+                        contentWidth, spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight));
+            } else if (mDropDownWidth == MATCH_PARENT) {
+                setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight);
+            } else {
+                setContentWidth(mDropDownWidth);
+            }
+            if (ViewUtils.isLayoutRtl(AppCompatSpinner.this)) {
+                hOffset += spinnerWidth - spinnerPaddingRight - getWidth();
+            } else {
+                hOffset += spinnerPaddingLeft;
+            }
+            setHorizontalOffset(hOffset);
+        }
+
+        public void show() {
+            final boolean wasShowing = isShowing();
+
+            computeContentWidth();
+
+            setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+            super.show();
+            final ListView listView = getListView();
+            listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+            setSelection(AppCompatSpinner.this.getSelectedItemPosition());
+
+            if (wasShowing) {
+                // Skip setting up the layout/dismiss listener below. If we were previously
+                // showing it will still stick around.
+                return;
+            }
+
+            // Make sure we hide if our anchor goes away.
+            // TODO: This might be appropriate to push all the way down to PopupWindow,
+            // but it may have other side effects to investigate first. (Text editing handles, etc.)
+            final ViewTreeObserver vto = getViewTreeObserver();
+            if (vto != null) {
+                final ViewTreeObserver.OnGlobalLayoutListener layoutListener
+                        = new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        if (!isVisibleToUser(AppCompatSpinner.this)) {
+                            dismiss();
+                        } else {
+                            computeContentWidth();
+
+                            // Use super.show here to update; we don't want to move the selected
+                            // position or adjust other things that would be reset otherwise.
+                            DropdownPopup.super.show();
+                        }
+                    }
+                };
+                vto.addOnGlobalLayoutListener(layoutListener);
+                setOnDismissListener(new PopupWindow.OnDismissListener() {
+                    @Override
+                    public void onDismiss() {
+                        final ViewTreeObserver vto = getViewTreeObserver();
+                        if (vto != null) {
+                            vto.removeGlobalOnLayoutListener(layoutListener);
+                        }
+                    }
+                });
+            }
+        }
+
+        /**
+         * Simplified version of the the hidden View.isVisibleToUser()
+         */
+        private boolean isVisibleToUser(View view) {
+            return ViewCompat.isAttachedToWindow(view) && view.getGlobalVisibleRect(mVisibleRect);
+        }
+    }
 }
diff --git a/v7/appcompat/src/android/support/v7/widget/ThemedSpinnerAdapter.java b/v7/appcompat/src/android/support/v7/widget/ThemedSpinnerAdapter.java
new file mode 100644
index 0000000..95974a6
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/widget/ThemedSpinnerAdapter.java
@@ -0,0 +1,55 @@
+/*
+ * 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 android.support.v7.widget;
+
+
+import android.content.res.Resources;
+import android.content.res.Resources.Theme;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SpinnerAdapter;
+
+/**
+ * An extension of SpinnerAdapter that is capable of inflating drop-down views
+ * against a different theme than normal views.
+ * <p>
+ * Classes that implement this interface should use the theme provided to
+ * {@link #setDropDownViewTheme(Theme)} when creating views in
+ * {@link SpinnerAdapter#getDropDownView(int, View, ViewGroup)}.
+ */
+public interface ThemedSpinnerAdapter extends SpinnerAdapter {
+    /**
+     * Sets the {@link Resources.Theme} against which drop-down views are
+     * inflated.
+     *
+     * @param theme the context against which to inflate drop-down views, or
+     *              {@code null} to use the default theme
+     * @see SpinnerAdapter#getDropDownView(int, View, ViewGroup)
+     */
+    void setDropDownViewTheme(@Nullable Resources.Theme theme);
+
+    /**
+     * Returns the value previously set by a call to
+     * {@link #setDropDownViewTheme(Theme)}.
+     *
+     * @return the {@link Resources.Theme} against which drop-down views are
+     *         inflated, or {@code null} if one has not been explicitly set
+     */
+    @Nullable
+    Resources.Theme getDropDownViewTheme();
+}
diff --git a/v7/recyclerview/api/current.txt b/v7/recyclerview/api/current.txt
index f48e8fe..6ba5ae0 100644
--- a/v7/recyclerview/api/current.txt
+++ b/v7/recyclerview/api/current.txt
@@ -338,14 +338,17 @@
     method public final boolean hasStableIds();
     method public final void notifyDataSetChanged();
     method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, java.lang.Object);
     method public final void notifyItemInserted(int);
     method public final void notifyItemMoved(int, int);
     method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
     method public final void notifyItemRangeInserted(int, int);
     method public final void notifyItemRangeRemoved(int, int);
     method public final void notifyItemRemoved(int);
     method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
     method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
     method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
     method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
     method public boolean onFailedToRecycleView(VH);
@@ -361,6 +364,7 @@
     ctor public RecyclerView.AdapterDataObserver();
     method public void onChanged();
     method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, java.lang.Object);
     method public void onItemRangeInserted(int, int);
     method public void onItemRangeMoved(int, int, int);
     method public void onItemRangeRemoved(int, int);
@@ -517,6 +521,7 @@
     method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
     method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
     method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
     method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
     method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
     method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
@@ -625,7 +630,7 @@
     method public int getChildPosition(android.view.View);
     method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
     method public int getTargetPosition();
-    method public void instantScrollToPosition(int);
+    method public deprecated void instantScrollToPosition(int);
     method public boolean isPendingInitialRun();
     method public boolean isRunning();
     method protected void normalize(android.graphics.PointF);
@@ -646,6 +651,7 @@
     method public int getDx();
     method public int getDy();
     method public android.view.animation.Interpolator getInterpolator();
+    method public void jumpTo(int);
     method public void setDuration(int);
     method public void setDx(int);
     method public void setDy(int);
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java b/v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java
index 68371c5..ba6ec71 100644
--- a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java
+++ b/v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java
@@ -114,11 +114,12 @@
             }
 
             @Override
-            public void markViewHoldersUpdated(int positionStart, int itemCount) {
+            public void markViewHoldersUpdated(int positionStart, int itemCount, Object payload) {
                 final int positionEnd = positionStart + itemCount;
                 for (ViewHolder holder : mViewHolders) {
                     if (holder.mPosition >= positionStart && holder.mPosition < positionEnd) {
                         holder.addFlags(ViewHolder.FLAG_UPDATE);
+                        holder.addChangePayload(payload);
                     }
                 }
             }
@@ -815,6 +816,15 @@
     }
 
     @Test
+    public void testPayloads() {
+        setupBasic(10, 2, 2);
+        up(3, 3, "payload");
+        preProcess();
+        assertOps(mFirstPassUpdates, upOp(4, 2, "payload"));
+        assertOps(mSecondPassUpdates, upOp(3, 1, "payload"));
+    }
+
+    @Test
     public void testRandom() throws Throwable {
         mCollectLogs = true;
         Random random = new Random(System.nanoTime());
@@ -840,7 +850,7 @@
         setupBasic(count, start, layoutCount);
 
         while (opCount-- > 0) {
-            final int op = nextInt(random, 4);
+            final int op = nextInt(random, 5);
             switch (op) {
                 case 0:
                     if (mTestAdapter.mItems.size() > 1) {
@@ -871,6 +881,13 @@
                         up(s, len);
                     }
                     break;
+                case 4:
+                    if (mTestAdapter.mItems.size() > 1) {
+                        s = nextInt(random, mTestAdapter.mItems.size() - 1);
+                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
+                        up(s, len, Integer.toString(s));
+                    }
+                    break;
             }
         }
         preProcess();
@@ -945,7 +962,11 @@
     }
 
     AdapterHelper.UpdateOp op(int cmd, int start, int count) {
-        return new AdapterHelper.UpdateOp(cmd, start, count);
+        return new AdapterHelper.UpdateOp(cmd, start, count, null);
+    }
+
+    AdapterHelper.UpdateOp op(int cmd, int start, int count, Object payload) {
+        return new AdapterHelper.UpdateOp(cmd, start, count, payload);
     }
 
     AdapterHelper.UpdateOp addOp(int start, int count) {
@@ -956,8 +977,8 @@
         return op(AdapterHelper.UpdateOp.REMOVE, start, count);
     }
 
-    AdapterHelper.UpdateOp upOp(int start, int count) {
-        return op(AdapterHelper.UpdateOp.UPDATE, start, count);
+    AdapterHelper.UpdateOp upOp(int start, int count, Object payload) {
+        return op(AdapterHelper.UpdateOp.UPDATE, start, count, payload);
     }
 
     void add(int start, int count) {
@@ -1003,6 +1024,13 @@
         mTestAdapter.update(start, count);
     }
 
+    void up(int start, int count, Object payload) {
+        if (DEBUG) {
+            log("up(" + start + "," + count + "," + payload + ");");
+        }
+        mTestAdapter.update(start, count, payload);
+    }
+
     static class TestAdapter {
 
         List<Item> mItems;
@@ -1027,14 +1055,14 @@
                 mItems.add(index + i, item);
             }
             mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
-                    AdapterHelper.UpdateOp.ADD, index, count
+                    AdapterHelper.UpdateOp.ADD, index, count, null
             ));
         }
 
         public void move(int from, int to) {
             mItems.add(to, mItems.remove(from));
             mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
-                    AdapterHelper.UpdateOp.MOVE, from, to
+                    AdapterHelper.UpdateOp.MOVE, from, to, null
             ));
         }
 
@@ -1043,16 +1071,20 @@
                 mItems.remove(index);
             }
             mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
-                    AdapterHelper.UpdateOp.REMOVE, index, count
+                    AdapterHelper.UpdateOp.REMOVE, index, count, null
             ));
         }
 
         public void update(int index, int count) {
+            update(index, count, null);
+        }
+
+        public void update(int index, int count, Object payload) {
             for (int i = 0; i < count; i++) {
-                mItems.get(index + i).update();
+                mItems.get(index + i).update(payload);
             }
             mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
-                    AdapterHelper.UpdateOp.UPDATE, index, count
+                    AdapterHelper.UpdateOp.UPDATE, index, count, payload
             ));
         }
 
@@ -1080,7 +1112,7 @@
                         break;
                     case AdapterHelper.UpdateOp.UPDATE:
                         for (int i = 0; i < op.itemCount; i++) {
-                            mItems.get(i).handleUpdate();
+                            mItems.get(op.positionStart + i).handleUpdate(op.payload);
                         }
                         break;
                     case AdapterHelper.UpdateOp.MOVE:
@@ -1107,22 +1139,25 @@
 
             private int mVersionCount = 0;
 
-            private int mUpdateCount;
+            private ArrayList<Object> mPayloads = new ArrayList<Object>();
 
             public Item() {
                 id = itemCounter.incrementAndGet();
             }
 
-            public void update() {
+            public void update(Object payload) {
+                mPayloads.add(payload);
                 mVersionCount++;
             }
 
-            public void handleUpdate() {
+            public void handleUpdate(Object payload) {
+                assertSame(payload, mPayloads.get(0));
+                mPayloads.remove(0);
                 mVersionCount--;
             }
 
             public int getUpdateCount() {
-                return mUpdateCount;
+                return mVersionCount;
             }
         }
     }
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java b/v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java
index 4289aea..06bfce6 100644
--- a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java
+++ b/v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java
@@ -49,8 +49,8 @@
 
     OpReorderer mOpReorderer = new OpReorderer(new OpReorderer.Callback() {
         @Override
-        public UpdateOp obtainUpdateOp(int cmd, int startPosition, int itemCount) {
-            return new UpdateOp(cmd, startPosition, itemCount);
+        public UpdateOp obtainUpdateOp(int cmd, int startPosition, int itemCount, Object payload) {
+            return new UpdateOp(cmd, startPosition, itemCount, payload);
         }
 
         @Override
@@ -283,20 +283,20 @@
 
     UpdateOp rm(int start, int count) {
         updatedItemCount -= count;
-        return record(new UpdateOp(REMOVE, start, count));
+        return record(new UpdateOp(REMOVE, start, count, null));
     }
 
     UpdateOp mv(int from, int to) {
-        return record(new UpdateOp(MOVE, from, to));
+        return record(new UpdateOp(MOVE, from, to, null));
     }
 
     UpdateOp add(int start, int count) {
         updatedItemCount += count;
-        return record(new UpdateOp(ADD, start, count));
+        return record(new UpdateOp(ADD, start, count, null));
     }
 
     UpdateOp up(int start, int count) {
-        return record(new UpdateOp(UPDATE, start, count));
+        return record(new UpdateOp(UPDATE, start, count, null));
     }
 
     UpdateOp record(UpdateOp op) {
@@ -407,7 +407,7 @@
     private List<UpdateOp> rewriteOps(List<UpdateOp> updateOps) {
         List<UpdateOp> copy = new ArrayList<UpdateOp>();
         for (UpdateOp op : updateOps) {
-            copy.add(new UpdateOp(op.cmd, op.positionStart, op.itemCount));
+            copy.add(new UpdateOp(op.cmd, op.positionStart, op.itemCount, null));
         }
         mOpReorderer.reorderOps(copy);
         return copy;
diff --git a/v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java b/v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java
index 032449c..e9feab8 100644
--- a/v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java
@@ -145,7 +145,7 @@
                 if (type == POSITION_TYPE_INVISIBLE) {
                     // Looks like we have other updates that we cannot merge with this one.
                     // Create an UpdateOp and dispatch it to LayoutManager.
-                    UpdateOp newOp = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount);
+                    UpdateOp newOp = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount, null);
                     dispatchAndUpdateViewHolders(newOp);
                     typeChanged = true;
                 }
@@ -156,7 +156,7 @@
                 if (type == POSITION_TYPE_NEW_OR_LAID_OUT) {
                     // Looks like we have other updates that we cannot merge with this one.
                     // Create UpdateOp op and dispatch it to LayoutManager.
-                    UpdateOp newOp = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount);
+                    UpdateOp newOp = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount, null);
                     postponeAndUpdateViewHolders(newOp);
                     typeChanged = true;
                 }
@@ -172,7 +172,7 @@
         }
         if (tmpCount != op.itemCount) { // all 1 effect
             recycleUpdateOp(op);
-            op = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount);
+            op = obtainUpdateOp(UpdateOp.REMOVE, tmpStart, tmpCount, null);
         }
         if (type == POSITION_TYPE_INVISIBLE) {
             dispatchAndUpdateViewHolders(op);
@@ -190,7 +190,8 @@
             ViewHolder vh = mCallback.findViewHolder(position);
             if (vh != null || canFindInPreLayout(position)) { // deferred
                 if (type == POSITION_TYPE_INVISIBLE) {
-                    UpdateOp newOp = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount);
+                    UpdateOp newOp = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount,
+                            op.payload);
                     dispatchAndUpdateViewHolders(newOp);
                     tmpCount = 0;
                     tmpStart = position;
@@ -198,7 +199,8 @@
                 type = POSITION_TYPE_NEW_OR_LAID_OUT;
             } else { // applied
                 if (type == POSITION_TYPE_NEW_OR_LAID_OUT) {
-                    UpdateOp newOp = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount);
+                    UpdateOp newOp = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount,
+                            op.payload);
                     postponeAndUpdateViewHolders(newOp);
                     tmpCount = 0;
                     tmpStart = position;
@@ -208,8 +210,9 @@
             tmpCount++;
         }
         if (tmpCount != op.itemCount) { // all 1 effect
+            Object payload = op.payload;
             recycleUpdateOp(op);
-            op = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount);
+            op = obtainUpdateOp(UpdateOp.UPDATE, tmpStart, tmpCount, payload);
         }
         if (type == POSITION_TYPE_INVISIBLE) {
             dispatchAndUpdateViewHolders(op);
@@ -272,7 +275,7 @@
                 tmpCnt++;
             } else {
                 // need to dispatch this separately
-                UpdateOp tmp = obtainUpdateOp(op.cmd, tmpStart, tmpCnt);
+                UpdateOp tmp = obtainUpdateOp(op.cmd, tmpStart, tmpCnt, op.payload);
                 if (DEBUG) {
                     Log.d(TAG, "need to dispatch separately " + tmp);
                 }
@@ -285,9 +288,10 @@
                 tmpCnt = 1;
             }
         }
+        Object payload = op.payload;
         recycleUpdateOp(op);
         if (tmpCnt > 0) {
-            UpdateOp tmp = obtainUpdateOp(op.cmd, tmpStart, tmpCnt);
+            UpdateOp tmp = obtainUpdateOp(op.cmd, tmpStart, tmpCnt, payload);
             if (DEBUG) {
                 Log.d(TAG, "dispatching:" + tmp);
             }
@@ -311,7 +315,7 @@
                 mCallback.offsetPositionsForRemovingInvisible(offsetStart, op.itemCount);
                 break;
             case UpdateOp.UPDATE:
-                mCallback.markViewHoldersUpdated(offsetStart, op.itemCount);
+                mCallback.markViewHoldersUpdated(offsetStart, op.itemCount, op.payload);
                 break;
             default:
                 throw new IllegalArgumentException("only remove and update ops can be dispatched"
@@ -442,7 +446,7 @@
                         op.itemCount);
                 break;
             case UpdateOp.UPDATE:
-                mCallback.markViewHoldersUpdated(op.positionStart, op.itemCount);
+                mCallback.markViewHoldersUpdated(op.positionStart, op.itemCount, op.payload);
                 break;
             default:
                 throw new IllegalArgumentException("Unknown update op type for " + op);
@@ -489,8 +493,8 @@
     /**
      * @return True if updates should be processed.
      */
-    boolean onItemRangeChanged(int positionStart, int itemCount) {
-        mPendingUpdates.add(obtainUpdateOp(UpdateOp.UPDATE, positionStart, itemCount));
+    boolean onItemRangeChanged(int positionStart, int itemCount, Object payload) {
+        mPendingUpdates.add(obtainUpdateOp(UpdateOp.UPDATE, positionStart, itemCount, payload));
         return mPendingUpdates.size() == 1;
     }
 
@@ -498,7 +502,7 @@
      * @return True if updates should be processed.
      */
     boolean onItemRangeInserted(int positionStart, int itemCount) {
-        mPendingUpdates.add(obtainUpdateOp(UpdateOp.ADD, positionStart, itemCount));
+        mPendingUpdates.add(obtainUpdateOp(UpdateOp.ADD, positionStart, itemCount, null));
         return mPendingUpdates.size() == 1;
     }
 
@@ -506,7 +510,7 @@
      * @return True if updates should be processed.
      */
     boolean onItemRangeRemoved(int positionStart, int itemCount) {
-        mPendingUpdates.add(obtainUpdateOp(UpdateOp.REMOVE, positionStart, itemCount));
+        mPendingUpdates.add(obtainUpdateOp(UpdateOp.REMOVE, positionStart, itemCount, null));
         return mPendingUpdates.size() == 1;
     }
 
@@ -520,7 +524,7 @@
         if (itemCount != 1) {
             throw new IllegalArgumentException("Moving more than 1 item is not supported yet");
         }
-        mPendingUpdates.add(obtainUpdateOp(UpdateOp.MOVE, from, to));
+        mPendingUpdates.add(obtainUpdateOp(UpdateOp.MOVE, from, to, null));
         return mPendingUpdates.size() == 1;
     }
 
@@ -545,7 +549,7 @@
                     break;
                 case UpdateOp.UPDATE:
                     mCallback.onDispatchSecondPass(op);
-                    mCallback.markViewHoldersUpdated(op.positionStart, op.itemCount);
+                    mCallback.markViewHoldersUpdated(op.positionStart, op.itemCount, op.payload);
                     break;
                 case UpdateOp.MOVE:
                     mCallback.onDispatchSecondPass(op);
@@ -614,13 +618,16 @@
 
         int positionStart;
 
+        Object payload;
+
         // holds the target position if this is a MOVE
         int itemCount;
 
-        UpdateOp(int cmd, int positionStart, int itemCount) {
+        UpdateOp(int cmd, int positionStart, int itemCount, Object payload) {
             this.cmd = cmd;
             this.positionStart = positionStart;
             this.itemCount = itemCount;
+            this.payload = payload;
         }
 
         String cmdToString() {
@@ -639,7 +646,9 @@
 
         @Override
         public String toString() {
-            return "[" + cmdToString() + ",s:" + positionStart + "c:" + itemCount + "]";
+            return Integer.toHexString(System.identityHashCode(this))
+                    + "[" + cmdToString() + ",s:" + positionStart + "c:" + itemCount
+                    +",p:"+payload + "]";
         }
 
         @Override
@@ -668,6 +677,13 @@
             if (positionStart != op.positionStart) {
                 return false;
             }
+            if (payload != null) {
+                if (!payload.equals(op.payload)) {
+                    return false;
+                }
+            } else if (op.payload != null) {
+                return false;
+            }
 
             return true;
         }
@@ -682,14 +698,15 @@
     }
 
     @Override
-    public UpdateOp obtainUpdateOp(int cmd, int positionStart, int itemCount) {
+    public UpdateOp obtainUpdateOp(int cmd, int positionStart, int itemCount, Object payload) {
         UpdateOp op = mUpdateOpPool.acquire();
         if (op == null) {
-            op = new UpdateOp(cmd, positionStart, itemCount);
+            op = new UpdateOp(cmd, positionStart, itemCount, payload);
         } else {
             op.cmd = cmd;
             op.positionStart = positionStart;
             op.itemCount = itemCount;
+            op.payload = payload;
         }
         return op;
     }
@@ -697,6 +714,7 @@
     @Override
     public void recycleUpdateOp(UpdateOp op) {
         if (!mDisableRecycler) {
+            op.payload = null;
             mUpdateOpPool.release(op);
         }
     }
@@ -720,7 +738,7 @@
 
         void offsetPositionsForRemovingLaidOutOrNewView(int positionStart, int itemCount);
 
-        void markViewHoldersUpdated(int positionStart, int itemCount);
+        void markViewHoldersUpdated(int positionStart, int itemCount, Object payloads);
 
         void onDispatchFirstPass(UpdateOp updateOp);
 
diff --git a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
index ed135d8..b628978 100644
--- a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
@@ -209,7 +209,8 @@
     }
 
     @Override
-    public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount) {
+    public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount,
+            Object payload) {
         mSpanSizeLookup.invalidateSpanIndexCache();
     }
 
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
index c1e312c..f842ed5 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
@@ -29,6 +29,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
+import android.support.v7.widget.RecyclerView.LayoutParams;
 
 import java.util.List;
 
@@ -175,8 +176,8 @@
      * {@inheritDoc}
      */
     @Override
-    public RecyclerView.LayoutParams generateDefaultLayoutParams() {
-        return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+    public LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT);
     }
 
@@ -1377,7 +1378,7 @@
             result.mFinished = true;
             return;
         }
-        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
+        LayoutParams params = (LayoutParams) view.getLayoutParams();
         if (layoutState.mScrapList == null) {
             if (mShouldReverseLayout == (layoutState.mLayoutDirection
                     == LayoutState.LAYOUT_START)) {
@@ -1587,7 +1588,7 @@
             final View view = getChildAt(i);
             final int position = getPosition(view);
             if (position >= 0 && position < itemCount) {
-                if (((RecyclerView.LayoutParams) view.getLayoutParams()).isItemRemoved()) {
+                if (((LayoutParams) view.getLayoutParams()).isItemRemoved()) {
                     if (invalidMatch == null) {
                         invalidMatch = view; // removed item, least preferred
                     }
@@ -1973,13 +1974,14 @@
         private View nextViewFromScrapList() {
             final int size = mScrapList.size();
             for (int i = 0; i < size; i++) {
-                final RecyclerView.ViewHolder viewHolder = mScrapList.get(i);
-                if (viewHolder.isRemoved()) {
+                final View view = mScrapList.get(i).itemView;
+                final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+                if (lp.isItemRemoved()) {
                     continue;
                 }
-                if (mCurrentPosition == viewHolder.getLayoutPosition()) {
-                    assignPositionFromScrapList(viewHolder);
-                    return viewHolder.itemView;
+                if (mCurrentPosition == lp.getViewLayoutPosition()) {
+                    assignPositionFromScrapList(view);
+                    return view;
                 }
             }
             return null;
@@ -1989,31 +1991,36 @@
             assignPositionFromScrapList(null);
         }
 
-        public void assignPositionFromScrapList(RecyclerView.ViewHolder ignore) {
-            RecyclerView.ViewHolder closest = nextViewHolderInLimitedList(ignore);
-            mCurrentPosition = closest == null ? RecyclerView.NO_POSITION :
-                    closest.getLayoutPosition();
+        public void assignPositionFromScrapList(View ignore) {
+            final View closest = nextViewInLimitedList(ignore);
+            if (closest == null) {
+                mCurrentPosition = NO_POSITION;
+            } else {
+                mCurrentPosition = ((LayoutParams) closest.getLayoutParams())
+                        .getViewLayoutPosition();
+            }
         }
 
-        public RecyclerView.ViewHolder nextViewHolderInLimitedList(RecyclerView.ViewHolder ignore) {
+        public View nextViewInLimitedList(View ignore) {
             int size = mScrapList.size();
-            RecyclerView.ViewHolder closest = null;
+            View closest = null;
             int closestDistance = Integer.MAX_VALUE;
             if (DEBUG && mIsPreLayout) {
                 throw new IllegalStateException("Scrap list cannot be used in pre layout");
             }
             for (int i = 0; i < size; i++) {
-                RecyclerView.ViewHolder viewHolder = mScrapList.get(i);
-                if (viewHolder == ignore || viewHolder.isRemoved()) {
+                View view = mScrapList.get(i).itemView;
+                final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+                if (view == ignore || lp.isItemRemoved()) {
                     continue;
                 }
-                final int distance = (viewHolder.getLayoutPosition() - mCurrentPosition) *
+                final int distance = (lp.getViewLayoutPosition() - mCurrentPosition) *
                         mItemDirection;
                 if (distance < 0) {
                     continue; // item is not in current direction
                 }
                 if (distance < closestDistance) {
-                    closest = viewHolder;
+                    closest = view;
                     closestDistance = distance;
                     if (distance == 0) {
                         break;
@@ -2120,7 +2127,7 @@
         }
 
         private boolean isViewValidAsAnchor(View child, RecyclerView.State state) {
-            RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) child.getLayoutParams();
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
             return !lp.isItemRemoved() && lp.getViewLayoutPosition() >= 0
                     && lp.getViewLayoutPosition() < state.getItemCount();
         }
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java b/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
index ed4c950..cda5cd1 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
@@ -229,8 +229,8 @@
                     + "LayoutManager#computeScrollVectorForPosition.\n"
                     + "Falling back to instant scroll");
             final int target = getTargetPosition();
+            action.jumpTo(target);
             stop();
-            instantScrollToPosition(target);
             return;
         }
         normalize(scrollVector);
diff --git a/v7/recyclerview/src/android/support/v7/widget/OpReorderer.java b/v7/recyclerview/src/android/support/v7/widget/OpReorderer.java
index e123ce8..db01a0c 100644
--- a/v7/recyclerview/src/android/support/v7/widget/OpReorderer.java
+++ b/v7/recyclerview/src/android/support/v7/widget/OpReorderer.java
@@ -100,7 +100,7 @@
         } else if (moveOp.positionStart < removeOp.positionStart + removeOp.itemCount) {
             final int remaining = removeOp.positionStart + removeOp.itemCount
                     - moveOp.positionStart;
-            extraRm = mCallback.obtainUpdateOp(REMOVE, moveOp.positionStart + 1, remaining);
+            extraRm = mCallback.obtainUpdateOp(REMOVE, moveOp.positionStart + 1, remaining, null);
             removeOp.itemCount = moveOp.positionStart - removeOp.positionStart;
         }
 
@@ -187,7 +187,7 @@
         } else if (moveOp.itemCount < updateOp.positionStart + updateOp.itemCount) {
             // moved item is updated. add an update for it
             updateOp.itemCount--;
-            extraUp1 = mCallback.obtainUpdateOp(UPDATE, moveOp.positionStart, 1);
+            extraUp1 = mCallback.obtainUpdateOp(UPDATE, moveOp.positionStart, 1, updateOp.payload);
         }
         // now affect of add is consumed. now apply effect of first remove
         if (moveOp.positionStart <= updateOp.positionStart) {
@@ -195,7 +195,8 @@
         } else if (moveOp.positionStart < updateOp.positionStart + updateOp.itemCount) {
             final int remaining = updateOp.positionStart + updateOp.itemCount
                     - moveOp.positionStart;
-            extraUp2 = mCallback.obtainUpdateOp(UPDATE, moveOp.positionStart + 1, remaining);
+            extraUp2 = mCallback.obtainUpdateOp(UPDATE, moveOp.positionStart + 1, remaining,
+                    updateOp.payload);
             updateOp.itemCount -= remaining;
         }
         list.set(update, moveOp);
@@ -230,7 +231,7 @@
 
     static interface Callback {
 
-        UpdateOp obtainUpdateOp(int cmd, int startPosition, int itemCount);
+        UpdateOp obtainUpdateOp(int cmd, int startPosition, int itemCount, Object payload);
 
         void recycleUpdateOp(UpdateOp op);
     }
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 564f8b6..0754c44 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -644,8 +644,8 @@
             }
 
             @Override
-            public void markViewHoldersUpdated(int positionStart, int itemCount) {
-                viewRangeUpdate(positionStart, itemCount);
+            public void markViewHoldersUpdated(int positionStart, int itemCount, Object payload) {
+                viewRangeUpdate(positionStart, itemCount, payload);
                 mItemsChanged = true;
             }
 
@@ -663,7 +663,8 @@
                         mLayout.onItemsRemoved(RecyclerView.this, op.positionStart, op.itemCount);
                         break;
                     case UpdateOp.UPDATE:
-                        mLayout.onItemsUpdated(RecyclerView.this, op.positionStart, op.itemCount);
+                        mLayout.onItemsUpdated(RecyclerView.this, op.positionStart, op.itemCount,
+                                op.payload);
                         break;
                     case UpdateOp.MOVE:
                         mLayout.onItemsMoved(RecyclerView.this, op.positionStart, op.itemCount, 1);
@@ -1272,6 +1273,14 @@
         awakenScrollBars();
     }
 
+    private void jumpToPositionForSmoothScroller(int position) {
+        if (mLayout == null) {
+            return;
+        }
+        mLayout.scrollToPosition(position);
+        awakenScrollBars();
+    }
+
     /**
      * Starts a smooth scroll to an adapter position.
      * <p>
@@ -3257,7 +3266,7 @@
      * @param positionStart Adapter position to start at
      * @param itemCount Number of views that must explicitly be rebound
      */
-    void viewRangeUpdate(int positionStart, int itemCount) {
+    void viewRangeUpdate(int positionStart, int itemCount, Object payload) {
         final int childCount = mChildHelper.getUnfilteredChildCount();
         final int positionEnd = positionStart + itemCount;
 
@@ -3271,6 +3280,7 @@
                 // We re-bind these view holders after pre-processing is complete so that
                 // ViewHolders have their final positions assigned.
                 holder.addFlags(ViewHolder.FLAG_UPDATE);
+                holder.addChangePayload(payload);
                 if (supportsChangeAnimations()) {
                     holder.addFlags(ViewHolder.FLAG_CHANGED);
                 }
@@ -3798,6 +3808,8 @@
                             }
                         }
                     }
+                    onExitLayoutOrScroll();
+                    resumeRequestLayout(false);
 
                     if (smoothScroller != null && !smoothScroller.isPendingInitialRun() &&
                             smoothScroller.isRunning()) {
@@ -3811,8 +3823,6 @@
                             smoothScroller.onAnimation(dx - overscrollX, dy - overscrollY);
                         }
                     }
-                    onExitLayoutOrScroll();
-                    resumeRequestLayout(false);
                 }
                 if (!mItemDecorations.isEmpty()) {
                     invalidate();
@@ -3865,8 +3875,13 @@
                 }
             }
             // call this after the onAnimation is complete not to have inconsistent callbacks etc.
-            if (smoothScroller != null && smoothScroller.isPendingInitialRun()) {
-                smoothScroller.onAnimation(0, 0);
+            if (smoothScroller != null) {
+                if (smoothScroller.isPendingInitialRun()) {
+                    smoothScroller.onAnimation(0, 0);
+                }
+                if (!mReSchedulePostAnimationCallback) {
+                    smoothScroller.stop(); //stop if it does not trigger any scroll
+                }
             }
             enableRunOnAnimationRequests();
         }
@@ -3978,9 +3993,9 @@
         }
 
         @Override
-        public void onItemRangeChanged(int positionStart, int itemCount) {
+        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
             assertNotInLayoutOrScroll(null);
-            if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount)) {
+            if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount, payload)) {
                 triggerUpdateProcessor();
             }
         }
@@ -4977,6 +4992,7 @@
                     final ViewHolder holder = mCachedViews.get(i);
                     if (holder != null) {
                         holder.addFlags(ViewHolder.FLAG_UPDATE | ViewHolder.FLAG_INVALID);
+                        holder.addChangePayload(null);
                     }
                 }
             } else {
@@ -5068,9 +5084,9 @@
          * layout file.
          * <p>
          * The new ViewHolder will be used to display items of the adapter using
-         * {@link #onBindViewHolder(ViewHolder, int)}. Since it will be re-used to display different
-         * items in the data set, it is a good idea to cache references to sub views of the View to
-         * avoid unnecessary {@link View#findViewById(int)} calls.
+         * {@link #onBindViewHolder(ViewHolder, int, List)}. Since it will be re-used to display
+         * different items in the data set, it is a good idea to cache references to sub views of
+         * the View to avoid unnecessary {@link View#findViewById(int)} calls.
          *
          * @param parent The ViewGroup into which the new View will be added after it is bound to
          *               an adapter position.
@@ -5083,23 +5099,59 @@
         public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
 
         /**
+         * Called by RecyclerView to display the data at the specified position. This method should
+         * update the contents of the {@link ViewHolder#itemView} to reflect the item at the given
+         * position.
+         * <p>
+         * Note that unlike {@link android.widget.ListView}, RecyclerView will not call this method
+         * again if the position of the item changes in the data set unless the item itself is
+         * invalidated or the new position cannot be determined. For this reason, you should only
+         * use the <code>position</code> parameter while acquiring the related data item inside
+         * this method and should not keep a copy of it. If you need the position of an item later
+         * on (e.g. in a click listener), use {@link ViewHolder#getAdapterPosition()} which will
+         * have the updated adapter position.
+         *
+         * Override {@link #onBindViewHolder(ViewHolder, int, List)} instead if Adapter can
+         * handle effcient partial bind.
+         *
+         * @param holder The ViewHolder which should be updated to represent the contents of the
+         *        item at the given position in the data set.
+         * @param position The position of the item within the adapter's data set.
+         */
+        public abstract void onBindViewHolder(VH holder, int position);
+
+        /**
          * Called by RecyclerView to display the data at the specified position. This method
          * should update the contents of the {@link ViewHolder#itemView} to reflect the item at
          * the given position.
          * <p>
-         * Note that unlike {@link android.widget.ListView}, RecyclerView will not call this
-         * method again if the position of the item changes in the data set unless the item itself
-         * is invalidated or the new position cannot be determined. For this reason, you should only
-         * use the <code>position</code> parameter while acquiring the related data item inside this
-         * method and should not keep a copy of it. If you need the position of an item later on
-         * (e.g. in a click listener), use {@link ViewHolder#getAdapterPosition()} which will have
-         * the updated adapter position.
+         * Note that unlike {@link android.widget.ListView}, RecyclerView will not call this method
+         * again if the position of the item changes in the data set unless the item itself is
+         * invalidated or the new position cannot be determined. For this reason, you should only
+         * use the <code>position</code> parameter while acquiring the related data item inside
+         * this method and should not keep a copy of it. If you need the position of an item later
+         * on (e.g. in a click listener), use {@link ViewHolder#getAdapterPosition()} which will
+         * have the updated adapter position.
+         * <p>
+         * Partial bind vs full bind:
+         * <p>
+         * The payloads parameter is a merge list from {@link #notifyItemChanged(int, Object)} or
+         * {@link #notifyItemRangeChanged(int, int, Object)}.  If the payloads list is not empty,
+         * the ViewHolder is currently bound to old data and Adapter may run an efficient partial
+         * update using the payload info.  If the payload is empty,  Adapter must run a full bind.
+         * Adapter should not assume that the payload passed in notify methods will be received by
+         * onBindViewHolder().  For example when the view is not attached to the screen, the
+         * payload in notifyItemChange() will be simply dropped.
          *
          * @param holder The ViewHolder which should be updated to represent the contents of the
          *               item at the given position in the data set.
          * @param position The position of the item within the adapter's data set.
+         * @param payloads A non-null list of merged payloads. Can be empty list if requires full
+         *                 update.
          */
-        public abstract void onBindViewHolder(VH holder, int position);
+        public void onBindViewHolder(VH holder, int position, List<Object> payloads) {
+            onBindViewHolder(holder, position);
+        }
 
         /**
          * This method calls {@link #onCreateViewHolder(ViewGroup, int)} to create a new
@@ -5131,7 +5183,8 @@
                     ViewHolder.FLAG_BOUND | ViewHolder.FLAG_UPDATE | ViewHolder.FLAG_INVALID
                             | ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN);
             TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
-            onBindViewHolder(holder, position);
+            onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
+            holder.clearPayload();
             TraceCompat.endSection();
         }
 
@@ -5378,6 +5431,7 @@
 
         /**
          * Notify any registered observers that the item at <code>position</code> has changed.
+         * Equivalent to calling <code>notifyItemChanged(position, null);</code>.
          *
          * <p>This is an item change event, not a structural change event. It indicates that any
          * reflection of the data at <code>position</code> is out of date and should be updated.
@@ -5392,8 +5446,37 @@
         }
 
         /**
+         * Notify any registered observers that the item at <code>position</code> has changed with an
+         * optional payload object.
+         *
+         * <p>This is an item change event, not a structural change event. It indicates that any
+         * reflection of the data at <code>position</code> is out of date and should be updated.
+         * The item at <code>position</code> retains the same identity.
+         * </p>
+         *
+         * <p>
+         * Client can optionally pass a payload for partial change. These payloads will be merged
+         * and may be passed to adapter's {@link #onBindViewHolder(ViewHolder, int, List)} if the
+         * item is already represented by a ViewHolder and it will be rebound to the same
+         * ViewHolder. A notifyItemRangeChanged() with null payload will clear all existing
+         * payloads on that item and prevent future payload until
+         * {@link #onBindViewHolder(ViewHolder, int, List)} is called. Adapter should not assume
+         * that the payload will always be passed to onBindViewHolder(), e.g. when the view is not
+         * attached, the payload will be simply dropped.
+         *
+         * @param position Position of the item that has changed
+         * @param payload Optional parameter, use null to identify a "full" update
+         *
+         * @see #notifyItemRangeChanged(int, int)
+         */
+        public final void notifyItemChanged(int position, Object payload) {
+            mObservable.notifyItemRangeChanged(position, 1, payload);
+        }
+
+        /**
          * Notify any registered observers that the <code>itemCount</code> items starting at
          * position <code>positionStart</code> have changed.
+         * Equivalent to calling <code>notifyItemRangeChanged(position, itemCount, null);</code>.
          *
          * <p>This is an item change event, not a structural change event. It indicates that
          * any reflection of the data in the given position range is out of date and should
@@ -5409,6 +5492,36 @@
         }
 
         /**
+         * Notify any registered observers that the <code>itemCount</code> items starting at
+         * position<code>positionStart</code> have changed. An optional payload can be
+         * passed to each changed item.
+         *
+         * <p>This is an item change event, not a structural change event. It indicates that any
+         * reflection of the data in the given position range is out of date and should be updated.
+         * The items in the given range retain the same identity.
+         * </p>
+         *
+         * <p>
+         * Client can optionally pass a payload for partial change. These payloads will be merged
+         * and may be passed to adapter's {@link #onBindViewHolder(ViewHolder, int, List)} if the
+         * item is already represented by a ViewHolder and it will be rebound to the same
+         * ViewHolder. A notifyItemRangeChanged() with null payload will clear all existing
+         * payloads on that item and prevent future payload until
+         * {@link #onBindViewHolder(ViewHolder, int, List)} is called. Adapter should not assume
+         * that the payload will always be passed to onBindViewHolder(), e.g. when the view is not
+         * attached, the payload will be simply dropped.
+         *
+         * @param positionStart Position of the first item that has changed
+         * @param itemCount Number of items that have changed
+         * @param payload  Optional parameter, use null to identify a "full" update
+         *
+         * @see #notifyItemChanged(int)
+         */
+        public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
+            mObservable.notifyItemRangeChanged(positionStart, itemCount, payload);
+        }
+
+        /**
          * Notify any registered observers that the item reflected at <code>position</code>
          * has been newly inserted. The item previously at <code>position</code> is now at
          * position <code>position + 1</code>.
@@ -7144,6 +7257,8 @@
 
         /**
          * Called when items have been changed in the adapter.
+         * To receive payload,  override {@link #onItemsUpdated(RecyclerView, int, int, Object)}
+         * instead, then this callback will not be invoked.
          *
          * @param recyclerView
          * @param positionStart
@@ -7153,6 +7268,20 @@
         }
 
         /**
+         * Called when items have been changed in the adapter and with optional payload.
+         * Default implementation calls {@link #onItemsUpdated(RecyclerView, int, int)}.
+         *
+         * @param recyclerView
+         * @param positionStart
+         * @param itemCount
+         * @param payload
+         */
+        public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount,
+                Object payload) {
+            onItemsUpdated(recyclerView, positionStart, itemCount);
+        }
+
+        /**
          * Called when an item is moved withing the adapter.
          * <p>
          * Note that, an item may also change position in response to another ADD/REMOVE/MOVE
@@ -8010,8 +8139,18 @@
          */
         static final int FLAG_ADAPTER_POSITION_UNKNOWN = 1 << 9;
 
+        /**
+         * Set when a addChangePayload(null) is called
+         */
+        static final int FLAG_ADAPTER_FULLUPDATE = 1 << 10;
+
         private int mFlags;
 
+        private static final List<Object> FULLUPDATE_PAYLOADS = Collections.EMPTY_LIST;
+
+        List<Object> mPayloads = null;
+        List<Object> mUnmodifiedPayloads = null;
+
         private int mIsRecyclableCount = 0;
 
         // If non-null, view is currently considered scrap and may be reused for other data by the
@@ -8236,6 +8375,43 @@
             mFlags |= flags;
         }
 
+        void addChangePayload(Object payload) {
+            if (payload == null) {
+                addFlags(FLAG_ADAPTER_FULLUPDATE);
+            } else if ((mFlags & FLAG_ADAPTER_FULLUPDATE) == 0) {
+                createPayloadsIfNeeded();
+                mPayloads.add(payload);
+            }
+        }
+
+        private void createPayloadsIfNeeded() {
+            if (mPayloads == null) {
+                mPayloads = new ArrayList<Object>();
+                mUnmodifiedPayloads = Collections.unmodifiableList(mPayloads);
+            }
+        }
+
+        void clearPayload() {
+            if (mPayloads != null) {
+                mPayloads.clear();
+            }
+            mFlags = mFlags & ~FLAG_ADAPTER_FULLUPDATE;
+        }
+
+        List<Object> getUnmodifiedPayloads() {
+            if ((mFlags & FLAG_ADAPTER_FULLUPDATE) == 0) {
+                if (mPayloads == null || mPayloads.size() == 0) {
+                    // Initial state,  no update being called.
+                    return FULLUPDATE_PAYLOADS;
+                }
+                // there are none-null payloads
+                return mUnmodifiedPayloads;
+            } else {
+                // a full update has been called.
+                return FULLUPDATE_PAYLOADS;
+            }
+        }
+
         void resetInternal() {
             mFlags = 0;
             mPosition = NO_POSITION;
@@ -8245,6 +8421,7 @@
             mIsRecyclableCount = 0;
             mShadowedHolder = null;
             mShadowingHolder = null;
+            clearPayload();
         }
 
         @Override
@@ -8504,6 +8681,12 @@
             // do nothing
         }
 
+        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
+            // fallback to onItemRangeChanged(positionStart, itemCount) if app
+            // does not override this method.
+            onItemRangeChanged(positionStart, itemCount);
+        }
+
         public void onItemRangeInserted(int positionStart, int itemCount) {
             // do nothing
         }
@@ -8574,8 +8757,10 @@
         }
 
         /**
-         * @return The LayoutManager to which this SmoothScroller is attached
+         * @return The LayoutManager to which this SmoothScroller is attached. Will return
+         * <code>null</code> after the SmoothScroller is stopped.
          */
+        @Nullable
         public LayoutManager getLayoutManager() {
             return mLayoutManager;
         }
@@ -8633,15 +8818,16 @@
         }
 
         private void onAnimation(int dx, int dy) {
-            if (!mRunning || mTargetPosition == RecyclerView.NO_POSITION) {
+            final RecyclerView recyclerView = mRecyclerView;
+            if (!mRunning || mTargetPosition == RecyclerView.NO_POSITION || recyclerView == null) {
                 stop();
             }
             mPendingInitialRun = false;
             if (mTargetView != null) {
                 // verify target position
                 if (getChildPosition(mTargetView) == mTargetPosition) {
-                    onTargetFound(mTargetView, mRecyclerView.mState, mRecyclingAction);
-                    mRecyclingAction.runIfNecessary(mRecyclerView);
+                    onTargetFound(mTargetView, recyclerView.mState, mRecyclingAction);
+                    mRecyclingAction.runIfNecessary(recyclerView);
                     stop();
                 } else {
                     Log.e(TAG, "Passed over target position while smooth scrolling.");
@@ -8649,8 +8835,18 @@
                 }
             }
             if (mRunning) {
-                onSeekTargetStep(dx, dy, mRecyclerView.mState, mRecyclingAction);
-                mRecyclingAction.runIfNecessary(mRecyclerView);
+                onSeekTargetStep(dx, dy, recyclerView.mState, mRecyclingAction);
+                boolean hadJumpTarget = mRecyclingAction.hasJumpTarget();
+                mRecyclingAction.runIfNecessary(recyclerView);
+                if (hadJumpTarget) {
+                    // It is not stopped so needs to be restarted
+                    if (mRunning) {
+                        mPendingInitialRun = true;
+                        recyclerView.mViewFlinger.postOnAnimation();
+                    } else {
+                        stop(); // done
+                    }
+                }
             }
         }
 
@@ -8677,7 +8873,9 @@
 
         /**
          * @see RecyclerView#scrollToPosition(int)
+         * @deprecated Use {@link Action#jumpTo(int)}.
          */
+        @Deprecated
         public void instantScrollToPosition(int position) {
             mRecyclerView.scrollToPosition(position);
         }
@@ -8751,6 +8949,8 @@
 
             private int mDuration;
 
+            private int mJumpToPosition = NO_POSITION;
+
             private Interpolator mInterpolator;
 
             private boolean changed = false;
@@ -8789,7 +8989,38 @@
                 mDuration = duration;
                 mInterpolator = interpolator;
             }
+
+            /**
+             * Instead of specifying pixels to scroll, use the target position to jump using
+             * {@link RecyclerView#scrollToPosition(int)}.
+             * <p>
+             * You may prefer using this method if scroll target is really far away and you prefer
+             * to jump to a location and smooth scroll afterwards.
+             * <p>
+             * Note that calling this method takes priority over other update methods such as
+             * {@link #update(int, int, int, Interpolator)}, {@link #setX(float)},
+             * {@link #setY(float)} and #{@link #setInterpolator(Interpolator)}. If you call
+             * {@link #jumpTo(int)}, the other changes will not be considered for this animation
+             * frame.
+             *
+             * @param targetPosition The target item position to scroll to using instant scrolling.
+             */
+            public void jumpTo(int targetPosition) {
+                mJumpToPosition = targetPosition;
+            }
+
+            boolean hasJumpTarget() {
+                return mJumpToPosition >= 0;
+            }
+
             private void runIfNecessary(RecyclerView recyclerView) {
+                if (mJumpToPosition >= 0) {
+                    final int position = mJumpToPosition;
+                    mJumpToPosition = NO_POSITION;
+                    recyclerView.jumpToPositionForSmoothScroller(position);
+                    changed = false;
+                    return;
+                }
                 if (changed) {
                     validate();
                     if (mInterpolator == null) {
@@ -8899,12 +9130,16 @@
         }
 
         public void notifyItemRangeChanged(int positionStart, int itemCount) {
+            notifyItemRangeChanged(positionStart, itemCount, null);
+        }
+
+        public void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
             // since onItemRangeChanged() is implemented by the app, it could do anything, including
             // removing itself from {@link mObservers} - and that could cause problems if
             // an iterator is used on the ArrayList {@link mObservers}.
             // to avoid such problems, just march thru the list in the reverse order.
             for (int i = mObservers.size() - 1; i >= 0; i--) {
-                mObservers.get(i).onItemRangeChanged(positionStart, itemCount);
+                mObservers.get(i).onItemRangeChanged(positionStart, itemCount, payload);
             }
         }
 
diff --git a/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
index 76114c4..322fe34 100644
--- a/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
@@ -1344,7 +1344,8 @@
     }
 
     @Override
-    public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount) {
+    public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount,
+            Object payload) {
         handleUpdate(positionStart, itemCount, AdapterHelper.UpdateOp.UPDATE);
     }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
index 3eda5ae..3945a7c 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
@@ -382,6 +382,112 @@
         mLayoutManager.waitForLayout(2);
     }
 
+    private static boolean listEquals(List list1, List list2) {
+        if (list1.size() != list2.size()) {
+            return false;
+        }
+        for (int i= 0; i < list1.size(); i++) {
+            if (!list1.get(i).equals(list2.get(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void testChangeWithPayload(final boolean supportsChangeAnim,
+            Object[][] notifyPayloads,  Object[][] expectedPayloadsInOnBind)
+                    throws Throwable {
+        final List<Object> expectedPayloads = new ArrayList<Object>();
+        final int changedIndex = 3;
+        TestAdapter testAdapter = new TestAdapter(10) {
+            @Override
+            public int getItemViewType(int position) {
+                return 1;
+            }
+
+            @Override
+            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
+                if (DEBUG) {
+                    Log.d(TAG, " onCreateVH" + vh.toString());
+                }
+                return vh;
+            }
+
+            @Override
+            public void onBindViewHolder(TestViewHolder holder,
+                    int position, List<Object> payloads) {
+                super.onBindViewHolder(holder, position);
+                if (DEBUG) {
+                    Log.d(TAG, " onBind to " + position + "" + holder.toString());
+                }
+                assertTrue(listEquals(payloads, expectedPayloads));
+            }
+        };
+        testAdapter.setHasStableIds(false);
+        setupBasic(testAdapter.getItemCount(), 0, 10, testAdapter);
+        mRecyclerView.getItemAnimator().setSupportsChangeAnimations(supportsChangeAnim);
+
+        int numTests = notifyPayloads.length;
+        for (int i= 0; i < numTests; i++) {
+            mLayoutManager.expectLayouts(1);
+            expectedPayloads.clear();
+            for (int j = 0; j < expectedPayloadsInOnBind[i].length; j++) {
+                expectedPayloads.add(expectedPayloadsInOnBind[i][j]);
+            }
+            final Object[] payloadsToSend = notifyPayloads[i];
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    for (int j = 0; j < payloadsToSend.length; j++) {
+                        mTestAdapter.notifyItemChanged(changedIndex, payloadsToSend[j]);
+                    }
+                }
+            });
+            mLayoutManager.waitForLayout(2);
+        }
+    }
+
+    public void testCrossFadingChangeAnimationWithPayload()  throws Throwable {
+        // for crossfading change animation,  will receive EMPTY payload in onBindViewHolder
+        testChangeWithPayload(true,
+                new Object[][]{
+                    new Object[]{"abc"},
+                    new Object[]{"abc", null, "cdf"},
+                    new Object[]{"abc", null},
+                    new Object[]{null, "abc"},
+                    new Object[]{"abc", "cdf"}
+                },
+                new Object[][]{
+                    new Object[0],
+                    new Object[0],
+                    new Object[0],
+                    new Object[0],
+                    new Object[0]
+                });
+    }
+
+    public void testNoChangeAnimationWithPayload()  throws Throwable {
+        // for Change Animation disabled, payload should match the payloads unless
+        // null payload is fired.
+        testChangeWithPayload(false,
+                new Object[][]{
+                    new Object[]{"abc"},
+                    new Object[]{"abc", null, "cdf"},
+                    new Object[]{"abc", null},
+                    new Object[]{null, "abc"},
+                    new Object[]{"abc", "cdf"}
+                },
+                new Object[][]{
+                new Object[]{"abc"},
+                new Object[0],
+                new Object[0],
+                new Object[0],
+                new Object[]{"abc", "cdf"}
+                });
+    }
+
     public void testRecycleDuringAnimations() throws Throwable {
         final AtomicInteger childCount = new AtomicInteger(0);
         final TestAdapter adapter = new TestAdapter(1000) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
index 630c12d..519520a 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
@@ -48,9 +48,11 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static android.support.v7.widget.RecyclerView.NO_POSITION;
 import static android.support.v7.widget.RecyclerView.SCROLL_STATE_IDLE;
 import static android.support.v7.widget.RecyclerView.SCROLL_STATE_DRAGGING;
 import static android.support.v7.widget.RecyclerView.SCROLL_STATE_SETTLING;
+import static android.support.v7.widget.RecyclerView.getChildViewHolderInt;
 
 import android.support.test.runner.AndroidJUnit4;
 
@@ -291,7 +293,7 @@
 
     private void scrollInOtherOrientationTest(int flags)
             throws Throwable {
-        scrollInOtherOrientationTest(flags);
+        scrollInOtherOrientationTest(flags, flags);
     }
 
     private void scrollInOtherOrientationTest(final int flags, int expectedFlags) throws Throwable {
@@ -2792,6 +2794,152 @@
         assertEquals(addItemDecors ? -30 : -20, scrollDist.get());
     }
 
+    @Test
+    public void testUnimplementedSmoothScroll() throws Throwable {
+        final AtomicInteger receivedScrollToPosition = new AtomicInteger(-1);
+        final AtomicInteger receivedSmoothScrollToPosition = new AtomicInteger(-1);
+        final CountDownLatch cbLatch = new CountDownLatch(2);
+        TestLayoutManager tlm = new TestLayoutManager() {
+            @Override
+            public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+                detachAndScrapAttachedViews(recycler);
+                layoutRange(recycler, 0, 10);
+                layoutLatch.countDown();
+            }
+
+            @Override
+            public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
+                    int position) {
+                assertEquals(-1, receivedSmoothScrollToPosition.get());
+                receivedSmoothScrollToPosition.set(position);
+                RecyclerView.SmoothScroller ss =
+                        new LinearSmoothScroller(recyclerView.getContext()) {
+                            @Override
+                            public PointF computeScrollVectorForPosition(int targetPosition) {
+                                return null;
+                            }
+                        };
+                ss.setTargetPosition(position);
+                startSmoothScroll(ss);
+                cbLatch.countDown();
+            }
+
+            @Override
+            public void scrollToPosition(int position) {
+                assertEquals(-1, receivedScrollToPosition.get());
+                receivedScrollToPosition.set(position);
+                cbLatch.countDown();
+            }
+        };
+        RecyclerView rv = new RecyclerView(getActivity());
+        rv.setAdapter(new TestAdapter(100));
+        rv.setLayoutManager(tlm);
+        tlm.expectLayouts(1);
+        setRecyclerView(rv);
+        tlm.waitForLayout(2);
+        smoothScrollToPosition(35);
+        assertTrue("both scrolls should be called", cbLatch.await(3, TimeUnit.SECONDS));
+        checkForMainThreadException();
+        assertEquals(35, receivedSmoothScrollToPosition.get());
+        assertEquals(35, receivedScrollToPosition.get());
+    }
+
+    @Test
+    public void testJumpingJackSmoothScroller() throws Throwable {
+        jumpingJackSmoothScrollerTest(true);
+    }
+
+    @Test
+    public void testJumpingJackSmoothScrollerGoesIdle() throws Throwable {
+        jumpingJackSmoothScrollerTest(false);
+    }
+
+    private void jumpingJackSmoothScrollerTest(final boolean succeed) throws Throwable {
+        final List<Integer> receivedScrollToPositions = new ArrayList<>();
+        final TestAdapter testAdapter = new TestAdapter(200);
+        final AtomicBoolean mTargetFound = new AtomicBoolean(false);
+        TestLayoutManager tlm = new TestLayoutManager() {
+            int pendingScrollPosition = -1;
+            @Override
+            public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+                detachAndScrapAttachedViews(recycler);
+                final int pos = pendingScrollPosition < 0 ? 0: pendingScrollPosition;
+                layoutRange(recycler, pos, pos + 10);
+                if (layoutLatch != null) {
+                    layoutLatch.countDown();
+                }
+            }
+
+            @Override
+            public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
+                    final int position) {
+                RecyclerView.SmoothScroller ss =
+                        new LinearSmoothScroller(recyclerView.getContext()) {
+                            @Override
+                            public PointF computeScrollVectorForPosition(int targetPosition) {
+                                return new PointF(0, 1);
+                            }
+
+                            @Override
+                            protected void onTargetFound(View targetView, RecyclerView.State state,
+                                                         Action action) {
+                                super.onTargetFound(targetView, state, action);
+                                mTargetFound.set(true);
+                            }
+
+                            @Override
+                            protected void updateActionForInterimTarget(Action action) {
+                                int limit = succeed ? getTargetPosition() : 100;
+                                if (pendingScrollPosition + 2 < limit) {
+                                    if (pendingScrollPosition != NO_POSITION) {
+                                        assertEquals(pendingScrollPosition,
+                                                getChildViewHolderInt(getChildAt(0))
+                                                        .getAdapterPosition());
+                                    }
+                                    action.jumpTo(pendingScrollPosition + 2);
+                                }
+                            }
+                        };
+                ss.setTargetPosition(position);
+                startSmoothScroll(ss);
+            }
+
+            @Override
+            public void scrollToPosition(int position) {
+                receivedScrollToPositions.add(position);
+                pendingScrollPosition = position;
+                requestLayout();
+            }
+        };
+        final RecyclerView rv = new RecyclerView(getActivity());
+        rv.setAdapter(testAdapter);
+        rv.setLayoutManager(tlm);
+
+        tlm.expectLayouts(1);
+        setRecyclerView(rv);
+        tlm.waitForLayout(2);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                rv.smoothScrollToPosition(150);
+            }
+        });
+        int limit = 100;
+        while (rv.getLayoutManager().isSmoothScrolling() && --limit > 0) {
+            Thread.sleep(200);
+            checkForMainThreadException();
+        }
+        checkForMainThreadException();
+        assertTrue(limit > 0);
+        for (int i = 1; i < 100; i+=2) {
+            assertTrue("scroll positions must include " + i, receivedScrollToPositions.contains(i));
+        }
+
+        assertEquals(succeed, mTargetFound.get());
+
+    }
+
     private static class TestViewHolder2 extends RecyclerView.ViewHolder {
 
         Object mData;
