Merge "[RenderScript] Add API to map Allocation mallocptr to Java ByteBuffer" am: 8bcba7a552
am: aa97c90326

* commit 'aa97c90326e2830f03da9b70a5be66e9d56d739a':
  [RenderScript] Add API to map Allocation mallocptr to Java ByteBuffer
diff --git a/annotations/src/android/support/annotation/AnimRes.java b/annotations/src/android/support/annotation/AnimRes.java
index 906461b..e91fa81 100644
--- a/annotations/src/android/support/annotation/AnimRes.java
+++ b/annotations/src/android/support/annotation/AnimRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an anim resource reference (e.g. {@link android.R.anim#fade_in}).
+ * to be an anim resource reference (e.g. {@code android.R.anim.fade_in}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/AnimatorRes.java b/annotations/src/android/support/annotation/AnimatorRes.java
index 4681236..e969356 100644
--- a/annotations/src/android/support/annotation/AnimatorRes.java
+++ b/annotations/src/android/support/annotation/AnimatorRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an animator resource reference (e.g. {@link android.R.animator#fade_in}).
+ * to be an animator resource reference (e.g. {@code android.R.animator.fade_in}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/ArrayRes.java b/annotations/src/android/support/annotation/ArrayRes.java
index 347de36..758bce4 100644
--- a/annotations/src/android/support/annotation/ArrayRes.java
+++ b/annotations/src/android/support/annotation/ArrayRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an array resource reference (e.g. {@link android.R.array#phoneTypes}).
+ * to be an array resource reference (e.g. {@code android.R.array.phoneTypes}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/AttrRes.java b/annotations/src/android/support/annotation/AttrRes.java
index 7ba1f0d..2034be5 100644
--- a/annotations/src/android/support/annotation/AttrRes.java
+++ b/annotations/src/android/support/annotation/AttrRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an attribute reference (e.g. {@link android.R.attr#action}).
+ * to be an attribute reference (e.g. {@code android.R.attr.action}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/BinderThread.java b/annotations/src/android/support/annotation/BinderThread.java
index 4bb6754..a9e5db5 100644
--- a/annotations/src/android/support/annotation/BinderThread.java
+++ b/annotations/src/android/support/annotation/BinderThread.java
@@ -29,10 +29,10 @@
  * on the binder thread.
  * <p>
  * Example:
- * <pre>{@code
- *  (&#64;BinderThread
+ * <pre><code>
+ *  &#64;BinderThread
  *  public BeamShareData createBeamShareData() { ... }
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD,CONSTRUCTOR,TYPE})
diff --git a/annotations/src/android/support/annotation/CallSuper.java b/annotations/src/android/support/annotation/CallSuper.java
index 7180417..f9f8bee 100644
--- a/annotations/src/android/support/annotation/CallSuper.java
+++ b/annotations/src/android/support/annotation/CallSuper.java
@@ -25,10 +25,10 @@
  * Denotes that any overriding methods should invoke this method as well.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;CallSuper
  *  public abstract void onFocusLost();
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD})
diff --git a/annotations/src/android/support/annotation/CheckResult.java b/annotations/src/android/support/annotation/CheckResult.java
index d527edc..405ea4b 100644
--- a/annotations/src/android/support/annotation/CheckResult.java
+++ b/annotations/src/android/support/annotation/CheckResult.java
@@ -29,7 +29,7 @@
  * <p>
  * Example:
  * <pre>{@code
- *  public &#64;CheckResult String trim(String s) { return s.trim(); }
+ *  public @CheckResult String trim(String s) { return s.trim(); }
  *  ...
  *  s.trim(); // this is probably an error
  *  s = s.trim(); // ok
diff --git a/annotations/src/android/support/annotation/ColorInt.java b/annotations/src/android/support/annotation/ColorInt.java
index 9b3cb7e..4fa46eb 100644
--- a/annotations/src/android/support/annotation/ColorInt.java
+++ b/annotations/src/android/support/annotation/ColorInt.java
@@ -31,7 +31,7 @@
  * <p>
  * Example:
  * <pre>{@code
- *  public abstract void setTextColor(&#64;ColorInt int color);
+ *  public abstract void setTextColor(@ColorInt int color);
  * }</pre>
  */
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/ColorRes.java b/annotations/src/android/support/annotation/ColorRes.java
index eb273c4..d0fd49a 100644
--- a/annotations/src/android/support/annotation/ColorRes.java
+++ b/annotations/src/android/support/annotation/ColorRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a color resource reference (e.g. {@link android.R.color#black}).
+ * to be a color resource reference (e.g. {@code android.R.color.black}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/DimenRes.java b/annotations/src/android/support/annotation/DimenRes.java
index c3492a5..08dc4a9 100644
--- a/annotations/src/android/support/annotation/DimenRes.java
+++ b/annotations/src/android/support/annotation/DimenRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a dimension resource reference (e.g. {@link android.R.dimen#app_icon_size}).
+ * to be a dimension resource reference (e.g. {@code android.R.dimen.app_icon_size}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/DrawableRes.java b/annotations/src/android/support/annotation/DrawableRes.java
index 0ea1bca..f130380 100644
--- a/annotations/src/android/support/annotation/DrawableRes.java
+++ b/annotations/src/android/support/annotation/DrawableRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a drawable resource reference (e.g. {@link android.R.attr#alertDialogIcon}).
+ * to be a drawable resource reference (e.g. {@code android.R.attr.alertDialogIcon}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/FloatRange.java b/annotations/src/android/support/annotation/FloatRange.java
index 130d834..f129e1b 100644
--- a/annotations/src/android/support/annotation/FloatRange.java
+++ b/annotations/src/android/support/annotation/FloatRange.java
@@ -28,12 +28,12 @@
  * Denotes that the annotated element should be a float or double in the given range
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;FloatRange(from=0.0,to=1.0)
  *  public float getAlpha() {
  *      ...
  *  }
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE})
diff --git a/annotations/src/android/support/annotation/IdRes.java b/annotations/src/android/support/annotation/IdRes.java
index 9a0060f..7cb3f98 100644
--- a/annotations/src/android/support/annotation/IdRes.java
+++ b/annotations/src/android/support/annotation/IdRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an id resource reference (e.g. {@link android.R.id#copy}).
+ * to be an id resource reference (e.g. {@code android.R.id.copy}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/IntDef.java b/annotations/src/android/support/annotation/IntDef.java
index fedd7b4..be2e2b8 100644
--- a/annotations/src/android/support/annotation/IntDef.java
+++ b/annotations/src/android/support/annotation/IntDef.java
@@ -32,24 +32,24 @@
  * multiple constants can be combined.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;Retention(SOURCE)
- *  &#64;IntDef(&#123;NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS&#125;)
- *  public &#64;interface NavigationMode &#123;&#125;
+ *  &#64;IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
+ *  public @interface NavigationMode {}
  *  public static final int NAVIGATION_MODE_STANDARD = 0;
  *  public static final int NAVIGATION_MODE_LIST = 1;
  *  public static final int NAVIGATION_MODE_TABS = 2;
  *  ...
- *  public abstract void setNavigationMode(&#64;NavigationMode int mode);
+ *  public abstract void setNavigationMode(@NavigationMode int mode);
  *  &#64;NavigationMode
  *  public abstract int getNavigationMode();
- * }</pre>
+ * </code></pre>
  * For a flag, set the flag attribute:
- * <pre>{@code
+ * <pre><code>
  *  &#64;IntDef(
  *      flag = true
- *      value = &#123;NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS&#125;)
- * }</pre>
+ *      value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
+ * </code></pre>
  */
 @Retention(SOURCE)
 @Target({ANNOTATION_TYPE})
diff --git a/annotations/src/android/support/annotation/IntRange.java b/annotations/src/android/support/annotation/IntRange.java
index 6011276..d489acb 100644
--- a/annotations/src/android/support/annotation/IntRange.java
+++ b/annotations/src/android/support/annotation/IntRange.java
@@ -18,6 +18,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
 import static java.lang.annotation.ElementType.METHOD;
@@ -28,15 +29,15 @@
  * Denotes that the annotated element should be an int or long in the given range
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;IntRange(from=0,to=255)
  *  public int getAlpha() {
  *      ...
  *  }
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE})
+@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
 public @interface IntRange {
     /** Smallest value, inclusive */
     long from() default Long.MIN_VALUE;
diff --git a/annotations/src/android/support/annotation/IntegerRes.java b/annotations/src/android/support/annotation/IntegerRes.java
index 6bfcc37..d965675 100644
--- a/annotations/src/android/support/annotation/IntegerRes.java
+++ b/annotations/src/android/support/annotation/IntegerRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}).
+ * to be an integer resource reference (e.g. {@code android.R.integer.config_shortAnimTime}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/InterpolatorRes.java b/annotations/src/android/support/annotation/InterpolatorRes.java
index 20f42b8..3195c57 100644
--- a/annotations/src/android/support/annotation/InterpolatorRes.java
+++ b/annotations/src/android/support/annotation/InterpolatorRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be an interpolator resource reference (e.g. {@link android.R.interpolator#cycle}).
+ * to be an interpolator resource reference (e.g. {@code android.R.interpolator.cycle}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/Keep.java b/annotations/src/android/support/annotation/Keep.java
index de1c9e5..111971c 100644
--- a/annotations/src/android/support/annotation/Keep.java
+++ b/annotations/src/android/support/annotation/Keep.java
@@ -33,12 +33,12 @@
  * so a compiler may think that the code is unused.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;Keep
  *  public void foo() {
  *      ...
  *  }
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({PACKAGE,TYPE,ANNOTATION_TYPE,CONSTRUCTOR,METHOD,FIELD})
diff --git a/annotations/src/android/support/annotation/LayoutRes.java b/annotations/src/android/support/annotation/LayoutRes.java
index ad04ef0..0de4e84 100644
--- a/annotations/src/android/support/annotation/LayoutRes.java
+++ b/annotations/src/android/support/annotation/LayoutRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a layout resource reference (e.g. {@link android.R.layout#list_content}).
+ * to be a layout resource reference (e.g. {@code android.R.layout.list_content}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/MainThread.java b/annotations/src/android/support/annotation/MainThread.java
index 28aee06..dce4c71 100644
--- a/annotations/src/android/support/annotation/MainThread.java
+++ b/annotations/src/android/support/annotation/MainThread.java
@@ -29,10 +29,10 @@
  * on the main thread.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;MainThread
  *  public void deliverResult(D data) { ... }
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD,CONSTRUCTOR,TYPE})
diff --git a/annotations/src/android/support/annotation/RequiresPermission.java b/annotations/src/android/support/annotation/RequiresPermission.java
index bb9afb2..1ff1964 100644
--- a/annotations/src/android/support/annotation/RequiresPermission.java
+++ b/annotations/src/android/support/annotation/RequiresPermission.java
@@ -22,40 +22,59 @@
 import static java.lang.annotation.ElementType.CONSTRUCTOR;
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.CLASS;
 
 /**
  * Denotes that the annotated element requires (or may require) one or more permissions.
- * <p/>
+ * <p>
  * Example of requiring a single permission:
- * <pre>{@code
+ * <pre><code>
  *   &#64;RequiresPermission(Manifest.permission.SET_WALLPAPER)
  *   public abstract void setWallpaper(Bitmap bitmap) throws IOException;
  *
  *   &#64;RequiresPermission(ACCESS_COARSE_LOCATION)
  *   public abstract Location getLastKnownLocation(String provider);
- * }</pre>
+ * </code></pre>
  * Example of requiring at least one permission from a set:
- * <pre>{@code
+ * <pre><code>
  *   &#64;RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
  *   public abstract Location getLastKnownLocation(String provider);
- * }</pre>
+ * </code></pre>
  * Example of requiring multiple permissions:
- * <pre>{@code
+ * <pre><code>
  *   &#64;RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
  *   public abstract Location getLastKnownLocation(String provider);
- * }</pre>
+ * </code></pre>
  * Example of requiring separate read and write permissions for a content provider:
- * <pre>{@code
- *   &#64;RequiresPermission.Read(&#64;RequiresPermission(READ_HISTORY_BOOKMARKS))
- *   &#64;RequiresPermission.Write(&#64;RequiresPermission(WRITE_HISTORY_BOOKMARKS))
+ * <pre><code>
+ *   &#64;RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
+ *   &#64;RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
  *   public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
+ * </code></pre>
+ * <p>
+ * When specified on a parameter, the annotation indicates that the method requires
+ * a permission which depends on the value of the parameter. For example, consider
+ * {@code android.app.Activity.startActivity(android.content.Intent)}:
+ * <pre>{@code
+ *   public void startActivity(@RequiresPermission Intent intent) { ... }
  * }</pre>
- *
- * @hide
+ * Notice how there are no actual permission names listed in the annotation. The actual
+ * permissions required will depend on the particular intent passed in. For example,
+ * the code may look like this:
+ * <pre>{@code
+ *   Intent intent = new Intent(Intent.ACTION_CALL);
+ *   startActivity(intent);
+ * }</pre>
+ * and the actual permission requirement for this particular intent is described on
+ * the Intent name itself:
+ * <pre><code>
+ *   &#64;RequiresPermission(Manifest.permission.CALL_PHONE)
+ *   public static final String ACTION_CALL = "android.intent.action.CALL";
+ * </code></pre>
  */
 @Retention(CLASS)
-@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD})
+@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER})
 public @interface RequiresPermission {
     /**
      * The name of the permission that is required, if precisely one permission
@@ -87,18 +106,28 @@
     boolean conditional() default false;
 
     /**
-     * Specifies that the given permission is required for read operations
+     * Specifies that the given permission is required for read operations.
+     * <p>
+     * When specified on a parameter, the annotation indicates that the method requires
+     * a permission which depends on the value of the parameter (and typically
+     * the corresponding field passed in will be one of a set of constants which have
+     * been annotated with a {@code @RequiresPermission} annotation.)
      */
-    @Target(FIELD)
+    @Target({FIELD, METHOD, PARAMETER})
     @interface Read {
-        RequiresPermission value();
+        RequiresPermission value() default @RequiresPermission;
     }
 
     /**
-     * Specifies that the given permission is required for write operations
+     * Specifies that the given permission is required for write operations.
+     * <p>
+     * When specified on a parameter, the annotation indicates that the method requires
+     * a permission which depends on the value of the parameter (and typically
+     * the corresponding field passed in will be one of a set of constants which have
+     * been annotated with a {@code @RequiresPermission} annotation.)
      */
-    @Target(FIELD)
+    @Target({FIELD, METHOD, PARAMETER})
     @interface Write {
-        RequiresPermission value();
+        RequiresPermission value() default @RequiresPermission;
     }
 }
diff --git a/annotations/src/android/support/annotation/Size.java b/annotations/src/android/support/annotation/Size.java
index 306fdf3..bd1d7bd 100644
--- a/annotations/src/android/support/annotation/Size.java
+++ b/annotations/src/android/support/annotation/Size.java
@@ -31,7 +31,7 @@
  * <p>
  * Example:
  * <pre>{@code
- *  public void getLocationInWindow(&#64;Size(2) int[] location) {
+ *  public void getLocationInWindow(@Size(2) int[] location) {
  *      ...
  *  }
  * }</pre>
diff --git a/annotations/src/android/support/annotation/StringDef.java b/annotations/src/android/support/annotation/StringDef.java
index cae227e..33f71e9 100644
--- a/annotations/src/android/support/annotation/StringDef.java
+++ b/annotations/src/android/support/annotation/StringDef.java
@@ -29,20 +29,20 @@
  * type and that its value should be one of the explicitly named constants.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;Retention(SOURCE)
- *  &#64;StringDef(&#123;
+ *  &#64;StringDef({
  *     POWER_SERVICE,
  *     WINDOW_SERVICE,
  *     LAYOUT_INFLATER_SERVICE
- *  &#125;)
- *  public &#64;interface ServiceName &#123;&#125;
+ *  })
+ *  public @interface ServiceName {}
  *  public static final String POWER_SERVICE = "power";
  *  public static final String WINDOW_SERVICE = "window";
  *  public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
  *  ...
- *  public abstract Object getSystemService(&#64;ServiceName String name);
- * }</pre>
+ *  public abstract Object getSystemService(@ServiceName String name);
+ * </code></pre>
  */
 @Retention(SOURCE)
 @Target({ANNOTATION_TYPE})
diff --git a/annotations/src/android/support/annotation/StringRes.java b/annotations/src/android/support/annotation/StringRes.java
index 2c1149c..cf427f6 100644
--- a/annotations/src/android/support/annotation/StringRes.java
+++ b/annotations/src/android/support/annotation/StringRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a String resource reference (e.g. {@link android.R.string#ok}).
+ * to be a String resource reference (e.g. {@code android.R.string.ok}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/StyleRes.java b/annotations/src/android/support/annotation/StyleRes.java
index 6d931bf..ca7a187 100644
--- a/annotations/src/android/support/annotation/StyleRes.java
+++ b/annotations/src/android/support/annotation/StyleRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a style resource reference (e.g. {@link android.R.style#TextAppearance}).
+ * to be a style resource reference (e.g. {@code android.R.style.TextAppearance}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/StyleableRes.java b/annotations/src/android/support/annotation/StyleableRes.java
index d7902d1..6e4d97f 100644
--- a/annotations/src/android/support/annotation/StyleableRes.java
+++ b/annotations/src/android/support/annotation/StyleableRes.java
@@ -27,7 +27,7 @@
 
 /**
  * Denotes that an integer parameter, field or method return value is expected
- * to be a styleable resource reference (e.g. {@link android.R.styleable#TextView_text}).
+ * to be a styleable resource reference (e.g. {@code android.R.styleable.TextView_text}).
  */
 @Documented
 @Retention(CLASS)
diff --git a/annotations/src/android/support/annotation/UiThread.java b/annotations/src/android/support/annotation/UiThread.java
index a603740..0f8e9d7 100644
--- a/annotations/src/android/support/annotation/UiThread.java
+++ b/annotations/src/android/support/annotation/UiThread.java
@@ -29,11 +29,11 @@
  * on the UI thread.
  * <p>
  * Example:
- * <pre>{@code
+ * <pre><code>
  *  &#64;UiThread
  *
- *  public abstract void setText(&#64;NonNull String text) { ... }
- * }</pre>
+ *  public abstract void setText(@NonNull String text) { ... }
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD,CONSTRUCTOR,TYPE})
diff --git a/annotations/src/android/support/annotation/WorkerThread.java b/annotations/src/android/support/annotation/WorkerThread.java
index 31e34b4..c003abc 100644
--- a/annotations/src/android/support/annotation/WorkerThread.java
+++ b/annotations/src/android/support/annotation/WorkerThread.java
@@ -29,10 +29,10 @@
  * on a worker thread.
  * <p>
  * Example:
- * <pre>{@code
- *  (&#64;WorkerThread
+ * <pre><code>
+ *  &#64;WorkerThread
  *  protected abstract FilterResults performFiltering(CharSequence constraint);
- * }</pre>
+ * </code></pre>
  */
 @Retention(CLASS)
 @Target({METHOD,CONSTRUCTOR,TYPE})
diff --git a/apicheck.mk b/apicheck.mk
index 739cfb3..97146cf 100644
--- a/apicheck.mk
+++ b/apicheck.mk
@@ -46,8 +46,9 @@
     $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(support_module),,COMMON)/src
 LOCAL_SDK_VERSION := current
 
+LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/src
+
 LOCAL_DROIDDOC_OPTIONS:= \
-    -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/src \
     -stubpackages "$(subst $(space),:,$(support_module_java_packages))" \
     -api $(support_module_api_file) \
     -removedApi $(support_module_removed_file) \
diff --git a/build.gradle b/build.gradle
index 7bd791a..30b6bc4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,7 +34,7 @@
 }
 
 ext.supportRepoOut = new File(buildDir, 'support_repo')
-ext.testApkDistOut = new File(buildDir, 'test_apks')
+ext.testApkDistOut = ext.distDir
 
 // Main task called by the build server.
 task(createArchive) << {
diff --git a/customtabs/api/23.1.1.txt b/customtabs/api/23.1.1.txt
new file mode 100644
index 0000000..caa5ea4
--- /dev/null
+++ b/customtabs/api/23.1.1.txt
@@ -0,0 +1,88 @@
+package android.support.customtabs {
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(java.lang.String, android.os.Bundle);
+    method public void onNavigationEvent(int, android.os.Bundle);
+    field public static final int NAVIGATION_ABORTED = 4; // 0x4
+    field public static final int NAVIGATION_FAILED = 3; // 0x3
+    field public static final int NAVIGATION_FINISHED = 2; // 0x2
+    field public static final int NAVIGATION_STARTED = 1; // 0x1
+    field public static final int TAB_HIDDEN = 6; // 0x6
+    field public static final int TAB_SHOWN = 5; // 0x5
+  }
+
+  public class CustomTabsClient {
+    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
+    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public void launchUrl(android.app.Activity, android.net.Uri);
+    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
+    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+    field public static final int NO_TITLE = 0; // 0x0
+    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+    field public final android.content.Intent intent;
+    field public final android.os.Bundle startAnimationBundle;
+  }
+
+  public static final class CustomTabsIntent.Builder {
+    ctor public CustomTabsIntent.Builder();
+    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
+    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent build();
+    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
+  }
+
+  public abstract class CustomTabsService extends android.app.Service {
+    ctor public CustomTabsService();
+    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
+    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
+    method protected abstract boolean warmup(long);
+    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
+  }
+
+  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+    ctor public CustomTabsServiceConnection();
+    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+  }
+
+  public final class CustomTabsSession {
+    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
+  }
+
+  public class CustomTabsSessionToken {
+    method public android.support.customtabs.CustomTabsCallback getCallback();
+    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
+  }
+
+}
+
diff --git a/customtabs/src/android/support/customtabs/CustomTabsIntent.java b/customtabs/src/android/support/customtabs/CustomTabsIntent.java
index ab3685f..fe51dcc 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsIntent.java
+++ b/customtabs/src/android/support/customtabs/CustomTabsIntent.java
@@ -17,7 +17,6 @@
 package android.support.customtabs;
 
 import android.app.Activity;
-import android.app.ActivityOptions;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -29,6 +28,8 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.app.BundleCompat;
 
 import java.util.ArrayList;
@@ -134,7 +135,7 @@
             "android.support.customtabs.customaction.MENU_ITEM_TITLE";
 
     /**
-     * Bundle constructed out of {@link ActivityOptions} that will be running when the
+     * Bundle constructed out of {@link ActivityOptionsCompat} that will be running when the
      * {@link Activity} that holds the custom tab gets finished. A similar ActivityOptions
      * for creation should be constructed and given to the startActivity() call that
      * launches the custom tab.
@@ -159,11 +160,7 @@
      */
     public void launchUrl(Activity context, Uri url) {
         intent.setData(url);
-        if (startAnimationBundle != null){
-            context.startActivity(intent, startAnimationBundle);
-        } else {
-            context.startActivity(intent);
-        }
+        ActivityCompat.startActivity(context, intent, startAnimationBundle);
     }
 
     private CustomTabsIntent(Intent intent, Bundle startAnimationBundle) {
@@ -295,8 +292,8 @@
          */
         public Builder setStartAnimations(
                 @NonNull Context context, @AnimRes int enterResId, @AnimRes int exitResId) {
-            mStartAnimationBundle =
-                    ActivityOptions.makeCustomAnimation(context, enterResId, exitResId).toBundle();
+            mStartAnimationBundle = ActivityOptionsCompat.makeCustomAnimation(
+                    context, enterResId, exitResId).toBundle();
             return this;
         }
 
@@ -309,8 +306,8 @@
          */
         public Builder setExitAnimations(
                 @NonNull Context context, @AnimRes int enterResId, @AnimRes int exitResId) {
-            Bundle bundle =
-                    ActivityOptions.makeCustomAnimation(context, enterResId, exitResId).toBundle();
+            Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(
+                    context, enterResId, exitResId).toBundle();
             mIntent.putExtra(EXTRA_EXIT_ANIMATION_BUNDLE, bundle);
             return this;
         }
diff --git a/design/api/23.1.1.txt b/design/api/23.1.1.txt
new file mode 100644
index 0000000..94df705
--- /dev/null
+++ b/design/api/23.1.1.txt
@@ -0,0 +1,423 @@
+package android.support.design.widget {
+
+  public class AppBarLayout extends android.widget.LinearLayout {
+    ctor public AppBarLayout(android.content.Context);
+    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
+    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
+    method public float getTargetElevation();
+    method public final int getTotalScrollRange();
+    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
+    method public void setExpanded(boolean);
+    method public void setExpanded(boolean, boolean);
+    method public void setTargetElevation(float);
+  }
+
+  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
+    ctor public AppBarLayout.Behavior();
+    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
+    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
+    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
+    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
+  }
+
+  public static abstract class AppBarLayout.Behavior.DragCallback {
+    ctor public AppBarLayout.Behavior.DragCallback();
+    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
+  }
+
+  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
+    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
+  }
+
+  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public AppBarLayout.LayoutParams(int, int);
+    ctor public AppBarLayout.LayoutParams(int, int, float);
+    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
+    method public int getScrollFlags();
+    method public android.view.animation.Interpolator getScrollInterpolator();
+    method public void setScrollFlags(int);
+    method public void setScrollInterpolator(android.view.animation.Interpolator);
+    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
+    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
+    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
+    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
+    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
+  }
+
+  public static abstract interface AppBarLayout.OnOffsetChangedListener {
+    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
+  }
+
+  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
+    ctor public AppBarLayout.ScrollingViewBehavior();
+    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
+    method public int getOverlayTop();
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
+    method public void setOverlayTop(int);
+  }
+
+  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
+    ctor public CollapsingToolbarLayout(android.content.Context);
+    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
+    method public int getCollapsedTitleGravity();
+    method public android.graphics.Typeface getCollapsedTitleTypeface();
+    method public android.graphics.drawable.Drawable getContentScrim();
+    method public int getExpandedTitleGravity();
+    method public android.graphics.Typeface getExpandedTitleTypeface();
+    method public android.graphics.drawable.Drawable getStatusBarScrim();
+    method public java.lang.CharSequence getTitle();
+    method public boolean isTitleEnabled();
+    method public void setCollapsedTitleGravity(int);
+    method public void setCollapsedTitleTextAppearance(int);
+    method public void setCollapsedTitleTextColor(int);
+    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
+    method public void setContentScrim(android.graphics.drawable.Drawable);
+    method public void setContentScrimColor(int);
+    method public void setContentScrimResource(int);
+    method public void setExpandedTitleColor(int);
+    method public void setExpandedTitleGravity(int);
+    method public void setExpandedTitleTextAppearance(int);
+    method public void setExpandedTitleTypeface(android.graphics.Typeface);
+    method public void setScrimsShown(boolean);
+    method public void setScrimsShown(boolean, boolean);
+    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
+    method public void setStatusBarScrimColor(int);
+    method public void setStatusBarScrimResource(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleEnabled(boolean);
+  }
+
+  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
+    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    method public int getCollapseMode();
+    method public float getParallaxMultiplier();
+    method public void setCollapseMode(int);
+    method public void setParallaxMultiplier(float);
+    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
+    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
+    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
+  }
+
+  public class CoordinatorLayout extends android.view.ViewGroup {
+    ctor public CoordinatorLayout(android.content.Context);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void dispatchDependentViewsChanged(android.view.View);
+    method public boolean doViewsOverlap(android.view.View, android.view.View);
+    method public java.util.List<android.view.View> getDependencies(android.view.View);
+    method public android.graphics.drawable.Drawable getStatusBarBackground();
+    method public boolean isPointInChildBounds(android.view.View, int, int);
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void onDraw(android.graphics.Canvas);
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onLayoutChild(android.view.View, int);
+    method public void onMeasureChild(android.view.View, int, int, int, int);
+    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackgroundColor(int);
+    method public void setStatusBarBackgroundResource(int);
+  }
+
+  public static abstract class CoordinatorLayout.Behavior {
+    ctor public CoordinatorLayout.Behavior();
+    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
+    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+    method public static java.lang.Object getTag(android.view.View);
+    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
+    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public static void setTag(android.view.View, java.lang.Object);
+  }
+
+  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
+  }
+
+  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public CoordinatorLayout.LayoutParams(int, int);
+    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getAnchorId();
+    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+    method public void setAnchorId(int);
+    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
+    field public int anchorGravity;
+    field public int gravity;
+    field public int keyline;
+  }
+
+  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
+    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
+  }
+
+  public class FloatingActionButton extends android.widget.ImageButton {
+    ctor public FloatingActionButton(android.content.Context);
+    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
+    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
+    method public void hide();
+    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    method public void setRippleColor(int);
+    method public void show();
+    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+  }
+
+  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public FloatingActionButton.Behavior();
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
+  }
+
+  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
+    ctor public FloatingActionButton.OnVisibilityChangedListener();
+    method public void onHidden(android.support.design.widget.FloatingActionButton);
+    method public void onShown(android.support.design.widget.FloatingActionButton);
+  }
+
+   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
+    ctor public HeaderBehavior();
+    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
+  }
+
+   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
+    ctor public HeaderScrollingViewBehavior();
+    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
+  }
+
+  public class NavigationView extends android.widget.FrameLayout {
+    ctor public NavigationView(android.content.Context);
+    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
+    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
+    method public void addHeaderView(android.view.View);
+    method public int getHeaderCount();
+    method public android.view.View getHeaderView(int);
+    method public android.graphics.drawable.Drawable getItemBackground();
+    method public android.content.res.ColorStateList getItemIconTintList();
+    method public android.content.res.ColorStateList getItemTextColor();
+    method public android.view.Menu getMenu();
+    method public android.view.View inflateHeaderView(int);
+    method public void inflateMenu(int);
+    method public void removeHeaderView(android.view.View);
+    method public void setCheckedItem(int);
+    method public void setItemBackground(android.graphics.drawable.Drawable);
+    method public void setItemBackgroundResource(int);
+    method public void setItemIconTintList(android.content.res.ColorStateList);
+    method public void setItemTextAppearance(int);
+    method public void setItemTextColor(android.content.res.ColorStateList);
+    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
+  }
+
+  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
+    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
+  }
+
+  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
+    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public NavigationView.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
+    field public android.os.Bundle menuState;
+  }
+
+  public final class Snackbar {
+    method public void dismiss();
+    method public int getDuration();
+    method public android.view.View getView();
+    method public boolean isShown();
+    method public boolean isShownOrQueued();
+    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
+    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
+    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
+    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
+    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
+    method public android.support.design.widget.Snackbar setActionTextColor(int);
+    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
+    method public android.support.design.widget.Snackbar setDuration(int);
+    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
+    method public android.support.design.widget.Snackbar setText(int);
+    method public void show();
+    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
+    field public static final int LENGTH_LONG = 0; // 0x0
+    field public static final int LENGTH_SHORT = -1; // 0xffffffff
+  }
+
+  public static abstract class Snackbar.Callback {
+    ctor public Snackbar.Callback();
+    method public void onDismissed(android.support.design.widget.Snackbar, int);
+    method public void onShown(android.support.design.widget.Snackbar);
+    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
+    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
+    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
+    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
+    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
+  }
+
+  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public SwipeDismissBehavior();
+    method public boolean canSwipeDismissView(android.view.View);
+    method public int getDragState();
+    method public void setDragDismissDistance(float);
+    method public void setEndAlphaSwipeDistance(float);
+    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
+    method public void setSensitivity(float);
+    method public void setStartAlphaSwipeDistance(float);
+    method public void setSwipeDirection(int);
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
+    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
+    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
+  }
+
+  public static abstract interface SwipeDismissBehavior.OnDismissListener {
+    method public abstract void onDismiss(android.view.View);
+    method public abstract void onDragStateChanged(int);
+  }
+
+  public class TabLayout extends android.widget.HorizontalScrollView {
+    ctor public TabLayout(android.content.Context);
+    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
+    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void addTab(android.support.design.widget.TabLayout.Tab);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
+    method public int getSelectedTabPosition();
+    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
+    method public int getTabCount();
+    method public int getTabGravity();
+    method public int getTabMode();
+    method public android.content.res.ColorStateList getTabTextColors();
+    method public android.support.design.widget.TabLayout.Tab newTab();
+    method public void removeAllTabs();
+    method public void removeTab(android.support.design.widget.TabLayout.Tab);
+    method public void removeTabAt(int);
+    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void setScrollPosition(int, float, boolean);
+    method public void setSelectedTabIndicatorColor(int);
+    method public void setSelectedTabIndicatorHeight(int);
+    method public void setTabGravity(int);
+    method public void setTabMode(int);
+    method public void setTabTextColors(android.content.res.ColorStateList);
+    method public void setTabTextColors(int, int);
+    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager);
+    field public static final int GRAVITY_CENTER = 1; // 0x1
+    field public static final int GRAVITY_FILL = 0; // 0x0
+    field public static final int MODE_FIXED = 1; // 0x1
+    field public static final int MODE_SCROLLABLE = 0; // 0x0
+  }
+
+  public static abstract interface TabLayout.OnTabSelectedListener {
+    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
+    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
+    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
+  }
+
+  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();
+    method public java.lang.CharSequence getText();
+    method public boolean isSelected();
+    method public void select();
+    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
+    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
+    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
+    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
+    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
+    method public android.support.design.widget.TabLayout.Tab setIcon(int);
+    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
+    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
+    method public android.support.design.widget.TabLayout.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
+    method public void onPageScrollStateChanged(int);
+    method public void onPageScrolled(int, float, int);
+    method public void onPageSelected(int);
+  }
+
+  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
+    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
+    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
+    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
+    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
+  }
+
+  public class TextInputLayout extends android.widget.LinearLayout {
+    ctor public TextInputLayout(android.content.Context);
+    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
+    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
+    method public int getCounterMaxLength();
+    method public android.widget.EditText getEditText();
+    method public java.lang.CharSequence getError();
+    method public java.lang.CharSequence getHint();
+    method public android.graphics.Typeface getTypeface();
+    method public boolean isErrorEnabled();
+    method public boolean isHintAnimationEnabled();
+    method public void setCounterEnabled(boolean);
+    method public void setCounterMaxLength(int);
+    method public void setError(java.lang.CharSequence);
+    method public void setErrorEnabled(boolean);
+    method public void setHint(java.lang.CharSequence);
+    method public void setHintAnimationEnabled(boolean);
+    method public void setHintTextAppearance(int);
+    method public void setTypeface(android.graphics.Typeface);
+  }
+
+   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public ViewOffsetBehavior();
+    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
+    method public int getLeftAndRightOffset();
+    method public int getTopAndBottomOffset();
+    method public boolean setLeftAndRightOffset(int);
+    method public boolean setTopAndBottomOffset(int);
+  }
+
+}
+
diff --git a/design/api/current.txt b/design/api/current.txt
index 7d85b1b..3e6af71 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -76,14 +76,24 @@
     method public static android.support.design.widget.BottomSheetBehavior<V> from(V);
     method public final int getPeekHeight();
     method public final int getState();
+    method public boolean isHideable();
+    method public void setBottomSheetListener(android.support.design.widget.BottomSheetBehavior.BottomSheetListener);
+    method public void setHideable(boolean);
     method public final void setPeekHeight(int);
     method public final void setState(int);
     field public static final int STATE_COLLAPSED = 4; // 0x4
     field public static final int STATE_DRAGGING = 1; // 0x1
     field public static final int STATE_EXPANDED = 3; // 0x3
+    field public static final int STATE_HIDDEN = 5; // 0x5
     field public static final int STATE_SETTLING = 2; // 0x2
   }
 
+  public static abstract class BottomSheetBehavior.BottomSheetListener {
+    ctor public BottomSheetBehavior.BottomSheetListener();
+    method public abstract void onSlide(float);
+    method public abstract void onStateChanged(int);
+  }
+
   protected static class BottomSheetBehavior.SavedState extends android.view.View.BaseSavedState {
     ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
     ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
@@ -256,6 +266,7 @@
    abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
     ctor public HeaderScrollingViewBehavior();
     ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
+    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
     method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
   }
 
@@ -437,6 +448,7 @@
     method public boolean isErrorEnabled();
     method public boolean isHintAnimationEnabled();
     method public boolean isHintEnabled();
+    method public android.os.Parcelable onSaveInstanceState();
     method public void setCounterEnabled(boolean);
     method public void setCounterMaxLength(int);
     method public void setError(java.lang.CharSequence);
@@ -453,6 +465,7 @@
     ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
     method public int getLeftAndRightOffset();
     method public int getTopAndBottomOffset();
+    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
     method public boolean setLeftAndRightOffset(int);
     method public boolean setTopAndBottomOffset(int);
   }
diff --git a/design/res/layout/design_layout_snackbar_include.xml b/design/res/layout/design_layout_snackbar_include.xml
index 0e0cde4..1aab24b 100644
--- a/design/res/layout/design_layout_snackbar_include.xml
+++ b/design/res/layout/design_layout_snackbar_include.xml
@@ -29,7 +29,8 @@
             android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
             android:maxLines="@integer/design_snackbar_text_max_lines"
             android:layout_gravity="center_vertical|left|start"
-            android:ellipsize="end"/>
+            android:ellipsize="end"
+            android:textAlignment="viewStart"/>
 
     <Button
             android:id="@+id/snackbar_action"
diff --git a/design/res/layout/design_navigation_menu.xml b/design/res/layout/design_navigation_menu.xml
index 4d85081..b6a0ad5 100644
--- a/design/res/layout/design_navigation_menu.xml
+++ b/design/res/layout/design_navigation_menu.xml
@@ -19,7 +19,6 @@
         android:id="@+id/design_navigation_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingTop="@dimen/design_navigation_padding_top_default"
         android:paddingBottom="@dimen/design_navigation_padding_bottom"
         android:clipToPadding="false"
         android:scrollbars="vertical"/>
diff --git a/design/res/values-v21/dimens.xml b/design/res/values-v21/dimens.xml
deleted file mode 100644
index 447aeb2..0000000
--- a/design/res/values-v21/dimens.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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>
-    <dimen name="design_navigation_padding_top_default">24dp</dimen>
-</resources>
diff --git a/design/res/values/attrs.xml b/design/res/values/attrs.xml
index 29ca0af..9212e46 100644
--- a/design/res/values/attrs.xml
+++ b/design/res/values/attrs.xml
@@ -340,6 +340,7 @@
     <declare-styleable name="BottomSheetBehavior_Params">
         <!-- The height of the bottom sheet when it is collapsed. -->
         <attr name="behavior_peekHeight" format="dimension"/>
+        <attr name="behavior_hideable" format="boolean"/>
     </declare-styleable>
 
 </resources>
diff --git a/design/res/values/dimens.xml b/design/res/values/dimens.xml
index a0a536d..011ef63 100644
--- a/design/res/values/dimens.xml
+++ b/design/res/values/dimens.xml
@@ -28,7 +28,6 @@
     <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="design_tab_scrollable_min_width">72dp</dimen>
diff --git a/design/src/android/support/design/internal/NavigationMenuPresenter.java b/design/src/android/support/design/internal/NavigationMenuPresenter.java
index 959c0e7..cb95f4f 100644
--- a/design/src/android/support/design/internal/NavigationMenuPresenter.java
+++ b/design/src/android/support/design/internal/NavigationMenuPresenter.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
+import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -85,8 +86,6 @@
         mLayoutInflater = LayoutInflater.from(context);
         mMenu = menu;
         Resources res = context.getResources();
-        mPaddingTopDefault = res.getDimensionPixelOffset(
-                R.dimen.design_navigation_padding_top_default);
         mPaddingSeparator = res.getDimensionPixelOffset(
                 R.dimen.design_navigation_separator_vertical_padding);
     }
@@ -253,6 +252,15 @@
         }
     }
 
+    public void setPaddingTopDefault(int paddingTopDefault) {
+        if (mPaddingTopDefault != paddingTopDefault) {
+            mPaddingTopDefault = paddingTopDefault;
+            if (mHeaderLayout.getChildCount() == 0) {
+                mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
+            }
+        }
+    }
+
     private abstract static class ViewHolder extends RecyclerView.ViewHolder {
 
         public ViewHolder(View itemView) {
@@ -508,7 +516,7 @@
                 MenuItem item = textItem.getMenuItem();
                 if (item.getIcon() == null) {
                     if (mTransparentIcon == null) {
-                        mTransparentIcon = new ColorDrawable(android.R.color.transparent);
+                        mTransparentIcon = new ColorDrawable(Color.TRANSPARENT);
                     }
                     item.setIcon(mTransparentIcon);
                 }
diff --git a/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java b/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java
index 246d5b3..252c6b4 100644
--- a/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java
+++ b/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java
@@ -70,6 +70,7 @@
                                 insets.getSystemWindowInsetTop(),
                                 insets.getSystemWindowInsetRight(),
                                 insets.getSystemWindowInsetBottom());
+                        onInsetsChanged(mInsets);
                         setWillNotDraw(mInsets.isEmpty() || mInsetForeground == null);
                         ViewCompat.postInvalidateOnAnimation(ScrimInsetsFrameLayout.this);
                         return insets.consumeSystemWindowInsets();
@@ -127,4 +128,7 @@
         }
     }
 
+    protected void onInsetsChanged(Rect insets) {
+    }
+
 }
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index eb7a962..bdc8bc8 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -1194,8 +1194,7 @@
             if (behavior instanceof Behavior) {
                 // Offset the child so that it is below the app-bar (with any overlap)
                 final int offset = ((Behavior) behavior).getTopBottomOffsetForScrollingSibling();
-                setTopAndBottomOffset(dependency.getHeight() + offset
-                        - getOverlapForOffset(dependency, offset));
+                setTopAndBottomOffset(offset - getOverlapForOffset(dependency, offset));
                 return true;
             }
             return false;
diff --git a/design/src/android/support/design/widget/BottomSheetBehavior.java b/design/src/android/support/design/widget/BottomSheetBehavior.java
index cd24414..a327e1e 100644
--- a/design/src/android/support/design/widget/BottomSheetBehavior.java
+++ b/design/src/android/support/design/widget/BottomSheetBehavior.java
@@ -18,17 +18,22 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.support.annotation.IntDef;
 import android.support.design.R;
 import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.VelocityTrackerCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.widget.ViewDragHelper;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.VelocityTracker;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.ViewGroup;
+import android.view.ViewParent;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -42,6 +47,29 @@
 public class BottomSheetBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
 
     /**
+     * Listener for monitoring events about bottom sheets.
+     */
+    public abstract static class BottomSheetListener {
+
+        /**
+         * Called when the bottom sheet changes its state.
+         *
+         * @param newState The new state. This will be one of {@link #STATE_DRAGGING},
+         *                 {@link #STATE_SETTLING}, {@link #STATE_EXPANDED},
+         *                 {@link #STATE_COLLAPSED}, or {@link #STATE_HIDDEN}.
+         */
+        public abstract void onStateChanged(@State int newState);
+
+        /**
+         * Called when the bottom sheet is being dragged.
+         *
+         * @param slideOffset The new offset of this bottom sheet within its range, from 0 to 1
+         *                    when it is moving upward, and from 0 to -1 when it moving downward.
+         */
+        public abstract void onSlide(float slideOffset);
+    }
+
+    /**
      * The bottom sheet is dragging.
      */
     public static final int STATE_DRAGGING = 1;
@@ -61,17 +89,33 @@
      */
     public static final int STATE_COLLAPSED = 4;
 
+    /**
+     * The bottom sheet is hidden.
+     */
+    public static final int STATE_HIDDEN = 5;
+
     /** @hide */
-    @IntDef({STATE_EXPANDED, STATE_COLLAPSED, STATE_DRAGGING, STATE_SETTLING})
+    @IntDef({STATE_EXPANDED, STATE_COLLAPSED, STATE_DRAGGING, STATE_SETTLING, STATE_HIDDEN})
     @Retention(RetentionPolicy.SOURCE)
     public @interface State {}
 
+    private static final float HIDE_THRESHOLD = 0.5f;
+
+    private static final float HIDE_FRICTION = 0.1f;
+
+    // Whether to enable workaround for black non-rendered square
+    private static final boolean NEEDS_INVALIDATING = Build.VERSION.SDK_INT < 23;
+
+    private float mMaximumVelocity;
+
     private int mPeekHeight;
 
     private int mMinOffset;
 
     private int mMaxOffset;
 
+    private boolean mHideable;
+
     @State
     private int mState = STATE_COLLAPSED;
 
@@ -85,6 +129,12 @@
 
     private WeakReference<V> mViewRef;
 
+    private BottomSheetListener mListener;
+
+    private VelocityTracker mVelocityTracker;
+
+    private int mActivePointerId;
+
     /**
      * Default constructor for instantiating BottomSheetBehaviors.
      */
@@ -103,7 +153,10 @@
                 R.styleable.BottomSheetBehavior_Params);
         setPeekHeight(a.getDimensionPixelSize(
                 R.styleable.BottomSheetBehavior_Params_behavior_peekHeight, 0));
+        setHideable(a.getBoolean(R.styleable.BottomSheetBehavior_Params_behavior_hideable, false));
         a.recycle();
+        ViewConfiguration configuration = ViewConfiguration.get(context);
+        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
     }
 
     @Override
@@ -115,26 +168,30 @@
     public void onRestoreInstanceState(CoordinatorLayout parent, V child, Parcelable state) {
         SavedState ss = (SavedState) state;
         super.onRestoreInstanceState(parent, child, ss.getSuperState());
-        mState = ss.state;
         // Intermediate states are restored as collapsed state
-        if (mState == STATE_DRAGGING || mState == STATE_SETTLING) {
+        if (ss.state == STATE_DRAGGING || ss.state == STATE_SETTLING) {
             mState = STATE_COLLAPSED;
+        } else {
+            mState = ss.state;
         }
     }
 
     @Override
     public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
         // First let the parent lay it out
-        parent.onLayoutChild(child, layoutDirection);
+        if (mState != STATE_DRAGGING && mState != STATE_SETTLING) {
+            parent.onLayoutChild(child, layoutDirection);
+        }
         // Offset the bottom sheet
         mParentHeight = parent.getHeight();
         mMinOffset = Math.max(0, mParentHeight - child.getHeight());
         mMaxOffset = mParentHeight - mPeekHeight;
         if (mState == STATE_EXPANDED) {
             ViewCompat.offsetTopAndBottom(child, mMinOffset);
-        } else {
+        } else if (mHideable && mState == STATE_HIDDEN) {
+            ViewCompat.offsetTopAndBottom(child, mParentHeight);
+        } else if (mState == STATE_COLLAPSED) {
             ViewCompat.offsetTopAndBottom(child, mMaxOffset);
-            mState = STATE_COLLAPSED;
         }
         if (mViewDragHelper == null) {
             mViewDragHelper = ViewDragHelper.create(parent, mDragCallback);
@@ -146,6 +203,14 @@
     @Override
     public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
         int action = MotionEventCompat.getActionMasked(event);
+        // Record the velocity
+        if (action == MotionEvent.ACTION_DOWN) {
+            reset();
+        }
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(event);
         switch (action) {
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
@@ -158,6 +223,7 @@
             case MotionEvent.ACTION_DOWN:
                 mIgnoreEvents = !parent.isPointInChildBounds(child,
                         (int) event.getX(), (int) event.getY());
+                mActivePointerId = MotionEventCompat.getPointerId(event, 0);
                 break;
         }
         return !mIgnoreEvents && mViewDragHelper.shouldInterceptTouchEvent(event);
@@ -166,6 +232,14 @@
     @Override
     public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
         mViewDragHelper.processTouchEvent(event);
+        // Record the velocity
+        if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
+            reset();
+        }
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(event);
         return true;
     }
 
@@ -181,35 +255,46 @@
             int dy, int[] consumed) {
         int currentTop = child.getTop();
         int newTop = currentTop - dy;
-        if (dy > 0) { // Scrolling up
+        if (dy > 0) { // Upward
             if (newTop < mMinOffset) {
                 consumed[1] = currentTop - mMinOffset;
                 child.offsetTopAndBottom(-consumed[1]);
+                if (NEEDS_INVALIDATING && mState != STATE_EXPANDED) {
+                    child.invalidate();
+                }
                 setStateInternal(STATE_EXPANDED);
             } else {
                 consumed[1] = dy;
                 child.offsetTopAndBottom(-dy);
                 setStateInternal(STATE_DRAGGING);
+                if (NEEDS_INVALIDATING) {
+                    child.invalidate();
+                }
             }
-        } else if (dy < 0) { // Scrolling down
+        } else if (dy < 0) { // Downward
             if (!ViewCompat.canScrollVertically(target, -1)) {
-                if (newTop > mMaxOffset) {
-                    consumed[1] = currentTop - mMaxOffset;
-                    child.offsetTopAndBottom(-consumed[1]);
-                    setStateInternal(STATE_COLLAPSED);
-                } else {
+                if (newTop <= mMaxOffset || mHideable) {
                     consumed[1] = dy;
                     child.offsetTopAndBottom(-dy);
                     setStateInternal(STATE_DRAGGING);
+                    if (NEEDS_INVALIDATING) {
+                        coordinatorLayout.invalidate(child.getLeft(), currentTop,
+                                child.getRight(), coordinatorLayout.getHeight());
+                    }
+                } else {
+                    consumed[1] = currentTop - mMaxOffset;
+                    child.offsetTopAndBottom(-consumed[1]);
+                    setStateInternal(STATE_COLLAPSED);
                 }
             }
         }
+        dispatchOnSlide(child.getTop());
         mLastNestedScrollDy = dy;
     }
 
     @Override
     public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
-        if (mLastNestedScrollDy == 0 || child.getTop() == mMinOffset) {
+        if (child.getTop() == mMinOffset) {
             return;
         }
         int top;
@@ -217,16 +302,28 @@
         if (mLastNestedScrollDy > 0) {
             top = mMinOffset;
             targetState = STATE_EXPANDED;
+        } else if (mHideable && shouldHide(child, getYVelocity())) {
+            top = mParentHeight;
+            targetState = STATE_HIDDEN;
         } else {
             top = mMaxOffset;
             targetState = STATE_COLLAPSED;
         }
-        setStateInternal(STATE_SETTLING);
         if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
+            setStateInternal(STATE_SETTLING);
             ViewCompat.postOnAnimation(child, new SettleRunnable(child, targetState));
+        } else {
+            setStateInternal(targetState);
         }
     }
 
+    @Override
+    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target,
+            float velocityX, float velocityY) {
+        return mState != STATE_EXPANDED ||
+                super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
+    }
+
     /**
      * Sets the height of the bottom sheet when it is collapsed.
      *
@@ -249,10 +346,40 @@
     }
 
     /**
+     * Sets whether this bottom sheet can hide when it is swiped down.
+     *
+     * @param hideable {@code true} to make this bottom sheet hideable.
+     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Params_behavior_hideable
+     */
+    public void setHideable(boolean hideable) {
+        mHideable = hideable;
+    }
+
+    /**
+     * Gets whether this bottom sheet can hide when it is swiped down.
+     *
+     * @return {@code true} if this bottom sheet can hide.
+     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Params_behavior_hideable
+     */
+    public boolean isHideable() {
+        return mHideable;
+    }
+
+    /**
+     * Sets a listener to be notified of bottom sheet events.
+     *
+     * @param listener The listener to notify when bottom sheet events occur.
+     */
+    public void setBottomSheetListener(BottomSheetListener listener) {
+        mListener = listener;
+    }
+
+    /**
      * Sets the state of the bottom sheet. The bottom sheet will transition to that state with
      * animation.
      *
-     * @param state Either {@link #STATE_COLLAPSED} or {@link #STATE_EXPANDED}.
+     * @param state One of {@link #STATE_COLLAPSED}, {@link #STATE_EXPANDED}, or
+     *              {@link #STATE_HIDDEN}.
      */
     public final void setState(@State int state) {
         V child = mViewRef.get();
@@ -264,6 +391,8 @@
             top = mMaxOffset;
         } else if (state == STATE_EXPANDED) {
             top = mMinOffset;
+        } else if (mHideable && state == STATE_HIDDEN) {
+            top = mParentHeight;
         } else {
             throw new IllegalArgumentException("Illegal state argument: " + state);
         }
@@ -289,14 +418,55 @@
             return;
         }
         mState = state;
-        // TODO: Invoke listeners.
+        if (mListener != null) {
+            mListener.onStateChanged(state);
+        }
+    }
+
+    private void reset() {
+        mActivePointerId = ViewDragHelper.INVALID_POINTER;
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    private boolean shouldHide(View child, float yvel) {
+        if (child.getTop() < mMaxOffset) {
+            // It should not hide, but collapse.
+            return false;
+        }
+        final float newTop = child.getTop() + yvel * HIDE_FRICTION;
+        return Math.abs(newTop - mMaxOffset) / (float) mPeekHeight > HIDE_THRESHOLD;
+    }
+
+    private float getYVelocity() {
+        mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+        return VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId);
     }
 
     private final ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {
 
         @Override
         public boolean tryCaptureView(View child, int pointerId) {
-            return true;
+            return mViewRef != null && mViewRef.get() == child;
+        }
+
+        @Override
+        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
+            dispatchOnSlide(top);
+            if (NEEDS_INVALIDATING) {
+                if (dy < 0) { // Upward
+                    changedView.invalidate();
+                } else { // Downward
+                    ViewParent parent = changedView.getParent();
+                    if (parent instanceof View) {
+                        View v = (View) parent;
+                        v.invalidate(changedView.getLeft(), top - dy,
+                                changedView.getRight(), v.getHeight());
+                    }
+                }
+            }
         }
 
         @Override
@@ -310,31 +480,47 @@
         public void onViewReleased(View releasedChild, float xvel, float yvel) {
             int top;
             @State int targetState;
-            if (yvel < 0) {
+            if (yvel < 0) { // Moving up
                 top = mMinOffset;
                 targetState = STATE_EXPANDED;
+            } else if (mHideable && shouldHide(releasedChild, yvel)) {
+                top = mParentHeight;
+                targetState = STATE_HIDDEN;
             } else {
                 top = mMaxOffset;
                 targetState = STATE_COLLAPSED;
             }
-            setStateInternal(STATE_SETTLING);
             if (mViewDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top)) {
+                setStateInternal(STATE_SETTLING);
                 ViewCompat.postOnAnimation(releasedChild,
                         new SettleRunnable(releasedChild, targetState));
+            } else {
+                setStateInternal(targetState);
             }
         }
 
         @Override
         public int clampViewPositionVertical(View child, int top, int dy) {
-            return MathUtils.constrain(top, mMinOffset, mMaxOffset);
+            return MathUtils.constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
         }
 
         @Override
         public int clampViewPositionHorizontal(View child, int left, int dx) {
             return child.getLeft();
         }
+
     };
 
+    private void dispatchOnSlide(int top) {
+        if (mListener != null) {
+            if (top > mMaxOffset) {
+                mListener.onSlide((float) (mMaxOffset - top) / mPeekHeight);
+            } else {
+                mListener.onSlide((float) (mMaxOffset - top) / ((mMaxOffset - mMinOffset)));
+            }
+        }
+    }
+
     private class SettleRunnable implements Runnable {
 
         private final View mView;
@@ -345,6 +531,13 @@
         SettleRunnable(View view, @State int targetState) {
             mView = view;
             mTargetState = targetState;
+            if (NEEDS_INVALIDATING) {
+                // We need to invalidate the parent here, or the following animation won't be drawn.
+                ViewParent parent = mView.getParent();
+                if (parent instanceof View) {
+                    ((View) parent).invalidate();
+                }
+            }
         }
 
         @Override
@@ -393,7 +586,7 @@
                 };
     }
 
-    /*
+    /**
      * A utility function to get the {@link BottomSheetBehavior} associated with the {@code view}.
      *
      * @param view The {@link View} with {@link BottomSheetBehavior}.
diff --git a/design/src/android/support/design/widget/CollapsingToolbarLayout.java b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
index 62fef07..984ff44 100644
--- a/design/src/android/support/design/widget/CollapsingToolbarLayout.java
+++ b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
@@ -360,12 +360,20 @@
             mDrawCollapsingTitle = mDummyView.isShown();
 
             if (mDrawCollapsingTitle) {
-                ViewGroupUtils.getDescendantRect(this, mDummyView, mTmpRect);
-                mCollapsingTextHelper.setCollapsedBounds(mTmpRect.left, bottom - mTmpRect.height(),
-                        mTmpRect.right, bottom);
-
                 final boolean isRtl = ViewCompat.getLayoutDirection(this)
                         == ViewCompat.LAYOUT_DIRECTION_RTL;
+
+                // Update the collapsed bounds
+                ViewGroupUtils.getDescendantRect(this, mDummyView, mTmpRect);
+                mCollapsingTextHelper.setCollapsedBounds(
+                        mTmpRect.left + (isRtl
+                                ? mToolbar.getTitleMarginEnd()
+                                : mToolbar.getTitleMarginStart()),
+                        bottom + mToolbar.getTitleMarginTop() - mTmpRect.height(),
+                        mTmpRect.right + (isRtl
+                                ? mToolbar.getTitleMarginStart()
+                                : mToolbar.getTitleMarginEnd()),
+                        bottom - mToolbar.getTitleMarginBottom());
                 // Update the expanded bounds
                 mCollapsingTextHelper.setExpandedBounds(
                         isRtl ? mExpandedMarginEnd : mExpandedMarginStart,
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index 3d16ac9..a5ce9a3 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -356,7 +356,7 @@
                 // Cancel all behaviors beneath the one that intercepted.
                 // If the event is "down" then we don't have anything to cancel yet.
                 if (b != null) {
-                    if (cancelEvent == null) {
+                    if (cancelEvent != null) {
                         final long now = SystemClock.uptimeMillis();
                         cancelEvent = MotionEvent.obtain(now, now,
                                 MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
@@ -1855,7 +1855,7 @@
          * in place of the default child layout behavior. The Behavior's implementation can
          * delegate to the standard CoordinatorLayout measurement behavior by calling
          * {@link CoordinatorLayout#onLayoutChild(android.view.View, int)
-         * parent.onMeasureChild}.</p>
+         * parent.onLayoutChild}.</p>
          *
          * <p>If a Behavior implements
          * {@link #onDependentViewChanged(CoordinatorLayout, android.view.View, android.view.View)}
diff --git a/design/src/android/support/design/widget/FloatingActionButton.java b/design/src/android/support/design/widget/FloatingActionButton.java
index 998fc2f..c090419 100644
--- a/design/src/android/support/design/widget/FloatingActionButton.java
+++ b/design/src/android/support/design/widget/FloatingActionButton.java
@@ -538,10 +538,6 @@
 
         private void updateFabTranslationForSnackbar(CoordinatorLayout parent,
                 final FloatingActionButton fab, View snackbar) {
-            if (fab.getVisibility() != View.VISIBLE) {
-                return;
-            }
-
             final float targetTransY = getFabTranslationYForSnackbar(parent, fab);
             if (mFabTranslationY == targetTransY) {
                 // We're already at (or currently animating to) the target value, return...
@@ -555,7 +551,8 @@
                 mFabTranslationYAnimator.cancel();
             }
 
-            if (Math.abs(currentTransY - targetTransY) > (fab.getHeight() * 0.667f)) {
+            if (fab.isShown()
+                    && Math.abs(currentTransY - targetTransY) > (fab.getHeight() * 0.667f)) {
                 // If the FAB will be travelling by more than 2/3 of it's height, let's animate
                 // it instead
                 if (mFabTranslationYAnimator == null) {
diff --git a/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java b/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java
index ac24ca2..e9e16d1 100644
--- a/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java
+++ b/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java
@@ -17,9 +17,12 @@
 package android.support.design.widget;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.support.design.widget.CoordinatorLayout.Behavior;
+import android.support.v4.view.GravityCompat;
 import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
+import android.view.Gravity;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -31,6 +34,9 @@
  */
 abstract class HeaderScrollingViewBehavior extends ViewOffsetBehavior<View> {
 
+    private final Rect mTempRect1 = new Rect();
+    private final Rect mTempRect2 = new Rect();
+
     public HeaderScrollingViewBehavior() {}
 
     public HeaderScrollingViewBehavior(Context context, AttributeSet attrs) {
@@ -48,42 +54,77 @@
             // with the maximum visible height
 
             final List<View> dependencies = parent.getDependencies(child);
-            if (dependencies.isEmpty()) {
-                // If we don't have any dependencies, return false
-                return false;
-            }
-
             final View header = findFirstDependency(dependencies);
-            if (header != null && ViewCompat.isLaidOut(header)) {
-                if (ViewCompat.getFitsSystemWindows(header)) {
+            if (header != null) {
+                if (ViewCompat.getFitsSystemWindows(header)
+                        && !ViewCompat.getFitsSystemWindows(child)) {
                     // If the header is fitting system windows then we need to also,
-                    // otherwise we'll get CoL's compatible layout functionality
+                    // otherwise we'll get CoL's compatible measuring
                     ViewCompat.setFitsSystemWindows(child, true);
+
+                    if (ViewCompat.getFitsSystemWindows(child)) {
+                        // If the set succeeded, trigger a new layout and return true
+                        child.requestLayout();
+                        return true;
+                    }
                 }
 
-                int availableHeight = View.MeasureSpec.getSize(parentHeightMeasureSpec);
-                if (availableHeight == 0) {
-                    // If the measure spec doesn't specify a size, use the current height
-                    availableHeight = parent.getHeight();
+                if (ViewCompat.isLaidOut(header)) {
+                    int availableHeight = View.MeasureSpec.getSize(parentHeightMeasureSpec);
+                    if (availableHeight == 0) {
+                        // If the measure spec doesn't specify a size, use the current height
+                        availableHeight = parent.getHeight();
+                    }
+
+                    final int height = availableHeight - header.getMeasuredHeight()
+                            + getScrollRange(header);
+                    final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height,
+                            childLpHeight == ViewGroup.LayoutParams.MATCH_PARENT
+                                    ? View.MeasureSpec.EXACTLY
+                                    : View.MeasureSpec.AT_MOST);
+
+                    // Now measure the scrolling view with the correct height
+                    parent.onMeasureChild(child, parentWidthMeasureSpec,
+                            widthUsed, heightMeasureSpec, heightUsed);
+
+                    return true;
                 }
-
-                final int height = availableHeight - header.getMeasuredHeight()
-                        + getScrollRange(header);
-                final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height,
-                        childLpHeight == ViewGroup.LayoutParams.MATCH_PARENT
-                                ? View.MeasureSpec.EXACTLY
-                                : View.MeasureSpec.AT_MOST);
-
-                // Now measure the scrolling menu with the correct height
-                parent.onMeasureChild(child, parentWidthMeasureSpec,
-                        widthUsed, heightMeasureSpec, heightUsed);
-
-                return true;
             }
         }
         return false;
     }
 
+    @Override
+    protected void layoutChild(final CoordinatorLayout parent, final View child,
+            final int layoutDirection) {
+        final List<View> dependencies = parent.getDependencies(child);
+        final View header = findFirstDependency(dependencies);
+
+        if (header != null) {
+            final CoordinatorLayout.LayoutParams lp =
+                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
+            final Rect available = mTempRect1;
+            available.set(parent.getPaddingLeft() + lp.leftMargin,
+                    header.getBottom() + lp.topMargin,
+                    parent.getWidth() - parent.getPaddingRight() - lp.rightMargin,
+                    parent.getHeight() + header.getBottom()
+                            - parent.getPaddingBottom() - lp.bottomMargin);
+
+            final Rect out = mTempRect2;
+            GravityCompat.apply(resolveGravity(lp.gravity), child.getMeasuredWidth(),
+                    child.getMeasuredHeight(), available, out, layoutDirection);
+
+            child.layout(out.left, out.top, out.right, out.bottom);
+        } else {
+            // If we don't have a dependency, let super handle it
+            super.layoutChild(parent, child, layoutDirection);
+        }
+    }
+
+    private static int resolveGravity(int gravity) {
+        return gravity == Gravity.NO_GRAVITY ? GravityCompat.START | Gravity.TOP : gravity;
+    }
+
     abstract View findFirstDependency(List<View> views);
 
     int getScrollRange(View v) {
diff --git a/design/src/android/support/design/widget/NavigationView.java b/design/src/android/support/design/widget/NavigationView.java
index 57882db..a73dc65 100644
--- a/design/src/android/support/design/widget/NavigationView.java
+++ b/design/src/android/support/design/widget/NavigationView.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -218,6 +219,13 @@
         super.onMeasure(widthSpec, heightSpec);
     }
 
+    /**
+     * @hide
+     */
+    @Override
+    protected void onInsetsChanged(Rect insets) {
+        mPresenter.setPaddingTopDefault(insets.top);
+    }
 
     /**
      * Inflate a menu resource into this navigation view.
@@ -400,10 +408,10 @@
             return null;
         }
         ColorStateList baseColor = getResources().getColorStateList(value.resourceId);
-        if (!getContext().getTheme().resolveAttribute(R.attr.colorPrimary, value, true)) {
+        if (!getContext().getTheme().resolveAttribute(R.attr.colorControlActivated, value, true)) {
             return null;
         }
-        int colorPrimary = value.data;
+        int colorControlActivated = value.data;
         int defaultColor = baseColor.getDefaultColor();
         return new ColorStateList(new int[][]{
                 DISABLED_STATE_SET,
@@ -411,7 +419,7 @@
                 EMPTY_STATE_SET
         }, new int[]{
                 baseColor.getColorForState(DISABLED_STATE_SET, defaultColor),
-                colorPrimary,
+                colorControlActivated,
                 defaultColor
         });
     }
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
index a328d98..76e43ec 100644
--- a/design/src/android/support/design/widget/Snackbar.java
+++ b/design/src/android/support/design/widget/Snackbar.java
@@ -25,6 +25,7 @@
 import android.os.Message;
 import android.support.annotation.ColorInt;
 import android.support.annotation.IntDef;
+import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.support.design.R;
@@ -120,6 +121,7 @@
      * @hide
      */
     @IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
+    @IntRange(from = 1)
     @Retention(RetentionPolicy.SOURCE)
     public @interface Duration {}
 
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
index fe1a105..3fd9024 100755
--- a/design/src/android/support/design/widget/TabLayout.java
+++ b/design/src/android/support/design/widget/TabLayout.java
@@ -213,7 +213,6 @@
     private int mMode;
 
     private OnTabSelectedListener mOnTabSelectedListener;
-    private View.OnClickListener mTabClickListener;
 
     private ValueAnimatorCompat mScrollAnimator;
 
@@ -445,8 +444,12 @@
      */
     @NonNull
     public Tab newTab() {
-        final Tab poolTab = sTabPool.acquire();
-        return poolTab != null ? poolTab : new Tab(this);
+        Tab tab = sTabPool.acquire();
+        if (tab == null) {
+            tab = new Tab(this);
+        }
+        tab.mView = createTabView(tab);
+        return tab;
     }
 
     /**
@@ -714,8 +717,8 @@
     }
 
     private void updateAllTabs() {
-        for (int i = 0, z = mTabStrip.getChildCount(); i < z; i++) {
-            updateTab(i);
+        for (int i = 0, z = mTabs.size(); i < z; i++) {
+            mTabs.get(i).updateView();
         }
     }
 
@@ -727,17 +730,6 @@
         tabView.setTab(tab);
         tabView.setFocusable(true);
         tabView.setMinimumWidth(getTabMinWidth());
-
-        if (mTabClickListener == null) {
-            mTabClickListener = new View.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-                    TabView tabView = (TabView) view;
-                    tabView.getTab().select();
-                }
-            };
-        }
-        tabView.setOnClickListener(mTabClickListener);
         return tabView;
     }
 
@@ -751,19 +743,8 @@
         }
     }
 
-    private void updateTab(int position) {
-        final TabView view = getTabView(position);
-        if (view != null) {
-            view.update();
-        }
-    }
-
-    private TabView getTabView(int position) {
-        return (TabView) mTabStrip.getChildAt(position);
-    }
-
     private void addTabView(Tab tab, boolean setSelected) {
-        final TabView tabView = createTabView(tab);
+        final TabView tabView = tab.mView;
         mTabStrip.addView(tabView, createLayoutParamsForTabs());
         if (setSelected) {
             tabView.setSelected(true);
@@ -771,7 +752,7 @@
     }
 
     private void addTabView(Tab tab, int position, boolean setSelected) {
-        final TabView tabView = createTabView(tab);
+        final TabView tabView = tab.mView;
         mTabStrip.addView(tabView, position, createLayoutParamsForTabs());
         if (setSelected) {
             tabView.setSelected(true);
@@ -1017,6 +998,7 @@
         private View mCustomView;
 
         private final TabLayout mParent;
+        private TabView mView;
 
         Tab(TabLayout parent) {
             mParent = parent;
@@ -1070,9 +1052,7 @@
         @NonNull
         public Tab setCustomView(@Nullable View view) {
             mCustomView = view;
-            if (mPosition >= 0) {
-                mParent.updateTab(mPosition);
-            }
+            updateView();
             return this;
         }
 
@@ -1091,9 +1071,8 @@
          */
         @NonNull
         public Tab setCustomView(@LayoutRes int resId) {
-            final TabView tabView = mParent.getTabView(mPosition);
-            final LayoutInflater inflater = LayoutInflater.from(tabView.getContext());
-            return setCustomView(inflater.inflate(resId, tabView, false));
+            final LayoutInflater inflater = LayoutInflater.from(mView.getContext());
+            return setCustomView(inflater.inflate(resId, mView, false));
         }
 
         /**
@@ -1139,9 +1118,7 @@
         @NonNull
         public Tab setIcon(@Nullable Drawable icon) {
             mIcon = icon;
-            if (mPosition >= 0) {
-                mParent.updateTab(mPosition);
-            }
+            updateView();
             return this;
         }
 
@@ -1166,9 +1143,7 @@
         @NonNull
         public Tab setText(@Nullable CharSequence text) {
             mText = text;
-            if (mPosition >= 0) {
-                mParent.updateTab(mPosition);
-            }
+            updateView();
             return this;
         }
 
@@ -1224,9 +1199,7 @@
         @NonNull
         public Tab setContentDescription(@Nullable CharSequence contentDesc) {
             mContentDesc = contentDesc;
-            if (mPosition >= 0) {
-                mParent.updateTab(mPosition);
-            }
+            updateView();
             return this;
         }
 
@@ -1242,7 +1215,14 @@
             return mContentDesc;
         }
 
+        private void updateView() {
+            if (mView != null) {
+                mView.update();
+            }
+        }
+
         private void reset() {
+            mView = null;
             mTag = null;
             mIcon = null;
             mText = null;
@@ -1273,6 +1253,19 @@
                     mTabPaddingEnd, mTabPaddingBottom);
             setGravity(Gravity.CENTER);
             setOrientation(VERTICAL);
+            setClickable(true);
+        }
+
+        @Override
+        public boolean performClick() {
+            final boolean value = super.performClick();
+
+            if (mTab != null) {
+                mTab.select();
+                return true;
+            } else {
+                return value;
+            }
         }
 
         @Override
diff --git a/design/src/android/support/design/widget/TextInputLayout.java b/design/src/android/support/design/widget/TextInputLayout.java
index 32abe85..524d500 100644
--- a/design/src/android/support/design/widget/TextInputLayout.java
+++ b/design/src/android/support/design/widget/TextInputLayout.java
@@ -26,6 +26,8 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.DrawableContainer;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.StyleRes;
@@ -41,6 +43,7 @@
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
+import android.util.SparseArray;
 import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.View;
@@ -77,6 +80,7 @@
     private TextView mErrorView;
     private int mErrorTextAppearance;
     private boolean mErrorShown;
+    private CharSequence mError;
 
     private boolean mCounterEnabled;
     private TextView mCounterView;
@@ -274,8 +278,6 @@
 
         if (mCounterOverflowed && mCounterView != null) {
             mCollapsingTextHelper.setCollapsedTextColor(mCounterView.getCurrentTextColor());
-        } else if (isErrorShowing && mErrorView != null) {
-            mCollapsingTextHelper.setCollapsedTextColor(mErrorView.getCurrentTextColor());
         } else if (isFocused && mFocusedTextColor != null) {
             mCollapsingTextHelper.setCollapsedTextColor(mFocusedTextColor.getDefaultColor());
         } else if (mDefaultTextColor != null) {
@@ -492,7 +494,14 @@
      *
      * @see #getError()
      */
-    public void setError(@Nullable CharSequence error) {
+    public void setError(@Nullable final CharSequence error) {
+        if (TextUtils.equals(mError, error)) {
+            // If we already have the same error, ignore
+            return;
+        }
+
+        mError = error;
+
         if (!mErrorEnabled) {
             if (TextUtils.isEmpty(error)) {
                 // If error isn't enabled, and the error is empty, just return
@@ -502,15 +511,13 @@
             setErrorEnabled(true);
         }
 
-        if (!TextUtils.isEmpty(error)) {
-            boolean animate;
-            if (TextUtils.equals(error, mErrorView.getText())) {
-                // We've been given the same error message, so only animate if needed
-                animate = !mErrorView.isShown() || ViewCompat.getAlpha(mErrorView) < 1f;
-            } else {
-                animate = true;
-                mErrorView.setText(error);
-            }
+        // Only animate if we've been laid out already
+        final boolean animate = ViewCompat.isLaidOut(this);
+        mErrorShown = !TextUtils.isEmpty(error);
+
+        if (mErrorShown) {
+            mErrorView.setText(error);
+            mErrorView.setVisibility(VISIBLE);
 
             if (animate) {
                 if (ViewCompat.getAlpha(mErrorView) == 1f) {
@@ -526,34 +533,30 @@
                             public void onAnimationStart(View view) {
                                 view.setVisibility(VISIBLE);
                             }
-                        })
-                        .start();
+                        }).start();
             }
-
-            // Set the EditText's background tint to the error color
-            mErrorShown = true;
-            updateEditTextBackground();
-            updateLabelState(true);
         } else {
             if (mErrorView.getVisibility() == VISIBLE) {
-                ViewCompat.animate(mErrorView)
-                        .alpha(0f)
-                        .setDuration(ANIMATION_DURATION)
-                        .setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR)
-                        .setListener(new ViewPropertyAnimatorListenerAdapter() {
-                            @Override
-                            public void onAnimationEnd(View view) {
-                                view.setVisibility(INVISIBLE);
-
-                                updateLabelState(true);
-                            }
-                        }).start();
-
-                // Restore the 'original' tint, using colorControlNormal and colorControlActivated
-                mErrorShown = false;
-                updateEditTextBackground();
+                if (animate) {
+                    ViewCompat.animate(mErrorView)
+                            .alpha(0f)
+                            .setDuration(ANIMATION_DURATION)
+                            .setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR)
+                            .setListener(new ViewPropertyAnimatorListenerAdapter() {
+                                @Override
+                                public void onAnimationEnd(View view) {
+                                    mErrorView.setText(error);
+                                    view.setVisibility(INVISIBLE);
+                                }
+                            }).start();
+                } else {
+                    mErrorView.setVisibility(INVISIBLE);
+                }
             }
         }
+
+        updateEditTextBackground();
+        updateLabelState(true);
     }
 
     /**
@@ -701,6 +704,62 @@
         }
     }
 
+    static class SavedState extends BaseSavedState {
+        CharSequence error;
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        public SavedState(Parcel source) {
+            super(source);
+            error = source.readString();
+
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            TextUtils.writeToParcel(error, dest, flags);
+        }
+
+        @Override
+        public String toString() {
+            return "TextInputLayout.SavedState{"
+                    + Integer.toHexString(System.identityHashCode(this))
+                    + " error=" + error + "}";
+        }
+
+        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);
+        if (mErrorShown) {
+            ss.error = getError();
+        }
+        return ss;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        SavedState ss = (SavedState) state;
+        super.onRestoreInstanceState(ss.getSuperState());
+        setError(ss.error);
+        requestLayout();
+    }
+
     /**
      * Returns the error message that was set to be displayed with
      * {@link #setError(CharSequence)}, or <code>null</code> if no error was set
@@ -710,10 +769,7 @@
      */
     @Nullable
     public CharSequence getError() {
-        if (mErrorEnabled && mErrorView != null && mErrorView.getVisibility() == VISIBLE) {
-            return mErrorView.getText();
-        }
-        return null;
+        return mErrorEnabled ? mError : null;
     }
 
     /**
@@ -818,15 +874,6 @@
         mAnimator.start();
     }
 
-    private int getThemeAttrColor(int attr) {
-        TypedValue tv = new TypedValue();
-        if (getContext().getTheme().resolveAttribute(attr, tv, true)) {
-            return tv.data;
-        } else {
-            return Color.MAGENTA;
-        }
-    }
-
     private class TextInputAccessibilityDelegate extends AccessibilityDelegateCompat {
         @Override
         public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
diff --git a/design/src/android/support/design/widget/ViewOffsetBehavior.java b/design/src/android/support/design/widget/ViewOffsetBehavior.java
index 3ffc744..541de69 100644
--- a/design/src/android/support/design/widget/ViewOffsetBehavior.java
+++ b/design/src/android/support/design/widget/ViewOffsetBehavior.java
@@ -38,8 +38,8 @@
 
     @Override
     public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
-        // First let the parent lay it out
-        parent.onLayoutChild(child, layoutDirection);
+        // First let lay the child out
+        layoutChild(parent, child, layoutDirection);
 
         if (mViewOffsetHelper == null) {
             mViewOffsetHelper = new ViewOffsetHelper(child);
@@ -58,6 +58,11 @@
         return true;
     }
 
+    protected void layoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
+        // Let the parent lay it out by default
+        parent.onLayoutChild(child, layoutDirection);
+    }
+
     public boolean setTopAndBottomOffset(int offset) {
         if (mViewOffsetHelper != null) {
             return mViewOffsetHelper.setTopAndBottomOffset(offset);
diff --git a/graphics/drawable/Android.mk b/graphics/drawable/Android.mk
index 06d8d6f..895989b 100644
--- a/graphics/drawable/Android.mk
+++ b/graphics/drawable/Android.mk
@@ -18,25 +18,21 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-vectordrawable
 LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, static util)
+LOCAL_SRC_FILES := $(call all-java-files-under, static/src)
 
 LOCAL_JAVA_LIBRARIES := android-support-v4
 
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
-
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 #Animated vector drawable library
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v11-animatedvectordrawable
 LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, animated util)
+LOCAL_SRC_FILES := $(call all-java-files-under, animated/src)
 
 LOCAL_JAVA_LIBRARIES := android-support-v4
 
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
-
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-vectordrawable
 
 LOCAL_AAPT_FLAGS := --no-version-vectors
-include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/graphics/drawable/animated/AndroidManifest.xml b/graphics/drawable/animated/AndroidManifest.xml
new file mode 100644
index 0000000..17e9ce5
--- /dev/null
+++ b/graphics/drawable/animated/AndroidManifest.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.graphics.drawable.animated">
+    <application/>
+</manifest>
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
new file mode 100644
index 0000000..c35a704
--- /dev/null
+++ b/graphics/drawable/animated/build.gradle
@@ -0,0 +1,121 @@
+apply plugin: 'android-library'
+
+archivesBaseName = 'animated-vector-drawable'
+
+dependencies {
+    compile project(':support-vector-drawable')
+    testCompile 'junit:junit:4.12'
+}
+
+android {
+    compileSdkVersion 23
+    buildToolsVersion "19.1.0"
+
+    defaultConfig {
+        minSdkVersion 11
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDir 'src'
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/src'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    lintOptions {
+        abortOnError true
+    }
+
+    aaptOptions {
+        additionalParameters "--no-version-vectors"
+    }
+
+    packagingOptions {
+        exclude 'LICENSE.txt'
+    }
+
+    testOptions {
+        unitTests.returnDefaultValues = true
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar) {
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+// TODO make this generic for all projects
+afterEvaluate {
+    def originalTask = tasks['packageDebugAndroidTest']
+    tasks['assembleDebugAndroidTest'].doLast {
+        copy {
+            from(originalTask.outputFile)
+            into(rootProject.ext.testApkDistOut)
+        }
+    }
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support AnimatedVectorDrawable'
+                description "Android Support AnimatedVectorDrawable"
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2015'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index eff9670..ddb16e7 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -16,6 +16,7 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorInflater;
+import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
@@ -23,18 +24,18 @@
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
-import android.graphics.PorterDuff.Mode;
 import android.graphics.Rect;
 import android.graphics.drawable.Animatable;
+import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.DrawableRes;
 import android.support.v4.util.ArrayMap;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -44,12 +45,12 @@
 /**
  * This class uses {@link android.animation.ObjectAnimator} and
  * {@link android.animation.AnimatorSet} to animate the properties of a
- * {@link android.support.graphics.drawable.VectorDrawableCompat} to create an animated drawable.
+ * {@link VectorDrawableCompat} to create an animated drawable.
  * <p>
  * AnimatedVectorDrawableCompat are normally defined as 3 separate XML files.
  * </p>
  * <p>
- * First is the XML file for {@link android.support.graphics.drawable.VectorDrawableCompat}. Note that we
+ * First is the XML file for {@link VectorDrawableCompat}. Note that we
  * allow the animation to happen on the group's attributes and path's attributes, which requires they
  * are uniquely named in this XML file. Groups and paths without animations do not need names.
  * </p>
@@ -123,8 +124,9 @@
  * @attr ref android.R.styleable#AnimatedVectorDrawableCompatTarget_name
  * @attr ref android.R.styleable#AnimatedVectorDrawableCompatTarget_animation
  */
-public class AnimatedVectorDrawableCompat extends Drawable implements Animatable {
-    private static final String LOGTAG = "AnimatedVectorDrawableCompat";
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class AnimatedVectorDrawableCompat extends VectorDrawableCommon implements Animatable {
+    private static final String LOGTAG = "AnimatedVDCompat";
 
     private static final String ANIMATED_VECTOR = "animated-vector";
     private static final String TARGET = "target";
@@ -133,35 +135,37 @@
 
     private AnimatedVectorDrawableCompatState mAnimatedVectorState;
 
-    private boolean mMutated;
-
     private Context mContext;
 
-    // Currently the only useful ctor.
-    public AnimatedVectorDrawableCompat(Context context) {
+    AnimatedVectorDrawableDelegateState mCachedConstantStateDelegate;
+
+    private AnimatedVectorDrawableCompat() {
+        this(null, null, null);
+    }
+
+    private AnimatedVectorDrawableCompat(@Nullable Context context) {
         this(context, null, null);
     }
 
-    private AnimatedVectorDrawableCompat(Context context, AnimatedVectorDrawableCompatState state,
-            Resources res) {
+    private AnimatedVectorDrawableCompat(@Nullable Context context,
+                                         @Nullable AnimatedVectorDrawableCompatState state,
+                                         @Nullable Resources res) {
         mContext = context;
         if (state != null) {
             mAnimatedVectorState = state;
         } else {
             mAnimatedVectorState = new AnimatedVectorDrawableCompatState(context, state, mCallback,
-                res);
+                    res);
         }
     }
 
     @Override
     public Drawable mutate() {
-        if (!mMutated && super.mutate() == this) {
-            mAnimatedVectorState =
-                    new AnimatedVectorDrawableCompatState(null, mAnimatedVectorState, mCallback,
-                            null);
-            mMutated = true;
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.mutate();
+            return this;
         }
-        return this;
+        throw new IllegalStateException("Mutate() is not supported for older platform");
     }
 
 
@@ -169,12 +173,22 @@
      * Create a AnimatedVectorDrawableCompat object.
      *
      * @param context the context for creating the animators.
-     * @param resId the resource ID for AnimatedVectorDrawableCompat object.
+     * @param resId   the resource ID for AnimatedVectorDrawableCompat object.
      * @return a new AnimatedVectorDrawableCompat or null if parsing error is found.
      */
     @Nullable
     public static AnimatedVectorDrawableCompat create(@NonNull Context context,
-            @DrawableRes int resId) {
+                                                      @DrawableRes int resId) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            final AnimatedVectorDrawableCompat drawable = new AnimatedVectorDrawableCompat(context);
+            drawable.mDelegateDrawable =
+                    (AnimatedVectorDrawable) context.getResources().getDrawable(resId,
+                            context.getTheme());
+            drawable.mDelegateDrawable.setCallback(drawable.mCallback);
+            drawable.mCachedConstantStateDelegate = new AnimatedVectorDrawableDelegateState(
+                    drawable.mDelegateDrawable.getConstantState());
+            return drawable;
+        }
         Resources resources = context.getResources();
         try {
             final XmlPullParser parser = resources.getXml(resId);
@@ -200,19 +214,36 @@
         return null;
     }
 
+    /**
+     * {@inheritDoc}
+     * <strong>Note</strong> that we don't support constant state when SDK < 21.
+     * Make sure you check the return value before using it.
+     */
     @Override
     public ConstantState getConstantState() {
-        mAnimatedVectorState.mChangingConfigurations = getChangingConfigurations();
-        return mAnimatedVectorState;
+        if (mDelegateDrawable != null) {
+            return new AnimatedVectorDrawableDelegateState(mDelegateDrawable.getConstantState());
+        }
+        // We can't support constant state in older platform.
+        // We need Context to create the animator, and we can't save the context in the constant
+        // state.
+        return null;
     }
 
     @Override
     public int getChangingConfigurations() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getChangingConfigurations();
+        }
         return super.getChangingConfigurations() | mAnimatedVectorState.mChangingConfigurations;
     }
 
     @Override
     public void draw(Canvas canvas) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.draw(canvas);
+            return;
+        }
         mAnimatedVectorState.mVectorDrawable.draw(canvas);
         if (isStarted()) {
             invalidateSelf();
@@ -221,63 +252,108 @@
 
     @Override
     protected void onBoundsChange(Rect bounds) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setBounds(bounds);
+            return;
+        }
         mAnimatedVectorState.mVectorDrawable.setBounds(bounds);
     }
 
     @Override
     protected boolean onStateChange(int[] state) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setState(state);
+        }
         return mAnimatedVectorState.mVectorDrawable.setState(state);
     }
 
     @Override
     protected boolean onLevelChange(int level) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setLevel(level);
+        }
         return mAnimatedVectorState.mVectorDrawable.setLevel(level);
     }
 
-    // @Override
+    @Override
     public int getAlpha() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getAlpha();
+        }
         return mAnimatedVectorState.mVectorDrawable.getAlpha();
     }
 
-    // @Override
+    @Override
     public void setAlpha(int alpha) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setAlpha(alpha);
+            return;
+        }
         mAnimatedVectorState.mVectorDrawable.setAlpha(alpha);
     }
 
     @Override
     public void setColorFilter(ColorFilter colorFilter) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setColorFilter(colorFilter);
+            return;
+        }
         mAnimatedVectorState.mVectorDrawable.setColorFilter(colorFilter);
     }
 
     public void setTintList(ColorStateList tint) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setTintList(tint);
+            return;
+        }
         mAnimatedVectorState.mVectorDrawable.setTintList(tint);
     }
 
-    public void setTintMode(Mode tintMode) {
-        mAnimatedVectorState.mVectorDrawable.setTintMode(tintMode);
+    @Override
+    public void setHotspot(float x, float y) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setHotspot(x, y);
+            return;
+        }
+        mDelegateDrawable.setHotspot(x, y);
     }
 
     @Override
     public boolean setVisible(boolean visible, boolean restart) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setVisible(visible, restart);
+        }
         mAnimatedVectorState.mVectorDrawable.setVisible(visible, restart);
         return super.setVisible(visible, restart);
     }
 
     @Override
     public boolean isStateful() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.isStateful();
+        }
         return mAnimatedVectorState.mVectorDrawable.isStateful();
     }
 
     @Override
     public int getOpacity() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getOpacity();
+        }
         return mAnimatedVectorState.mVectorDrawable.getOpacity();
     }
 
     public int getIntrinsicWidth() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getIntrinsicWidth();
+        }
         return mAnimatedVectorState.mVectorDrawable.getIntrinsicWidth();
     }
 
     public int getIntrinsicHeight() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getIntrinsicHeight();
+        }
         return mAnimatedVectorState.mVectorDrawable.getIntrinsicHeight();
     }
 
@@ -293,10 +369,14 @@
         return theme.obtainStyledAttributes(set, attrs, 0, 0);
     }
 
+    @Override
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
             throws XmlPullParserException, IOException {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.inflate(res, parser, attrs, theme);
+            return;
+        }
         int eventType = parser.getEventType();
-        float pathErrorScale = 1;
         while (eventType != XmlPullParser.END_DOCUMENT) {
             if (eventType == XmlPullParser.START_TAG) {
                 final String tagName = parser.getName();
@@ -305,10 +385,11 @@
                 }
                 if (ANIMATED_VECTOR.equals(tagName)) {
                     final TypedArray a =
-                            obtainAttributes(res, theme, attrs, AndroidResources.styleable_AnimatedVectorDrawable);
+                            obtainAttributes(res, theme, attrs,
+                                    AndroidResources.styleable_AnimatedVectorDrawable);
 
-                    int drawableRes = a.getResourceId(AndroidResources.styleable_AnimatedVectorDrawable_drawable,
-                            0);
+                    int drawableRes = a.getResourceId(
+                            AndroidResources.styleable_AnimatedVectorDrawable_drawable, 0);
                     if (DBG_ANIMATION_VECTOR_DRAWABLE) {
                         Log.v(LOGTAG, "drawableRes is " + drawableRes);
                     }
@@ -317,7 +398,6 @@
                                 drawableRes, theme);
                         vectorDrawable.setAllowCaching(false);
                         vectorDrawable.setCallback(mCallback);
-                        pathErrorScale = vectorDrawable.getPixelSize();
                         if (mAnimatedVectorState.mVectorDrawable != null) {
                             mAnimatedVectorState.mVectorDrawable.setCallback(null);
                         }
@@ -326,14 +406,21 @@
                     a.recycle();
                 } else if (TARGET.equals(tagName)) {
                     final TypedArray a =
-                            res.obtainAttributes(attrs, AndroidResources.styleable_AnimatedVectorDrawableTarget);
+                            res.obtainAttributes(attrs,
+                                    AndroidResources.styleable_AnimatedVectorDrawableTarget);
                     final String target = a.getString(
                             AndroidResources.styleable_AnimatedVectorDrawableTarget_name);
 
-                    int id = a.getResourceId(AndroidResources.styleable_AnimatedVectorDrawableTarget_animation, 0);
+                    int id = a.getResourceId(
+                            AndroidResources.styleable_AnimatedVectorDrawableTarget_animation, 0);
                     if (id != 0) {
-                        Animator objectAnimator = AnimatorInflater.loadAnimator(mContext, id);
-                        setupAnimatorsForTarget(target, objectAnimator);
+                        if (mContext != null) {
+                            Animator objectAnimator = AnimatorInflater.loadAnimator(mContext, id);
+                            setupAnimatorsForTarget(target, objectAnimator);
+                        } else {
+                            throw new IllegalStateException("Context can't be null when inflating" +
+                                    " animators");
+                        }
                     }
                     a.recycle();
                 }
@@ -349,16 +436,82 @@
         inflate(res, parser, attrs, null);
     }
 
+    @Override
+    public void applyTheme(Theme t) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.applyTheme(t);
+            return;
+        }
+        // TODO: support theming in older platform.
+        return;
+    }
+
     public boolean canApplyTheme() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.canApplyTheme();
+        }
+        // TODO: support theming in older platform.
         return false;
     }
 
+    /**
+     * Constant state for delegating the creating drawable job.
+     * Instead of creating a VectorDrawable, create a VectorDrawableCompat instance which contains
+     * a delegated VectorDrawable instance.
+     */
+    private static class AnimatedVectorDrawableDelegateState extends ConstantState {
+        private final ConstantState mDelegateState;
+
+        public AnimatedVectorDrawableDelegateState(ConstantState state) {
+            mDelegateState = state;
+        }
+
+        @Override
+        public Drawable newDrawable() {
+            AnimatedVectorDrawableCompat drawableCompat =
+                    new AnimatedVectorDrawableCompat();
+            drawableCompat.mDelegateDrawable =
+                    (AnimatedVectorDrawable) mDelegateState.newDrawable();
+            drawableCompat.mDelegateDrawable.setCallback(drawableCompat.mCallback);
+            return drawableCompat;
+        }
+
+        @Override
+        public Drawable newDrawable(Resources res) {
+            AnimatedVectorDrawableCompat drawableCompat =
+                    new AnimatedVectorDrawableCompat();
+            drawableCompat.mDelegateDrawable =
+                    (AnimatedVectorDrawable) mDelegateState.newDrawable(res);
+            drawableCompat.mDelegateDrawable.setCallback(drawableCompat.mCallback);
+            return drawableCompat;
+        }
+
+        @Override
+        public Drawable newDrawable(Resources res, Theme theme) {
+            AnimatedVectorDrawableCompat drawableCompat =
+                    new AnimatedVectorDrawableCompat();
+            drawableCompat.mDelegateDrawable =
+                    (AnimatedVectorDrawable) mDelegateState.newDrawable(res, theme);
+            drawableCompat.mDelegateDrawable.setCallback(drawableCompat.mCallback);
+            return drawableCompat;
+        }
+
+        @Override
+        public boolean canApplyTheme() {
+            return mDelegateState.canApplyTheme();
+        }
+
+        @Override
+        public int getChangingConfigurations() {
+            return mDelegateState.getChangingConfigurations();
+        }
+    }
+
     private static class AnimatedVectorDrawableCompatState extends ConstantState {
         int mChangingConfigurations;
         VectorDrawableCompat mVectorDrawable;
         ArrayList<Animator> mAnimators;
         ArrayMap<Animator, String> mTargetNameMap;
-        Context mContext;
 
         public AnimatedVectorDrawableCompatState(Context context,
                 AnimatedVectorDrawableCompatState copy, Callback owner, Resources res) {
@@ -391,23 +544,16 @@
                     }
                 }
             }
-
-            if (context != null) {
-                mContext = context;
-            } else {
-                mContext = copy.mContext;
-            }
-
         }
 
         @Override
         public Drawable newDrawable() {
-            return new AnimatedVectorDrawableCompat(mContext, this, null);
+            throw new IllegalStateException("No constant state support for SDK < 21.");
         }
 
         @Override
         public Drawable newDrawable(Resources res) {
-            return new AnimatedVectorDrawableCompat(mContext, this, res);
+            throw new IllegalStateException("No constant state support for SDK < 21.");
         }
 
         @Override
@@ -432,6 +578,9 @@
 
     @Override
     public boolean isRunning() {
+        if (mDelegateDrawable != null) {
+            return ((AnimatedVectorDrawable) mDelegateDrawable).isRunning();
+        }
         final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
         final int size = animators.size();
         for (int i = 0; i < size; i++) {
@@ -460,6 +609,10 @@
 
     @Override
     public void start() {
+        if (mDelegateDrawable != null) {
+            ((AnimatedVectorDrawable) mDelegateDrawable).start();
+            return;
+        }
         // If any one of the animator has not ended, do nothing.
         if (isStarted()) {
             return;
@@ -476,6 +629,10 @@
 
     @Override
     public void stop() {
+        if (mDelegateDrawable != null) {
+            ((AnimatedVectorDrawable) mDelegateDrawable).stop();
+            return;
+        }
         final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
         final int size = animators.size();
         for (int i = 0; i < size; i++) {
diff --git a/graphics/drawable/animated/tests/AndroidManifest.xml b/graphics/drawable/animated/tests/AndroidManifest.xml
new file mode 100644
index 0000000..cc4d247
--- /dev/null
+++ b/graphics/drawable/animated/tests/AndroidManifest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.graphics.drawable.animated.tests">
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <application>
+    <activity android:name="android.support.graphics.drawable.tests.DrawableStubActivity"/>
+    </application>
+</manifest>
diff --git a/graphics/drawable/testanimated/res/anim/animation_grouping_1_01.xml b/graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml
similarity index 70%
rename from graphics/drawable/testanimated/res/anim/animation_grouping_1_01.xml
rename to graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml
index 36c297f..3119237 100644
--- a/graphics/drawable/testanimated/res/anim/animation_grouping_1_01.xml
+++ b/graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml
@@ -15,8 +15,12 @@
      limitations under the License.
 -->
 
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="3300"
-    android:propertyName="rotation"
-    android:valueFrom="0"
-    android:valueTo="450" />
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <objectAnimator
+            android:duration="50"
+            android:propertyName="rotation"
+            android:valueFrom="0"
+            android:valueTo="180"
+            android:repeatCount="2"/>
+</set>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml b/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 73%
rename from graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml
rename to graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml
index 2944dc2..0451a24 100644
--- a/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml
+++ b/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml
@@ -14,12 +14,13 @@
      limitations under the License.
 -->
 <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_progress_bar" >
+                 android:drawable="@drawable/vector_drawable_grouping_1">
 
     <target
-        android:name="pie1"
-        android:animation="@anim/trim_path_animation_progress_bar" />
+            android:name="sun"
+            android:animation="@anim/animation_grouping_1_01"/>
     <target
-        android:name="root_bar"
-        android:animation="@anim/alpha_animation_progress_bar" />
+            android:name="earth"
+            android:animation="@anim/animation_grouping_1_01"/>
+
 </animated-vector>
\ No newline at end of file
diff --git a/graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml b/graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..f125c17
--- /dev/null
+++ b/graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="256"
+        android:viewportWidth="256">
+
+    <group
+            android:name="shape_layer_1"
+            android:translateX="128"
+            android:translateY="128">
+        <group android:name="sun">
+            <path
+                    android:name="ellipse_path_1"
+                    android:fillColor="#ffff8000"
+                    android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0"/>
+
+            <group
+                    android:name="earth"
+                    android:translateX="75">
+                <path
+                        android:name="ellipse_path_1_1"
+                        android:fillColor="#ff5656ea"
+                        android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0"/>
+
+                <group
+                        android:name="moon"
+                        android:translateX="25">
+                    <path
+                            android:name="ellipse_path_1_2"
+                            android:fillColor="#ffadadad"
+                            android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0"/>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
new file mode 100644
index 0000000..5d849c1
--- /dev/null
+++ b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
@@ -0,0 +1,199 @@
+/*
+ * 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.graphics.drawable.tests;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Animatable2;
+import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Drawable.ConstantState;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import android.support.graphics.drawable.animated.test.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class AnimatedVectorDrawableTest extends ActivityInstrumentationTestCase2<DrawableStubActivity> {
+    private static final String LOGTAG = AnimatedVectorDrawableTest.class.getSimpleName();
+
+    private static final int IMAGE_WIDTH = 64;
+    private static final int IMAGE_HEIGHT = 64;
+
+    private DrawableStubActivity mActivity;
+    private Resources mResources;
+    private AnimatedVectorDrawableCompat mAnimatedVectorDrawable;
+    private Bitmap mBitmap;
+    private Canvas mCanvas;
+    private static final boolean DBG_DUMP_PNG = false;
+    private int mResId = R.drawable.animation_vector_drawable_grouping_1;
+
+    public AnimatedVectorDrawableTest() {
+        super(DrawableStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mBitmap = Bitmap.createBitmap(IMAGE_WIDTH, IMAGE_HEIGHT, Bitmap.Config.ARGB_8888);
+        mCanvas = new Canvas(mBitmap);
+        mActivity = getActivity();
+        mResources = mActivity.getResources();
+
+        mAnimatedVectorDrawable = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+    }
+
+    // This is only for debugging or golden image (re)generation purpose.
+    private void saveVectorDrawableIntoPNG(Bitmap bitmap, int resId) throws IOException {
+        // Save the image to the disk.
+        FileOutputStream out = null;
+        try {
+            String outputFolder = "/sdcard/temp/";
+            File folder = new File(outputFolder);
+            if (!folder.exists()) {
+                folder.mkdir();
+            }
+            String originalFilePath = mResources.getString(resId);
+            File originalFile = new File(originalFilePath);
+            String fileFullName = originalFile.getName();
+            String fileTitle = fileFullName.substring(0, fileFullName.lastIndexOf("."));
+            String outputFilename = outputFolder + fileTitle + "_golden.png";
+            File outputFile = new File(outputFilename);
+            if (!outputFile.exists()) {
+                outputFile.createNewFile();
+            }
+
+            out = new FileOutputStream(outputFile, false);
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+            Log.v(LOGTAG, "Write test No." + outputFilename + " to file successfully.");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+    public void testInflate() throws Exception {
+        // Setup AnimatedVectorDrawableCompat from xml file
+        XmlPullParser parser = mResources.getXml(mResId);
+        AttributeSet attrs = Xml.asAttributeSet(parser);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG &&
+                type != XmlPullParser.END_DOCUMENT) {
+            // Empty loop
+        }
+
+        if (type != XmlPullParser.START_TAG) {
+            throw new XmlPullParserException("No start tag found");
+        }
+
+        mAnimatedVectorDrawable.inflate(mResources, parser, attrs);
+        mAnimatedVectorDrawable.setBounds(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+        mBitmap.eraseColor(0);
+        mAnimatedVectorDrawable.draw(mCanvas);
+        int sunColor = mBitmap.getPixel(IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2);
+        int earthColor = mBitmap.getPixel(IMAGE_WIDTH * 3 / 4 + 2, IMAGE_HEIGHT / 2);
+        assertTrue(sunColor == 0xFFFF8000);
+        assertTrue(earthColor == 0xFF5656EA);
+
+        if (DBG_DUMP_PNG) {
+            saveVectorDrawableIntoPNG(mBitmap, mResId);
+        }
+    }
+
+    public void testGetChangingConfigurations() {
+        AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+        ConstantState constantState = avd.getConstantState();
+
+        if (constantState != null) {
+            // default
+            assertEquals(0, constantState.getChangingConfigurations());
+            assertEquals(0, avd.getChangingConfigurations());
+
+            // change the drawable's configuration does not affect the state's configuration
+            avd.setChangingConfigurations(0xff);
+            assertEquals(0xff, avd.getChangingConfigurations());
+            assertEquals(0, constantState.getChangingConfigurations());
+
+            // the state's configuration get refreshed
+            constantState = avd.getConstantState();
+            assertEquals(0xff, constantState.getChangingConfigurations());
+
+            // set a new configuration to drawable
+            avd.setChangingConfigurations(0xff00);
+            assertEquals(0xff, constantState.getChangingConfigurations());
+            assertEquals(0xffff, avd.getChangingConfigurations());
+        }
+    }
+
+    public void testGetConstantState() {
+        AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+        ConstantState constantState = avd.getConstantState();
+        if (constantState != null) {
+            assertEquals(0, constantState.getChangingConfigurations());
+
+            avd.setChangingConfigurations(1);
+            constantState = avd.getConstantState();
+            assertNotNull(constantState);
+            assertEquals(1, constantState.getChangingConfigurations());
+        }
+    }
+
+    public void testMutate() {
+        AnimatedVectorDrawableCompat d1 = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+        AnimatedVectorDrawableCompat d2 = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+        AnimatedVectorDrawableCompat d3 = AnimatedVectorDrawableCompat.create(mActivity, mResId);
+
+        if (d1.getConstantState() != null) {
+            int originalAlpha = d2.getAlpha();
+            int newAlpha = (originalAlpha + 1) % 255;
+
+            // AVD is different than VectorDrawable. Every instance of it is a deep copy
+            // of the VectorDrawable.
+            // So every setAlpha operation will happen only to that specific object.
+            d1.setAlpha(newAlpha);
+            assertEquals(newAlpha, d1.getAlpha());
+            assertEquals(originalAlpha, d2.getAlpha());
+            assertEquals(originalAlpha, d3.getAlpha());
+
+            d1.mutate();
+            d1.setAlpha(0x40);
+            assertEquals(0x40, d1.getAlpha());
+            assertEquals(originalAlpha, d2.getAlpha());
+            assertEquals(originalAlpha, d3.getAlpha());
+
+            d2.setAlpha(0x20);
+            assertEquals(0x40, d1.getAlpha());
+            assertEquals(0x20, d2.getAlpha());
+            assertEquals(originalAlpha, d3.getAlpha());
+        }
+    }
+}
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java
new file mode 100644
index 0000000..27c55b1
--- /dev/null
+++ b/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java
@@ -0,0 +1,23 @@
+/*
+ * 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.graphics.drawable.tests;
+
+import android.app.Activity;
+
+public class DrawableStubActivity extends Activity {
+}
+
+
diff --git a/graphics/drawable/res/values/attrs.xml b/graphics/drawable/res/values/attrs.xml
deleted file mode 100644
index b54c9a6..0000000
--- a/graphics/drawable/res/values/attrs.xml
+++ /dev/null
@@ -1,183 +0,0 @@
-<?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>
-  <!-- If set, specifies the color to apply to the drawable as a tint. By default,
-       no tint is applied. May be a color state list. -->
-  <attr name="tint" format="color" />
-  <!-- When a tint color is set, specifies its Porter-Duff blending mode. The
-       default value is src_in, which treats the drawable as an alpha mask. -->
-  <attr name="tintMode">
-    <!-- The tint is drawn on top of the drawable.
-         [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] -->
-    <enum name="src_over" value="3" />
-    <!-- The tint is masked by the alpha channel of the drawable. The drawable’s
-         color channels are thrown out. [Sa * Da, Sc * Da] -->
-    <enum name="src_in" value="5" />
-    <!-- The tint is drawn above the drawable, but with the drawable’s alpha
-         channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc] -->
-    <enum name="src_atop" value="9" />
-    <!-- Multiplies the color and alpha channels of the drawable with those of
-         the tint. [Sa * Da, Sc * Dc] -->
-    <enum name="multiply" value="14" />
-    <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
-    <enum name="screen" value="15" />
-    <!-- Combines the tint and drawable color and alpha channels, clamping the
-         result to valid color values. Saturate(S + D) -->
-    <enum name="add" value="16" />
-  </attr>
-  <!-- Animation to use on each child. -->
-  <attr name="animation" format="reference" />
-  <!-- alpha property of the view, as a value between 0 (completely transparent) and 1
-             (completely opaque). -->
-  <attr name="alpha" format="float" />
-  <attr name="pivotX" format="float|fraction" />
-  <attr name="pivotY" format="float|fraction" />
-  <!-- rotation of the view, in degrees. -->
-  <attr name="rotation" format="float" />
-
-  <!-- scale of the view in the x direction. -->
-  <attr name="scaleX" format="float" />
-
-  <!-- scale of the view in the y direction. -->
-  <attr name="scaleY" format="float" />
-  <!-- Makes the TextView be exactly this many pixels tall.
-       You could get the same effect by specifying this number in the
-       layout parameters. -->
-  <attr name="height" format="dimension" />
-  <!-- Makes the TextView be exactly this many pixels wide.
-       You could get the same effect by specifying this number in the
-       layout parameters. -->
-  <attr name="width" format="dimension" />
-  <!-- A unique name for the given item.  This must use a Java-style naming
-       convention to ensure the name is unique, for example
-       "com.mycompany.MyName". -->
-  <attr name="name" format="string" />
-
-  <!-- ========================== -->
-  <!--   VectorDrawable class   -->
-  <!-- ========================== -->
-  <eat-comment />
-
-  <!-- Drawable used to draw vector paths. -->
-  <declare-styleable name="VectorDrawable">
-    <!-- If set, specifies the color to apply to the drawable as a tint. By default,
-         no tint is applied. May be a color state list. -->
-    <attr name="tint" />
-    <!-- When a tint color is set, specifies its Porter-Duff blending mode. The
-         default value is src_in, which treats the drawable as an alpha mask. -->
-    <attr name="tintMode" />
-    <!-- Indicates if the drawable needs to be mirrored when its layout direction is
-         RTL (right-to-left). -->
-    <attr name="autoMirrored" format="boolean" />
-    <!-- The intrinsic width of the Vector Drawable. -->
-    <attr name="width" />
-    <!-- The intrinsic height of the Vector Drawable. -->
-    <attr name="height" />
-    <!-- The width of the canvas the drawing is on. -->
-    <attr name="viewportWidth" format="float"/>
-    <!-- The height of the canvas the drawing is on. -->
-    <attr name="viewportHeight" format="float"/>
-    <!-- The name of this vector drawable -->
-    <attr name="name" />
-    <!-- The opacity of the whole vector drawable, as a value between 0
-         (completely transparent) and 1 (completely opaque). -->
-    <attr name="alpha" />
-  </declare-styleable>
-
-  <!-- Defines the group used in VectorDrawables. -->
-  <declare-styleable name="VectorDrawableGroup">
-    <!-- The name of this group -->
-    <attr name="name" />
-    <!-- The amount to rotate the group -->
-    <attr name="rotation" />
-    <!-- The X coordinate of the center of rotation of a group -->
-    <attr name="pivotX" />
-    <!-- The Y coordinate of the center of rotation of a group -->
-    <attr name="pivotY" />
-    <!-- The amount to translate the group on X coordinate -->
-    <attr name="translateX" format="float"/>
-    <!-- The amount to translate the group on Y coordinate -->
-    <attr name="translateY" format="float"/>
-    <!-- The amount to scale the group on X coordinate -->
-    <attr name="scaleX" />
-    <!-- The amount to scale the group on X coordinate -->
-    <attr name="scaleY" />
-  </declare-styleable>
-
-  <!-- Defines the path used in VectorDrawables. -->
-  <declare-styleable name="VectorDrawablePath">
-    <!-- The name of this path -->
-    <attr name="name" />
-    <!-- The width a path stroke -->
-    <attr name="strokeWidth" format="float" />
-    <!-- The color to stroke the path if not defined implies no stroke-->
-    <attr name="strokeColor" format="color" />
-    <!-- The opacity of a path stroke, as a value between 0 (completely transparent)
-         and 1 (completely opaque) -->
-    <attr name="strokeAlpha" format="float" />
-    <!-- The color to fill the path if not defined implies no fill-->
-    <attr name="fillColor" format="color" />
-    <!-- The alpha of the path fill, as a value between 0 (completely transparent)
-         and 1 (completely opaque)-->
-    <attr name="fillAlpha" format="float" />
-    <!-- The specification of the operations that define the path  -->
-    <attr name="pathData" format="string" />
-    <!-- The fraction of the path to trim from the start from 0 to 1 -->
-    <attr name="trimPathStart" format="float" />
-    <!-- The fraction of the path to trim from the end from 0 to 1  -->
-    <attr name="trimPathEnd" format="float" />
-    <!-- Shift trim region (allows visible region to include the start and end) from 0 to 1  -->
-    <attr name="trimPathOffset" format="float" />
-    <!-- The linecap for a stroked path -->
-    <attr name="strokeLineCap" format="enum">
-      <enum name="butt" value="0"/>
-      <enum name="round" value="1"/>
-      <enum name="square" value="2"/>
-    </attr>
-    <!-- The lineJoin for a stroked path -->
-    <attr name="strokeLineJoin" format="enum">
-      <enum name="miter" value="0"/>
-      <enum name="round" value="1"/>
-      <enum name="bevel" value="2"/>
-    </attr>
-    <!-- The Miter limit for a stroked path -->
-    <attr name="strokeMiterLimit" format="float"/>
-  </declare-styleable>
-
-  <!-- Defines the clip path used in VectorDrawables. -->
-  <declare-styleable name="VectorDrawableClipPath">
-    <!-- The Name of this path -->
-    <attr name="name" />
-    <!-- The specification of the operations that define the path  -->
-    <attr name="pathData"/>
-  </declare-styleable>
-
-  <!-- ========================== -->
-  <!--   AnimatedVectorDrawable class   -->
-  <!-- ========================== -->
-  <eat-comment />
-
-  <!-- Define the AnimatedVectorDrawable. -->
-  <declare-styleable name="AnimatedVectorDrawable">
-    <!-- The static vector drawable. -->
-    <attr name="drawable" format="reference" />
-  </declare-styleable>
-
-  <!-- Defines the target used in the AnimatedVectorDrawable. -->
-  <declare-styleable name="AnimatedVectorDrawableTarget">
-    <!-- The name of the target path, group or vector drawable -->
-    <attr name="name" />
-    <!-- The animation for the target path, group or vector drawable -->
-    <attr name="animation" />
-  </declare-styleable>
-</resources>
diff --git a/graphics/drawable/runavdtest.sh b/graphics/drawable/runavdtest.sh
deleted file mode 100755
index 023ad3e..0000000
--- a/graphics/drawable/runavdtest.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-. ../../../../build/envsetup.sh
-mmm -j20 . && mmm -j20 ./testanimated/ && \
-adb install -r $OUT/data/app/AndroidAnimatedVectorDrawableTests/AndroidAnimatedVectorDrawableTests.apk && \
-adb shell am start -n android.support.test.vectordrawable/android.support.test.vectordrawable.TestAVDActivity
-
diff --git a/graphics/drawable/runtest.sh b/graphics/drawable/runtest.sh
deleted file mode 100755
index 6f69780..0000000
--- a/graphics/drawable/runtest.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-. ../../../../build/envsetup.sh
-mmm -j20 . && mmm -j20 ./teststatic/ && \
-adb install -r $OUT/data/app/AndroidVectorDrawableTests/AndroidVectorDrawableTests.apk && \
-adb shell am start -n android.support.test.vectordrawable/android.support.test.vectordrawable.TestActivity
-
diff --git a/graphics/drawable/static/AndroidManifest.xml b/graphics/drawable/static/AndroidManifest.xml
new file mode 100644
index 0000000..c170289
--- /dev/null
+++ b/graphics/drawable/static/AndroidManifest.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.graphics.drawable">
+    <application/>
+</manifest>
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
new file mode 100644
index 0000000..235e5b7
--- /dev/null
+++ b/graphics/drawable/static/build.gradle
@@ -0,0 +1,121 @@
+apply plugin: 'android-library'
+
+archivesBaseName = 'support-vector-drawable'
+
+dependencies {
+    compile project(':support-v4')
+    testCompile 'junit:junit:4.12'
+}
+
+android {
+    compileSdkVersion 23
+    buildToolsVersion "19.1.0"
+
+    defaultConfig {
+        minSdkVersion 7
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDir 'src'
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/src'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    lintOptions {
+        abortOnError true
+    }
+
+    aaptOptions {
+        additionalParameters "--no-version-vectors"
+    }
+
+    packagingOptions {
+        exclude 'LICENSE.txt'
+    }
+
+    testOptions {
+        unitTests.returnDefaultValues = true
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar) {
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+// TODO make this generic for all projects
+afterEvaluate {
+    def originalTask = tasks['packageDebugAndroidTest']
+    tasks['assembleDebugAndroidTest'].doLast {
+        copy {
+            from(originalTask.outputFile)
+            into(rootProject.ext.testApkDistOut)
+        }
+    }
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support VectorDrawable'
+                description "Android Support VectorDrawable"
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2015'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/graphics/drawable/util/src/android/support/graphics/drawable/AndroidResources.java b/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
similarity index 100%
rename from graphics/drawable/util/src/android/support/graphics/drawable/AndroidResources.java
rename to graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java b/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
index 8503fae..2ee43c2 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
@@ -25,6 +25,7 @@
     private static final String LOGTAG = "PathParser";
 
     // Copy from Arrays.copyOfRange() which is only available from API level 9.
+
     /**
      * Copies elements from {@code original} into a new array, from indexes start (inclusive) to
      * end (exclusive). The original order of elements is preserved.
@@ -32,12 +33,12 @@
      * with the value {@code 0.0f}.
      *
      * @param original the original array
-     * @param start the start index, inclusive
-     * @param end the end index, exclusive
+     * @param start    the start index, inclusive
+     * @param end      the end index, exclusive
      * @return the new array
      * @throws ArrayIndexOutOfBoundsException if {@code start < 0 || start > original.length}
-     * @throws IllegalArgumentException if {@code start > end}
-     * @throws NullPointerException if {@code original == null}
+     * @throws IllegalArgumentException       if {@code start > end}
+     * @throws NullPointerException           if {@code original == null}
      */
     private static float[] copyOfRange(float[] original, int start, int end) {
         if (start > end) {
@@ -110,7 +111,7 @@
             return null;
         }
         PathDataNode[] copy = new PathParser.PathDataNode[source.length];
-        for (int i = 0; i < source.length; i ++) {
+        for (int i = 0; i < source.length; i++) {
             copy[i] = new PathDataNode(source[i]);
         }
         return copy;
@@ -118,7 +119,7 @@
 
     /**
      * @param nodesFrom The source path represented in an array of PathDataNode
-     * @param nodesTo The target path represented in an array of PathDataNode
+     * @param nodesTo   The target path represented in an array of PathDataNode
      * @return whether the <code>nodesFrom</code> can morph into <code>nodesTo</code>
      */
     public static boolean canMorph(PathDataNode[] nodesFrom, PathDataNode[] nodesTo) {
@@ -130,7 +131,7 @@
             return false;
         }
 
-        for (int i = 0; i < nodesFrom.length; i ++) {
+        for (int i = 0; i < nodesFrom.length; i++) {
             if (nodesFrom[i].type != nodesTo[i].type
                     || nodesFrom[i].params.length != nodesTo[i].params.length) {
                 return false;
@@ -147,9 +148,9 @@
      * @param source The source path represented in an array of PathDataNode
      */
     public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {
-        for (int i = 0; i < source.length; i ++) {
+        for (int i = 0; i < source.length; i++) {
             target[i].type = source[i].type;
-            for (int j = 0; j < source[i].params.length; j ++) {
+            for (int j = 0; j < source[i].params.length; j++) {
                 target[i].params[j] = source[i].params[j];
             }
         }
@@ -231,10 +232,11 @@
 
     /**
      * Calculate the position of the next comma or space or negative sign
-     * @param s the string to search
-     * @param start the position to start searching
+     *
+     * @param s      the string to search
+     * @param start  the position to start searching
      * @param result the result of the extraction, including the position of the
-     * the starting position of next number, whether it is ending with a '-'.
+     *               the starting position of next number, whether it is ending with a '-'.
      */
     private static void extract(String s, int start, ExtractFloatResult result) {
         // Now looking for ' ', ',', '.' or '-' from the start.
@@ -323,11 +325,11 @@
          * <code>fraction</code>.
          *
          * @param nodeFrom The start value as a PathDataNode.
-         * @param nodeTo The end value as a PathDataNode
+         * @param nodeTo   The end value as a PathDataNode
          * @param fraction The fraction to interpolate.
          */
         public void interpolatePathDataNode(PathDataNode nodeFrom,
-                PathDataNode nodeTo, float fraction) {
+                                            PathDataNode nodeTo, float fraction) {
             for (int i = 0; i < nodeFrom.params.length; i++) {
                 params[i] = nodeFrom.params[i] * (1 - fraction)
                         + nodeTo.params[i] * fraction;
@@ -335,7 +337,7 @@
         }
 
         private static void addCommand(Path path, float[] current,
-                char previousCmd, char cmd, float[] val) {
+                                       char previousCmd, char cmd, float[] val) {
 
             int incr = 2;
             float currentX = current[0];
@@ -393,18 +395,32 @@
             for (int k = 0; k < val.length; k += incr) {
                 switch (cmd) {
                     case 'm': // moveto - Start a new sub-path (relative)
-                        path.rMoveTo(val[k + 0], val[k + 1]);
                         currentX += val[k + 0];
                         currentY += val[k + 1];
-                        currentSegmentStartX = currentX;
-                        currentSegmentStartY = currentY;
+                        if (k > 0) {
+                            // According to the spec, if a moveto is followed by multiple
+                            // pairs of coordinates, the subsequent pairs are treated as
+                            // implicit lineto commands.
+                            path.rLineTo(val[k + 0], val[k + 1]);
+                        } else {
+                            path.rMoveTo(val[k + 0], val[k + 1]);
+                            currentSegmentStartX = currentX;
+                            currentSegmentStartY = currentY;
+                        }
                         break;
                     case 'M': // moveto - Start a new sub-path
-                        path.moveTo(val[k + 0], val[k + 1]);
                         currentX = val[k + 0];
                         currentY = val[k + 1];
-                        currentSegmentStartX = currentX;
-                        currentSegmentStartY = currentY;
+                        if (k > 0) {
+                            // According to the spec, if a moveto is followed by multiple
+                            // pairs of coordinates, the subsequent pairs are treated as
+                            // implicit lineto commands.
+                            path.lineTo(val[k + 0], val[k + 1]);
+                        } else {
+                            path.moveTo(val[k + 0], val[k + 1]);
+                            currentSegmentStartX = currentX;
+                            currentSegmentStartY = currentY;
+                        }
                         break;
                     case 'l': // lineto - Draw a line from the current point (relative)
                         path.rLineTo(val[k + 0], val[k + 1]);
@@ -571,15 +587,15 @@
         }
 
         private static void drawArc(Path p,
-                float x0,
-                float y0,
-                float x1,
-                float y1,
-                float a,
-                float b,
-                float theta,
-                boolean isMoreThanHalf,
-                boolean isPositiveArc) {
+                                    float x0,
+                                    float y0,
+                                    float x1,
+                                    float y1,
+                                    float a,
+                                    float b,
+                                    float theta,
+                                    boolean isMoreThanHalf,
+                                    boolean isPositiveArc) {
 
             /* Convert rotation angle from degrees to radians */
             double thetaD = Math.toRadians(theta);
@@ -650,32 +666,32 @@
         /**
          * Converts an arc to cubic Bezier segments and records them in p.
          *
-         * @param p The target for the cubic Bezier segments
-         * @param cx The x coordinate center of the ellipse
-         * @param cy The y coordinate center of the ellipse
-         * @param a The radius of the ellipse in the horizontal direction
-         * @param b The radius of the ellipse in the vertical direction
-         * @param e1x E(eta1) x coordinate of the starting point of the arc
-         * @param e1y E(eta2) y coordinate of the starting point of the arc
+         * @param p     The target for the cubic Bezier segments
+         * @param cx    The x coordinate center of the ellipse
+         * @param cy    The y coordinate center of the ellipse
+         * @param a     The radius of the ellipse in the horizontal direction
+         * @param b     The radius of the ellipse in the vertical direction
+         * @param e1x   E(eta1) x coordinate of the starting point of the arc
+         * @param e1y   E(eta2) y coordinate of the starting point of the arc
          * @param theta The angle that the ellipse bounding rectangle makes with horizontal plane
          * @param start The start angle of the arc on the ellipse
          * @param sweep The angle (positive or negative) of the sweep of the arc on the ellipse
          */
         private static void arcToBezier(Path p,
-                double cx,
-                double cy,
-                double a,
-                double b,
-                double e1x,
-                double e1y,
-                double theta,
-                double start,
-                double sweep) {
+                                        double cx,
+                                        double cy,
+                                        double a,
+                                        double b,
+                                        double e1x,
+                                        double e1y,
+                                        double theta,
+                                        double start,
+                                        double sweep) {
             // Taken from equations at: http://spaceroots.org/documents/ellipse/node8.html
             // and http://www.spaceroots.org/documents/ellipse/node22.html
 
             // Maximum of 45 degrees per cubic Bezier segment
-            int numSegments = Math.abs((int) Math.ceil(sweep * 4 / Math.PI));
+            int numSegments = (int) Math.ceil(Math.abs(sweep * 4 / Math.PI));
 
             double eta1 = start;
             double cosTheta = Math.cos(theta);
diff --git a/graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java b/graphics/drawable/static/src/android/support/graphics/drawable/TypedArrayUtils.java
similarity index 91%
rename from graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java
rename to graphics/drawable/static/src/android/support/graphics/drawable/TypedArrayUtils.java
index 161eae6..55ef7cd 100644
--- a/graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/TypedArrayUtils.java
@@ -36,7 +36,7 @@
     }
 
     public static boolean getNamedBoolean(TypedArray a, XmlPullParser parser, String attrName,
-                                      int resId, boolean defaultValue) {
+                                          int resId, boolean defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -46,7 +46,7 @@
     }
 
     public static int getNamedInt(TypedArray a, XmlPullParser parser, String attrName,
-                                          int resId, int defaultValue) {
+                                  int resId, int defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -56,7 +56,7 @@
     }
 
     public static int getNamedColor(TypedArray a, XmlPullParser parser, String attrName,
-                                        int resId, int defaultValue) {
+                                    int resId, int defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
new file mode 100644
index 0000000..216932a
--- /dev/null
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
@@ -0,0 +1,274 @@
+/*
+ * 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.graphics.drawable;
+
+import android.annotation.TargetApi;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.ColorFilter;
+import android.graphics.Outline;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * Internal common delegation shared by VectorDrawableCompat and AnimatedVectorDrawableCompat
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+abstract class VectorDrawableCommon extends Drawable {
+    /**
+     * Obtains styled attributes from the theme, if available, or unstyled
+     * resources if the theme is null.
+     */
+    static TypedArray obtainAttributes(
+            Resources res, Resources.Theme theme, AttributeSet set, int[] attrs) {
+        if (theme == null) {
+            return res.obtainAttributes(set, attrs);
+        }
+        return theme.obtainStyledAttributes(set, attrs, 0, 0);
+    }
+
+    // Drawable delegation for Lollipop and above.
+    Drawable mDelegateDrawable;
+
+    @Override
+    public void setColorFilter(int color, PorterDuff.Mode mode) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setColorFilter(color, mode);
+            return;
+        }
+        super.setColorFilter(color, mode);
+    }
+
+    @Override
+    public ColorFilter getColorFilter() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getColorFilter();
+        }
+        return super.getColorFilter();
+    }
+
+    @Override
+    protected boolean onLevelChange(int level) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setLevel(level);
+        }
+        return super.onLevelChange(level);
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setBounds(bounds);
+            return;
+        }
+        super.onBoundsChange(bounds);
+    }
+
+    @Override
+    public void setHotspot(float x, float y) {
+        // API >= 21 only.
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setHotspot(x, y);
+        }
+        return;
+    }
+
+    @Override
+    public void setHotspotBounds(int left, int top, int right, int bottom) {
+        // API >= 21 only.
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setHotspotBounds(left, top, right, bottom);
+            return;
+        }
+    }
+
+    @TargetApi(23)
+    @Override
+    public void getHotspotBounds(Rect outRect) {
+        // API >= 21 only.
+        if (mDelegateDrawable != null && Build.VERSION.SDK_INT >= 23) {
+            mDelegateDrawable.getHotspotBounds(outRect);
+            return;
+        }
+    }
+
+    @Override
+    public Rect getDirtyBounds() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getBounds();
+        }
+        return super.getDirtyBounds();
+    }
+
+    @Override
+    public void setFilterBitmap(boolean filter) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setFilterBitmap(filter);
+            return;
+        }
+    }
+
+    @TargetApi(23)
+    @Override
+    public boolean isFilterBitmap() {
+        // API >= 23 only
+        if (mDelegateDrawable != null && Build.VERSION.SDK_INT >= 23) {
+            return mDelegateDrawable.isFilterBitmap();
+        }
+        return false;
+    }
+
+    @Override
+    public void getOutline(Outline outline) {
+        // API >= 21 only
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.getOutline(outline);
+            return;
+        }
+    }
+
+    @Override
+    public void jumpToCurrentState() {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.jumpToCurrentState();
+            return;
+        }
+    }
+
+    @Override
+    public void setAutoMirrored(boolean mirrored) {
+        // API >= 21 only.
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setAutoMirrored(mirrored);
+            return;
+        }
+    }
+
+    @Override
+    public boolean isAutoMirrored() {
+        // API >= 21 only.
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.isAutoMirrored();
+        }
+        return false;
+    }
+
+    @Override
+    public void applyTheme(Resources.Theme t) {
+        // API >= 21 only.
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.applyTheme(t);
+            return;
+        }
+    }
+
+    @TargetApi(23)
+    @Override
+    public int getLayoutDirection() {
+        if (mDelegateDrawable != null && Build.VERSION.SDK_INT >= 23) {
+            return mDelegateDrawable.getLayoutDirection();
+        }
+        return View.LAYOUT_DIRECTION_LTR;
+    }
+
+    @TargetApi(23)
+    @Override
+    public boolean onLayoutDirectionChanged(int layoutDirection) {
+        if (mDelegateDrawable != null && Build.VERSION.SDK_INT >= 23) {
+            return mDelegateDrawable.onLayoutDirectionChanged(layoutDirection);
+        }
+        return false;
+    }
+
+    @Override
+    public void clearColorFilter() {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.clearColorFilter();
+            return;
+        }
+        super.clearColorFilter();
+    }
+
+    @Override
+    public Drawable getCurrent() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getCurrent();
+        }
+        return super.getCurrent();
+    }
+
+    @Override
+    public int getMinimumWidth() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getMinimumWidth();
+        }
+        return super.getMinimumWidth();
+    }
+
+    @Override
+    public int getMinimumHeight() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getMinimumHeight();
+        }
+        return super.getMinimumHeight();
+    }
+
+    @Override
+    public boolean getPadding(Rect padding) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getPadding(padding);
+        }
+        return super.getPadding(padding);
+    }
+
+    @Override
+    public int[] getState() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getState();
+        }
+        return super.getState();
+    }
+
+
+    @Override
+    public Region getTransparentRegion() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getTransparentRegion();
+        }
+        return super.getTransparentRegion();
+    }
+
+    @Override
+    public void setChangingConfigurations(int configs) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setChangingConfigurations(configs);
+            return;
+        }
+        super.setChangingConfigurations(configs);
+    }
+
+    @Override
+    public boolean setState(int[] stateSet) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setState(stateSet);
+        }
+        return super.setState(stateSet);
+    }
+}
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
index c0e5b40..80f8805 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -14,6 +14,7 @@
 
 package android.support.graphics.drawable;
 
+import android.annotation.TargetApi;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.Resources.Theme;
@@ -33,9 +34,11 @@
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+import android.os.Build;
+import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.DrawableRes;
 import android.support.v4.util.ArrayMap;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -178,7 +181,8 @@
  * &lt;/vector&gt;
  * </pre></li>
  */
-public class VectorDrawableCompat extends Drawable {
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class VectorDrawableCompat extends VectorDrawableCommon {
     static final String LOGTAG = "VectorDrawableCompat";
 
     static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
@@ -198,7 +202,7 @@
 
     private static final boolean DBG_VECTOR_DRAWABLE = false;
 
-    private VectorDrawableState mVectorState;
+    private VectorDrawableCompatState mVectorState;
 
     private PorterDuffColorFilter mTintFilter;
     private ColorFilter mColorFilter;
@@ -209,19 +213,27 @@
     // caching the bitmap by default is allowed.
     private boolean mAllowCaching = true;
 
+    // The Constant state associated with the <code>mDelegateDrawable</code>.
+    private ConstantState mCachedConstantStateDelegate;
+
     private VectorDrawableCompat() {
-        mVectorState = new VectorDrawableState();
+        mVectorState = new VectorDrawableCompatState();
     }
 
-    private VectorDrawableCompat(VectorDrawableState state) {
+    private VectorDrawableCompat(@NonNull VectorDrawableCompatState state) {
         mVectorState = state;
         mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
     }
 
     @Override
     public Drawable mutate() {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.mutate();
+            return this;
+        }
+
         if (!mMutated && super.mutate() == this) {
-            mVectorState = new VectorDrawableState(mVectorState);
+            mVectorState = new VectorDrawableCompatState(mVectorState);
             mMutated = true;
         }
         return this;
@@ -233,12 +245,21 @@
 
     @Override
     public ConstantState getConstantState() {
+        if (mDelegateDrawable != null) {
+            // Such that the configuration can be refreshed.
+            return new VectorDrawableDelegateState(mDelegateDrawable.getConstantState());
+        }
         mVectorState.mChangingConfigurations = getChangingConfigurations();
         return mVectorState;
     }
 
     @Override
     public void draw(Canvas canvas) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.draw(canvas);
+            return;
+        }
+
         final Rect bounds = getBounds();
         if (bounds.width() == 0 || bounds.height() == 0) {
             // too small to draw
@@ -281,11 +302,20 @@
     }
 
     public int getAlpha() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getAlpha();
+        }
+
         return mVectorState.mVPathRenderer.getRootAlpha();
     }
 
     @Override
     public void setAlpha(int alpha) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setAlpha(alpha);
+            return;
+        }
+
         if (mVectorState.mVPathRenderer.getRootAlpha() != alpha) {
             mVectorState.mVPathRenderer.setRootAlpha(alpha);
             invalidateSelf();
@@ -294,6 +324,11 @@
 
     @Override
     public void setColorFilter(ColorFilter colorFilter) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setColorFilter(colorFilter);
+            return;
+        }
+
         mColorFilter = colorFilter;
         invalidateSelf();
     }
@@ -303,7 +338,7 @@
      * mode.
      */
     PorterDuffColorFilter updateTintFilter(PorterDuffColorFilter tintFilter, ColorStateList tint,
-            PorterDuff.Mode tintMode) {
+                                           PorterDuff.Mode tintMode) {
         if (tint == null || tintMode == null) {
             return null;
         }
@@ -314,11 +349,21 @@
     }
 
     public void setTint(int tint) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setTint(tint);
+            return;
+        }
+
         setTintList(ColorStateList.valueOf(tint));
     }
 
     public void setTintList(ColorStateList tint) {
-        final VectorDrawableState state = mVectorState;
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setTintList(tint);
+            return;
+        }
+
+        final VectorDrawableCompatState state = mVectorState;
         if (state.mTint != tint) {
             state.mTint = tint;
             mTintFilter = updateTintFilter(mTintFilter, tint, state.mTintMode);
@@ -327,7 +372,12 @@
     }
 
     public void setTintMode(Mode tintMode) {
-        final VectorDrawableState state = mVectorState;
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setTintMode(tintMode);
+            return;
+        }
+
+        final VectorDrawableCompatState state = mVectorState;
         if (state.mTintMode != tintMode) {
             state.mTintMode = tintMode;
             mTintFilter = updateTintFilter(mTintFilter, state.mTint, tintMode);
@@ -337,15 +387,23 @@
 
     @Override
     public boolean isStateful() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.isStateful();
+        }
+
         return super.isStateful() || (mVectorState != null && mVectorState.mTint != null
                 && mVectorState.mTint.isStateful());
     }
 
     @Override
     protected boolean onStateChange(int[] stateSet) {
-        final VectorDrawableState state = mVectorState;
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setState(stateSet);
+        }
+
+        final VectorDrawableCompatState state = mVectorState;
         if (state.mTint != null && state.mTintMode != null) {
-            // mTintFilter = updateTintFilter(this, mTintFilter, state.mTint, state.mTintMode);
+            mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
             invalidateSelf();
             return true;
         }
@@ -354,21 +412,37 @@
 
     @Override
     public int getOpacity() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getOpacity();
+        }
+
         return PixelFormat.TRANSLUCENT;
     }
 
     @Override
     public int getIntrinsicWidth() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getIntrinsicWidth();
+        }
+
         return (int) mVectorState.mVPathRenderer.mBaseWidth;
     }
 
     @Override
     public int getIntrinsicHeight() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getIntrinsicHeight();
+        }
+
         return (int) mVectorState.mVPathRenderer.mBaseHeight;
     }
 
     // Don't support re-applying themes. The initial theme loading is working.
     public boolean canApplyTheme() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.canApplyTheme();
+        }
+
         return false;
     }
 
@@ -398,14 +472,22 @@
     /**
      * Create a VectorDrawableCompat object.
      *
-     * @param res the resources.
+     * @param res   the resources.
      * @param resId the resource ID for VectorDrawableCompat object.
      * @param theme the theme of this vector drawable, it can be null.
      * @return a new VectorDrawableCompat or null if parsing error is found.
      */
     @Nullable
     public static VectorDrawableCompat create(@NonNull Resources res, @DrawableRes int resId,
-            @Nullable Theme theme) {
+                                              @Nullable Theme theme) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            final VectorDrawableCompat drawable = new VectorDrawableCompat();
+            drawable.mDelegateDrawable = (VectorDrawable) res.getDrawable(resId, theme);
+            drawable.mCachedConstantStateDelegate = new VectorDrawableDelegateState(
+                    drawable.mDelegateDrawable.getConstantState());
+            return drawable;
+        }
+
         try {
             final XmlPullParser parser = res.getXml(resId);
             final AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -436,32 +518,30 @@
         return color;
     }
 
-    /**
-     * Obtains styled attributes from the theme, if available, or unstyled
-     * resources if the theme is null.
-     */
-    static TypedArray obtainAttributes(
-            Resources res, Theme theme, AttributeSet set, int[] attrs) {
-        if (theme == null) {
-            return res.obtainAttributes(set, attrs);
-        }
-        return theme.obtainStyledAttributes(set, attrs, 0, 0);
-    }
-
-
     @Override
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs)
             throws XmlPullParserException, IOException {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.inflate(res, parser, attrs);
+            return;
+        }
+
         inflate(res, parser, attrs, null);
     }
 
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
             throws XmlPullParserException, IOException {
-        final VectorDrawableState state = mVectorState;
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.inflate(res, parser, attrs, theme);
+            return;
+        }
+
+        final VectorDrawableCompatState state = mVectorState;
         final VPathRenderer pathRenderer = new VPathRenderer();
         state.mVPathRenderer = pathRenderer;
 
-        final TypedArray a = obtainAttributes(res, theme, attrs, AndroidResources.styleable_VectorDrawableTypeArray);
+        final TypedArray a = obtainAttributes(res, theme, attrs,
+                AndroidResources.styleable_VectorDrawableTypeArray);
 
         updateStateFromTypedArray(a, parser);
         a.recycle();
@@ -477,20 +557,29 @@
      * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode
      * attribute's enum value.
      */
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     private static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) {
         switch (value) {
-            case 3: return Mode.SRC_OVER;
-            case 5: return Mode.SRC_IN;
-            case 9: return Mode.SRC_ATOP;
-            case 14: return Mode.MULTIPLY;
-            case 15: return Mode.SCREEN;
-            case 16: return Mode.ADD;
-            default: return defaultMode;
+            case 3:
+                return Mode.SRC_OVER;
+            case 5:
+                return Mode.SRC_IN;
+            case 9:
+                return Mode.SRC_ATOP;
+            case 14:
+                return Mode.MULTIPLY;
+            case 15:
+                return Mode.SCREEN;
+            case 16:
+                return Mode.ADD;
+            default:
+                return defaultMode;
         }
     }
 
-    private void updateStateFromTypedArray(TypedArray a, XmlPullParser parser) throws XmlPullParserException {
-        final VectorDrawableState state = mVectorState;
+    private void updateStateFromTypedArray(TypedArray a, XmlPullParser parser)
+            throws XmlPullParserException {
+        final VectorDrawableCompatState state = mVectorState;
         final VPathRenderer pathRenderer = state.mVPathRenderer;
 
         // Account for any configuration changes.
@@ -500,19 +589,22 @@
                 AndroidResources.styleable_VectorDrawable_Mode, -1);
         state.mTintMode = parseTintMode(mode, Mode.SRC_IN);
 
-        final ColorStateList tint = a.getColorStateList(AndroidResources.styleable_VectorDrawable_tint);
+        final ColorStateList tint =
+                a.getColorStateList(AndroidResources.styleable_VectorDrawable_tint);
         if (tint != null) {
             state.mTint = tint;
         }
 
         state.mAutoMirrored = TypedArrayUtils.getNamedBoolean(a, parser, "autoMirrored",
-                    AndroidResources.styleable_VectorDrawable_autoMirrored, state.mAutoMirrored);
+                AndroidResources.styleable_VectorDrawable_autoMirrored, state.mAutoMirrored);
 
         pathRenderer.mViewportWidth = TypedArrayUtils.getNamedFloat(a, parser, "viewportWidth",
-                AndroidResources.styleable_VectorDrawable_viewportWidth, pathRenderer.mViewportWidth);
+                AndroidResources.styleable_VectorDrawable_viewportWidth,
+                pathRenderer.mViewportWidth);
 
         pathRenderer.mViewportHeight = TypedArrayUtils.getNamedFloat(a, parser, "viewportHeight",
-                AndroidResources.styleable_VectorDrawable_viewportHeight, pathRenderer.mViewportHeight);
+                AndroidResources.styleable_VectorDrawable_viewportHeight,
+                pathRenderer.mViewportHeight);
 
         if (pathRenderer.mViewportWidth <= 0) {
             throw new XmlPullParserException(a.getPositionDescription() +
@@ -536,7 +628,7 @@
 
         // shown up from API 11.
         final float alphaInFloat = TypedArrayUtils.getNamedFloat(a, parser, "alpha",
-                    AndroidResources.styleable_VectorDrawable_alpha, pathRenderer.getAlpha());
+                AndroidResources.styleable_VectorDrawable_alpha, pathRenderer.getAlpha());
         pathRenderer.setAlpha(alphaInFloat);
 
         final String name = a.getString(AndroidResources.styleable_VectorDrawable_name);
@@ -547,8 +639,8 @@
     }
 
     private void inflateInternal(Resources res, XmlPullParser parser, AttributeSet attrs,
-            Theme theme) throws XmlPullParserException, IOException {
-        final VectorDrawableState state = mVectorState;
+                                 Theme theme) throws XmlPullParserException, IOException {
+        final VectorDrawableCompatState state = mVectorState;
         final VPathRenderer pathRenderer = state.mVPathRenderer;
         boolean noPathTag = true;
 
@@ -645,7 +737,114 @@
         return false;
     }
 
-    private static class VectorDrawableState extends ConstantState {
+    // Extra override functions for delegation for SDK >= 7.
+    @Override
+    public void setBounds(int left, int top, int right, int bottom) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setBounds(left, top, right, bottom);
+            return;
+        }
+        super.setBounds(left, top, right, bottom);
+    }
+
+    @Override
+    public void setBounds(Rect rect) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.setBounds(rect);
+            return;
+        }
+        super.setBounds(rect);
+    }
+
+    @Override
+    public int getChangingConfigurations() {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.getChangingConfigurations();
+        }
+        return super.getChangingConfigurations() | mVectorState.getChangingConfigurations();
+    }
+
+    @Override
+    public void invalidateSelf() {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.invalidateSelf();
+            return;
+        }
+        super.invalidateSelf();
+    }
+
+    @Override
+    public void scheduleSelf(Runnable what, long when) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.scheduleSelf(what, when);
+            return;
+        }
+        super.scheduleSelf(what, when);
+    }
+
+    @Override
+    public boolean setVisible(boolean visible, boolean restart) {
+        if (mDelegateDrawable != null) {
+            return mDelegateDrawable.setVisible(visible, restart);
+        }
+        return super.setVisible(visible, restart);
+    }
+
+    @Override
+    public void unscheduleSelf(Runnable what) {
+        if (mDelegateDrawable != null) {
+            mDelegateDrawable.unscheduleSelf(what);
+            return;
+        }
+        super.unscheduleSelf(what);
+    }
+
+    /**
+     * Constant state for delegating the creating drawable job for SDK >= 21.
+     * Instead of creating a VectorDrawable, create a VectorDrawableCompat instance which contains
+     * a delegated VectorDrawable instance.
+     */
+    private static class VectorDrawableDelegateState extends ConstantState {
+        private final ConstantState mDelegateState;
+
+        public VectorDrawableDelegateState(ConstantState state) {
+            mDelegateState = state;
+        }
+
+        @Override
+        public Drawable newDrawable() {
+            VectorDrawableCompat drawableCompat = new VectorDrawableCompat();
+            drawableCompat.mDelegateDrawable = (VectorDrawable) mDelegateState.newDrawable();
+            return drawableCompat;
+        }
+
+        @Override
+        public Drawable newDrawable(Resources res) {
+            VectorDrawableCompat drawableCompat = new VectorDrawableCompat();
+            drawableCompat.mDelegateDrawable = (VectorDrawable) mDelegateState.newDrawable(res);
+            return drawableCompat;
+        }
+
+        @Override
+        public Drawable newDrawable(Resources res, Theme theme) {
+            VectorDrawableCompat drawableCompat = new VectorDrawableCompat();
+            drawableCompat.mDelegateDrawable =
+                    (VectorDrawable) mDelegateState.newDrawable(res, theme);
+            return drawableCompat;
+        }
+
+        @Override
+        public boolean canApplyTheme() {
+            return mDelegateState.canApplyTheme();
+        }
+
+        @Override
+        public int getChangingConfigurations() {
+            return mDelegateState.getChangingConfigurations();
+        }
+    }
+
+    private static class VectorDrawableCompatState extends ConstantState {
         int mChangingConfigurations;
         VPathRenderer mVPathRenderer;
         ColorStateList mTint = null;
@@ -660,11 +859,13 @@
         boolean mCachedAutoMirrored;
         boolean mCacheDirty;
 
-        /** Temporary paint object used to draw cached bitmaps. */
+        /**
+         * Temporary paint object used to draw cached bitmaps.
+         */
         Paint mTempPaint;
 
         // Deep copy for mutate() or implicitly mutate.
-        public VectorDrawableState(VectorDrawableState copy) {
+        public VectorDrawableCompatState(VectorDrawableCompatState copy) {
             if (copy != null) {
                 mChangingConfigurations = copy.mChangingConfigurations;
                 mVPathRenderer = new VPathRenderer(copy.mVPathRenderer);
@@ -752,7 +953,7 @@
             mCacheDirty = false;
         }
 
-        public VectorDrawableState() {
+        public VectorDrawableCompatState() {
             mVPathRenderer = new VPathRenderer();
         }
 
@@ -851,7 +1052,7 @@
         }
 
         private void drawGroupTree(VGroup currentGroup, Matrix currentMatrix,
-                Canvas canvas, int w, int h, ColorFilter filter) {
+                                   Canvas canvas, int w, int h, ColorFilter filter) {
             // Calculate current group's matrix by preConcat the parent's and
             // and the current one on the top of the stack.
             // Basically the Mfinal = Mviewport * M0 * M1 * M2;
@@ -880,14 +1081,21 @@
         }
 
         private void drawPath(VGroup vGroup, VPath vPath, Canvas canvas, int w, int h,
-                ColorFilter filter) {
+                              ColorFilter filter) {
             final float scaleX = w / mViewportWidth;
             final float scaleY = h / mViewportHeight;
             final float minScale = Math.min(scaleX, scaleY);
+            final Matrix groupStackedMatrix = vGroup.mStackedMatrix;
 
-            mFinalPathMatrix.set(vGroup.mStackedMatrix);
+            mFinalPathMatrix.set(groupStackedMatrix);
             mFinalPathMatrix.postScale(scaleX, scaleY);
 
+
+            final float matrixScale = getMatrixScale(groupStackedMatrix);
+            if (matrixScale == 0) {
+                // When either x or y is scaled to 0, we don't need to draw anything.
+                return;
+            }
             vPath.toPath(mPath);
             final Path path = mPath;
 
@@ -953,11 +1161,45 @@
                     strokePaint.setStrokeMiter(fullPath.mStrokeMiterlimit);
                     strokePaint.setColor(applyAlpha(fullPath.mStrokeColor, fullPath.mStrokeAlpha));
                     strokePaint.setColorFilter(filter);
-                    strokePaint.setStrokeWidth(fullPath.mStrokeWidth * minScale);
+                    final float finalStrokeScale = minScale * matrixScale;
+                    strokePaint.setStrokeWidth(fullPath.mStrokeWidth * finalStrokeScale);
                     canvas.drawPath(mRenderPath, strokePaint);
                 }
             }
         }
+
+        private static float cross(float v1x, float v1y, float v2x, float v2y) {
+            return v1x * v2y - v1y * v2x;
+        }
+
+        private float getMatrixScale(Matrix groupStackedMatrix) {
+            // Given unit vectors A = (0, 1) and B = (1, 0).
+            // After matrix mapping, we got A' and B'. Let theta = the angel b/t A' and B'.
+            // Therefore, the final scale we want is min(|A'| * sin(theta), |B'| * sin(theta)),
+            // which is (|A'| * |B'| * sin(theta)) / max (|A'|, |B'|);
+            // If  max (|A'|, |B'|) = 0, that means either x or y has a scale of 0.
+            //
+            // For non-skew case, which is most of the cases, matrix scale is computing exactly the
+            // scale on x and y axis, and take the minimal of these two.
+            // For skew case, an unit square will mapped to a parallelogram. And this function will
+            // return the minimal height of the 2 bases.
+            float[] unitVectors = new float[]{0, 1, 1, 0};
+            groupStackedMatrix.mapVectors(unitVectors);
+            float scaleX = (float) Math.hypot(unitVectors[0], unitVectors[1]);
+            float scaleY = (float) Math.hypot(unitVectors[2], unitVectors[3]);
+            float crossProduct = cross(unitVectors[0], unitVectors[1], unitVectors[2],
+                    unitVectors[3]);
+            float maxScale = Math.max(scaleX, scaleY);
+
+            float matrixScale = 0;
+            if (maxScale > 0) {
+                matrixScale = Math.abs(crossProduct) / maxScale;
+            }
+            if (DBG_VECTOR_DRAWABLE) {
+                Log.d(LOGTAG, "Scale x " + scaleX + " y " + scaleY + " final " + matrixScale);
+            }
+            return matrixScale;
+        }
     }
 
     private static class VGroup {
@@ -1069,7 +1311,8 @@
             mTranslateY = TypedArrayUtils.getNamedFloat(a, parser, "translateY",
                     AndroidResources.styleable_VectorDrawableGroup_translateY, mTranslateY);
 
-            final String groupName = a.getString(AndroidResources.styleable_VectorDrawableGroup_name);
+            final String groupName =
+                    a.getString(AndroidResources.styleable_VectorDrawableGroup_name);
             if (groupName != null) {
                 mGroupName = groupName;
             }
@@ -1287,12 +1530,14 @@
             // Account for any configuration changes.
             // mChangingConfigurations |= Utils.getChangingConfigurations(a);;
 
-            final String pathName = a.getString(AndroidResources.styleable_VectorDrawableClipPath_name);
+            final String pathName =
+                    a.getString(AndroidResources.styleable_VectorDrawableClipPath_name);
             if (pathName != null) {
                 mPathName = pathName;
             }
 
-            final String pathData = a.getString(AndroidResources.styleable_VectorDrawableClipPath_pathData);
+            final String pathData =
+                    a.getString(AndroidResources.styleable_VectorDrawableClipPath_pathData);
             if (pathData != null) {
                 mNodes = PathParser.createNodesFromPathData(pathData);
             }
@@ -1395,14 +1640,15 @@
             // Extract the theme attributes, if any.
             mThemeAttrs = null; // TODO TINT THEME Not supported yet a.extractThemeAttrs();
 
-            // In order to work around the conflicting id issue, we need to double check the existence
-            // of the attribute.
-            // B/c if the attribute existed in the compiled XML, then calling TypedArray will be safe
-            // since the framework will look up in the XML first.
-            // Note that each getAttributeValue take roughly 0.03ms, it is a price we have to pay here.
+            // In order to work around the conflicting id issue, we need to double check the
+            // existence of the attribute.
+            // B/c if the attribute existed in the compiled XML, then calling TypedArray will be
+            // safe since the framework will look up in the XML first.
+            // Note that each getAttributeValue take roughly 0.03ms, it is a price we have to pay.
             final boolean hasPathData = TypedArrayUtils.hasAttribute(parser, "pathData");
             if (!hasPathData) {
-                //If there is no pathData in the <path> tag, then this is an empty path, nothing need to be drawn.
+                // If there is no pathData in the <path> tag, then this is an empty path,
+                // nothing need to be drawn.
                 return;
             }
 
@@ -1410,14 +1656,15 @@
             if (pathName != null) {
                 mPathName = pathName;
             }
-            final String pathData = a.getString(AndroidResources.styleable_VectorDrawablePath_pathData);
+            final String pathData =
+                    a.getString(AndroidResources.styleable_VectorDrawablePath_pathData);
             if (pathData != null) {
                 mNodes = PathParser.createNodesFromPathData(pathData);
             }
 
             mFillColor = TypedArrayUtils.getNamedColor(a, parser, "fillColor",
                     AndroidResources.styleable_VectorDrawablePath_fillColor, mFillColor);
-            mFillAlpha = TypedArrayUtils.getNamedFloat(a, parser, "alpha",
+            mFillAlpha = TypedArrayUtils.getNamedFloat(a, parser, "fillAlpha",
                     AndroidResources.styleable_VectorDrawablePath_fillAlpha, mFillAlpha);
             final int lineCap = TypedArrayUtils.getNamedInt(a, parser, "strokeLineCap",
                     AndroidResources.styleable_VectorDrawablePath_strokeLineCap, -1);
@@ -1426,7 +1673,8 @@
                     AndroidResources.styleable_VectorDrawablePath_strokeLineJoin, -1);
             mStrokeLineJoin = getStrokeLineJoin(lineJoin, mStrokeLineJoin);
             mStrokeMiterlimit = TypedArrayUtils.getNamedFloat(a, parser, "strokeMiterLimit",
-                    AndroidResources.styleable_VectorDrawablePath_strokeMiterLimit, mStrokeMiterlimit);
+                    AndroidResources.styleable_VectorDrawablePath_strokeMiterLimit,
+                    mStrokeMiterlimit);
             mStrokeColor = TypedArrayUtils.getNamedColor(a, parser, "strokeColor",
                     AndroidResources.styleable_VectorDrawablePath_strokeColor, mStrokeColor);
             mStrokeAlpha = TypedArrayUtils.getNamedFloat(a, parser, "strokeAlpha",
diff --git a/graphics/drawable/static/tests/AndroidManifest.xml b/graphics/drawable/static/tests/AndroidManifest.xml
new file mode 100644
index 0000000..97e74c6
--- /dev/null
+++ b/graphics/drawable/static/tests/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.graphics.drawable.tests">
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <application/>
+</manifest>
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml b/graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml
new file mode 100644
index 0000000..7c12997
--- /dev/null
+++ b/graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#00ff00" android:state_pressed="true"/>
+    <item android:color="#0000ff"/>
+</selector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml b/graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml
new file mode 100644
index 0000000..e1ea931
--- /dev/null
+++ b/graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#0000ff" android:state_pressed="true"/>
+    <item android:color="#00ff00"/>
+</selector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_arcto_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_arcto_golden.png
new file mode 100644
index 0000000..f16e603
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_arcto_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
new file mode 100644
index 0000000..71a02d1
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png
new file mode 100644
index 0000000..4763166
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png
new file mode 100644
index 0000000..9255247
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png
new file mode 100644
index 0000000..aef4ed6
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_implicit_lineto_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_implicit_lineto_golden.png
new file mode 100644
index 0000000..94ac7f0
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_implicit_lineto_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png
new file mode 100644
index 0000000..e7f4f03
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png
new file mode 100644
index 0000000..89ed107
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png
new file mode 100644
index 0000000..29c6be4
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png
new file mode 100644
index 0000000..fa7f743
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
new file mode 100644
index 0000000..3b0c4cc
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
new file mode 100644
index 0000000..ed3ba89
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
new file mode 100644
index 0000000..84881da
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png
new file mode 100644
index 0000000..74c0fc5
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png
new file mode 100644
index 0000000..9704178
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png
new file mode 100644
index 0000000..d3e5125
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png
new file mode 100644
index 0000000..c3edca9
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png
new file mode 100644
index 0000000..e1c2b83
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png
new file mode 100644
index 0000000..6cad0ea
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png
new file mode 100644
index 0000000..3e3dac2
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png
new file mode 100644
index 0000000..3ba60ad
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png
new file mode 100644
index 0000000..05da94d
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png
new file mode 100644
index 0000000..a4a7e66
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png
new file mode 100644
index 0000000..365c7b6
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png
new file mode 100644
index 0000000..9b8f6ab
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png
new file mode 100644
index 0000000..d864469
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png
new file mode 100644
index 0000000..16be452
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png
Binary files differ
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_arcto.xml
similarity index 69%
rename from graphics/drawable/teststatic/res/drawable/vector_drawable29.xml
rename to graphics/drawable/static/tests/res/drawable/vector_icon_arcto.xml
index b24d31c..a4904f2 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_arcto.xml
@@ -14,15 +14,11 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="48dp"
-        android:width="48dp"
-        android:viewportHeight="1"
-        android:viewportWidth="1" >
-
-    <group>
-        <path
-            android:name="box1"
-            android:pathData="l0.0.0.5.0.0.5-0.5.0.0-.5z"
-            android:fillColor="#ff00ff00"/>
-    </group>
-</vector>
+        android:width="20dp"
+        android:height="50dp"
+        android:viewportWidth="20.0"
+        android:viewportHeight="50.0">
+    <path
+            android:pathData="M14.285706,47.362198A50.71429,62.14286 0,0 0,1.0630035 5.5146027"
+            android:fillColor="#ff55ff"/>
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml
new file mode 100644
index 0000000..b9905c1
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml
@@ -0,0 +1,79 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:viewportHeight="12.25"
+        android:viewportWidth="7.30625"
+        android:width="64dp">
+
+    <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="-30">
+        <clip-path
+                android:name="clip1"
+                android:pathData="
+                M 0, 6.125
+                l 7.3, 0
+                l 0, 12.25
+                l -7.3, 0
+                z"/>
+
+        <group
+                android:pivotX="3.65"
+                android:pivotY="6.125"
+                android:rotation="30">
+            <path
+                    android:name="one"
+                    android:fillColor="#ff88ff"
+                    android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
+                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+                l -5.046875,0.0 0.0-1.0Z"/>
+        </group>
+    </group>
+    <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="-30">
+        <clip-path
+                android:name="clip2"
+                android:pathData="
+                M 0, 0
+                l 7.3, 0
+                l 0, 6.125
+                l -7.3, 0
+                z"/>
+
+        <group
+                android:pivotX="3.65"
+                android:pivotY="6.125"
+                android:rotation="30">
+            <path
+                    android:name="two"
+                    android:fillColor="#ff88ff"
+                    android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
+                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125 -0.5-1.140625
+                        q -0.484375-0.4375 -1.2656252-0.4375 -0.5625,0.0 -1.1875,0.1875
+                        q -0.609375,0.1875 -1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
+                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
+                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125 -0.203125,1.015625
+                        q -0.203125,0.484375 -0.734375,1.140625 -0.15625,0.171875 -0.9375,0.984375
+                        q -0.78125024,0.8125 -2.2187502,2.265625Z"/>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_create.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_create.xml
new file mode 100644
index 0000000..2aaf7bb
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_create.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="#FF000000"
+            android:pathData="M3.0,17.25L3.0,21.0l3.75,0.0L17.813995,9.936001l-3.75-3.75L3.0,17.25zM20.707,7.0429993c0.391-0.391 0.391-1.023 0.0-1.414l-2.336-2.336c-0.391-0.391-1.023-0.391 -1.414,0.0l-1.832,1.832l3.75,3.75L20.707,7.0429993z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml
new file mode 100644
index 0000000..ae32092
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="#FF000000"
+            android:pathData="M6.0,19.0c0.0,1.104 896e-3,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-896e-3 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml
new file mode 100644
index 0000000..bf6aca3
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="#FF000000"
+            android:pathData="M16.0,5.0c-1.955.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_implicit_lineto.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_implicit_lineto.xml
new file mode 100644
index 0000000..41b3e1c
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_implicit_lineto.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="64"
+        android:viewportWidth="64">
+
+    <path
+            android:fillColor="#FF000000"
+            android:pathData="m0,0 32,0 0,32 -32,0 0,-32z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml
new file mode 100644
index 0000000..6b268a1
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="
+                 m 0.0 0.0
+                 c 58.357853 57.648304 47.260395 2.2044754 3.0 3.0
+                 s 61.29288 10.748665 6.0 6.0
+                 s 0.12015152 45.193787 9.0 9.0
+                 s 32.573513 46.862522 12.0 12.0
+                 C 52.051823 62.050003 14.197739 51.99994 15.0 15.0
+                 S 58.365482 51.877937 18.0 18.0
+                 S 26.692455 3.9604378 21.0 21.0
+                 S 21.433464 52.17514 24.0 24.0
+                 M 27.0 27.0
+                 s 0.77630234 20.606667 30.0 30.0
+                 M 33.0 33.0
+                 S 31.06879 21.506374 36.0 36.0
+                 m 39.0 39.0
+                 s 11.699013 23.684185 42.0 42.0
+                 m 45.0 45.0
+                 S 3.7642136 38.589584 48.0 48.0
+                 Q 27.203026 53.329338 51.0 51.0
+                 s 39.229023 15.1781845 54.0 54.0
+                 Q 47.946877 23.706299 57.0 57.0
+                 S 45.63452 56.15198 60.0 60.0 "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml
new file mode 100644
index 0000000..ae76308
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="
+                 m 0.0 0.0
+                 q 4.7088394 36.956432 3.0 3.0
+                 s 29.470345 16.754963 6.0 6.0
+                 q 20.278355 7.4670525 9.0 9.0
+                 S 30.897224 17.732414 12.0 12.0
+                 T 15.0 15.0
+                 s 63.47204 45.67142 18.0 18.0
+                 T 21.0 21.0
+                 S 0.3184204 24.808247 24.0 24.0
+                 t 27.0 27.0
+                 s 39.02275 38.261158 30.0 30.0
+                 t 33.0 33.0
+                 S 50.709816 16.067192 36.0 36.0
+                 a 62.50911 7.7131805 51.932335 0 0 39.0 39.0
+                 s 5.155651 15.749123 42.0 42.0
+                 a 51.87415 40.30564 49.804344 0 0 45.0 45.0
+                 S 16.16534 62.55986 48.0 48.0
+                 A 39.90161 43.904438 41.642593 1 0 51.0 51.0
+                 s 46.258068 32.12831 54.0 54.0
+                 A 22.962704 55.05604 42.912285 1 1 57.0 57.0
+                 S 36.47731 54.216763 60.0 60.0 "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml
new file mode 100644
index 0000000..7958c62
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml
@@ -0,0 +1,89 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400">
+
+    <group
+            android:name="FirstLevelGroup"
+            android:translateX="100.0"
+            android:translateY="0.0">
+        <path
+                android:fillColor="#FFFF0000"
+                android:fillAlpha="0.9"
+                android:pathData="@string/rectangle200"/>
+
+        <group
+                android:name="SecondLevelGroup1"
+                android:translateX="-100.0"
+                android:translateY="50.0">
+            <path
+                    android:fillColor="#FF00FF00"
+                    android:fillAlpha="0.81"
+                    android:pathData="@string/rectangle200"/>
+
+            <group
+                    android:name="ThridLevelGroup1"
+                    android:translateX="-100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillColor="#FF0000FF"
+                        android:fillAlpha="0.729"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+            <group
+                    android:name="ThridLevelGroup2"
+                    android:translateX="100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.72"
+                        android:fillColor="#FF000000"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+        </group>
+        <group
+                android:name="SecondLevelGroup2"
+                android:translateX="100.0"
+                android:translateY="50.0">
+            <path
+                    android:fillColor="#FF0000FF"
+                    android:fillAlpha="0.72"
+                    android:pathData="@string/rectangle200"/>
+
+            <group
+                    android:name="ThridLevelGroup3"
+                    android:translateX="-100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.648"
+                        android:fillColor="#FFFF0000"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+            <group
+                    android:name="ThridLevelGroup4"
+                    android:translateX="100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.576"
+                        android:fillColor="#FF00FF00"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml
new file mode 100644
index 0000000..5a1c7e2
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml
@@ -0,0 +1,89 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400">
+
+    <group
+            android:name="FirstLevelGroup"
+            android:translateX="100.0"
+            android:translateY="0.0">
+        <group
+                android:name="SecondLevelGroup1"
+                android:translateX="-100.0"
+                android:translateY="50.0">
+            <path
+                    android:fillAlpha="0.81"
+                    android:fillColor="#FF00FF00"
+                    android:pathData="@string/rectangle200"/>
+
+            <group
+                    android:name="ThridLevelGroup1"
+                    android:translateX="-100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.729"
+                        android:fillColor="#FF0000FF"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+            <group
+                    android:name="ThridLevelGroup2"
+                    android:translateX="100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.648"
+                        android:fillColor="#FF000000"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+        </group>
+        <group
+                android:name="SecondLevelGroup2"
+                android:translateX="100.0"
+                android:translateY="50.0">
+            <path
+                    android:fillAlpha="0.72"
+                    android:fillColor="#FF0000FF"
+                    android:pathData="@string/rectangle200"/>
+
+            <group
+                    android:name="ThridLevelGroup3"
+                    android:translateX="-100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.648"
+                        android:fillColor="#FFFF0000"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+            <group
+                    android:name="ThridLevelGroup4"
+                    android:translateX="100.0"
+                    android:translateY="50.0">
+                <path
+                        android:fillAlpha="0.576"
+                        android:fillColor="#FF00FF00"
+                        android:pathData="@string/rectangle200"/>
+            </group>
+        </group>
+
+        <path
+                android:fillAlpha="0.9"
+                android:fillColor="#FFFF0000"
+                android:pathData="@string/rectangle200"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml
new file mode 100644
index 0000000..b6a69a3
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml
@@ -0,0 +1,43 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="m 45.712063 19.109837
+                H 24.509682
+                a 59.3415 26.877445 22.398209 1 1 3.3506432 1.6524277
+                a 34.922844 36.72583 13.569004 0 0 24.409462 20.931156
+                a 43.47134 32.61542 52.534607 1 0 7.187504 61.509724
+                A 30.621132 41.44202 50.885685 0 0 23.235489 26.638653
+                A 7.251148 15.767811 44.704533 1 1 19.989803 21.33052
+                A 55.645584 46.20288 19.40316 0 1 32.881298 53.410923
+                c 30.649612 4.8525085 21.96682 1.3304634 17.300182 14.747681
+                a 9.375069 44.365055 57.169727 0 0 56.01326 52.59596
+                A 50.071907 37.331825 56.301754 1 0 14.676102 62.04976
+                C 36.531925 4.6217957 47.59332 54.793385 13.562473 13.753647
+                A 2.3695297 42.578487 54.250687 0 1 33.1337 41.511288
+                a 39.4827 38.844944 54.52335 1 1 13.549484 46.81581
+                c 56.943657 51.96854 27.938824 61.148792 24.168636 46.642727
+                "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml
new file mode 100644
index 0000000..a66d63e
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml
@@ -0,0 +1,45 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="m 45.712063 19.109837
+                H 24.509682
+                A 37.689938 2.3916092 17.462616 1 0 24.958328 48.110596
+                q 45.248383 30.396336 5.777027 3.4086685
+                a 30.966236 62.67946 50.532032 1 0 29.213684 60.63014
+                L 56.16764 8.342098
+                Q 61.172253 1.4613304 4.4721107 38.287144
+                A 6.284897 22.991482 47.409508 1 1 44.10166 60.998764
+                t 36.36881 55.68292
+                a 51.938667 35.22107 22.272938 1 1 28.572739 60.848858
+                A 19.610851 11.569599 51.407906 1 1 56.82705 24.386292
+                T 36.918854 59.542286
+                a 33.191364 10.553429 53.047726 1 0 54.874985 7.409252
+                s 30.186714 42.154182 59.73551 35.50219
+                A 47.9379 5.776497 28.307701 1 1 3.3323975 30.113499
+                a 22.462494 28.096004 55.76455 0 0 25.58981 30.816948
+                S 43.91107 54.679676 19.540264 0.34284973
+                "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml
new file mode 100644
index 0000000..50b6021
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml
@@ -0,0 +1,42 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="m 30.81895 41.37989
+                v 31.00579
+                c 24.291603 52.03364 40.6086 24.840137 29.56704 6.5204926
+                45.133224 22.913471 33.052887 21.727486 33.369 61.60278
+                9.647232 22.098152 48.939598 47.470215 53.653687 62.32235
+                C 2.0560722 1.4615479 7.0928993 26.005287 40.137558 36.75628
+                11.246731 32.178127 59.367462 60.34823 57.254383 37.357815
+                47.75605 11.424667 3.3105545 51.886635 56.63027 17.12133
+                q 28.37534 32.85535 25.85654 33.57151
+                10.356537 51.850616 54.085087 35.653175
+                12.530029 52.87991 17.44696 11.780586
+                Q 2.585228 51.92801 60.000664 56.79912
+                54.18275 51.500694 9.375679 23.836113
+                60.35329 59.026245 31.058632 35.14934
+                "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml
new file mode 100644
index 0000000..c55d550
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml
@@ -0,0 +1,42 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128">
+
+    <path
+            android:fillColor="#FF00FF00"
+            android:pathData="m 20.20005 8.139153
+                h 10.053165
+                s 14.2943 49.612846 35.520653 54.904068
+                50.1405 17.044182 5.470337 40.180553
+                3.125019 34.221123 53.212563 32.862965
+                S 35.985264 35.74349 0.15337753 59.27337
+                2.2951508 44.56783 51.089413 29.829689
+                8.5599785 22.649555 4.3914986 28.139206
+                t 11.932453 44.041077
+                62.629326 7.40921
+                23.302986 54.116184
+                T 43.560753 63.370514
+                40.156204 17.60786
+                40.12051 60.803394
+                "
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="1"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml
new file mode 100644
index 0000000..f6c0fd7
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200"
+        android:width="64dp">
+
+    <group>
+        <path
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"/>
+    </group>
+    <group
+            android:scaleX="-1"
+            android:scaleY="-1">
+        <group
+                android:scaleX="-1"
+                android:scaleY="-1">
+            <group
+                    android:pivotX="100"
+                    android:pivotY="100"
+                    android:rotation="45">
+                <path
+                        android:name="twoLines"
+                        android:fillColor="#FFFF0000"
+                        android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                        android:strokeColor="#FF00FF00"
+                        android:strokeWidth="10"/>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml
similarity index 61%
rename from graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml
rename to graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml
index 530c73b..fe9272c 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml
@@ -14,38 +14,34 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
+        android:height="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200"
+        android:width="64dp">
 
     <group>
         <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"/>
         <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"/>
     </group>
     <group
-        android:scaleX="-1"
-        android:scaleY="-1" >
+            android:scaleX="2"
+            android:scaleY="0.5">
         <group
-            android:scaleX="-1"
-            android:scaleY="-1" >
-            <group
                 android:pivotX="100"
                 android:pivotY="100"
-                android:rotation="45" >
-                <path
+                android:rotation="45">
+            <path
                     android:name="twoLines"
                     android:fillColor="#FFFF0000"
                     android:pathData="M 100, 0 l 0, 100, -100, 0 z"
                     android:strokeColor="#FF00FF00"
-                    android:strokeWidth="10" />
-            </group>
+                    android:strokeWidth="10"/>
         </group>
     </group>
 
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml
new file mode 100644
index 0000000..db1e45b
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml
@@ -0,0 +1,32 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="#E6000000"
+            android:pathData="M11.994999,2.0C6.4679985,2.0 2.0,6.4780006 2.0,12.0s4.468,10.0 9.995,10.0S22.0,17.522 22.0,12.0S17.521,2.0 11.994999,2.0zM12.0,20.0c-4.42,0.0 -8.0-3.582-8.0-8.0s3.58-8.0 8.0-8.0s8.0,3.582 8.0,8.0S16.419998,20.0 12.0,20.0z"/>
+    <path
+            android:fillColor="#E6000000"
+            android:pathData="M12.5,6.0l-1.5,0.0 0.0,7.0 5.3029995,3.1819992 0.75-1.249999-4.5529995-2.7320004z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml
new file mode 100644
index 0000000..0574654
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="#FF000000"
+            android:pathData="M19.429,12.975998c0.042-0.32 0.07-0.645 0.07-0.976s-0.029-0.655-0.07-0.976l2.113-1.654c0.188-0.151 0.243-0.422 0.118-0.639l-2.0-3.463c-0.125-0.217-0.386-0.304-0.612-0.218l-2.49,1.004c-0.516-0.396-1.081-0.731-1.69-0.984l-0.375-2.648C14.456,2.1829987 14.25,2.0 14.0,2.0l-4.0,0.0C9.75,2.0 9.544,2.1829987 9.506,2.422001L9.131,5.0699997C8.521,5.322998 7.957,5.6570015 7.44,6.054001L4.952,5.0509987C4.726,4.965 4.464,5.052002 4.34,5.269001l-2.0,3.463C2.2150002,8.947998 2.27,9.219002 2.4580002,9.369999l2.112,1.653C4.528,11.344002 4.5,11.668999 4.5,12.0s0.029,0.656 0.071,0.977L2.4580002,14.630001c-0.188,0.151-0.243,0.422-0.118,0.639l2.0,3.463c0.125,0.217 0.386,0.304 0.612,0.218l2.489-1.004c0.516,0.396 1.081,0.731 1.69,0.984l0.375,2.648C9.544,21.817001 9.75,22.0 10.0,22.0l4.0,0.0c0.25,0.0 0.456-0.183 0.494-0.422l0.375-2.648c0.609-0.253 1.174-0.588 1.689-0.984l2.49,1.004c0.226,0.086 0.487-0.001 0.612-0.218l2.0-3.463c0.125-0.217 0.07-0.487-0.118-0.639L19.429,12.975998zM12.0,16.0c-2.21,0.0-4.0-1.791-4.0-4.0c0.0-2.21 1.79-4.0 4.0-4.0c2.208,0.0 4.0,1.79 4.0,4.0C16.0,14.209 14.208,16.0 12.0,16.0z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml
new file mode 100644
index 0000000..5b82a35
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_state_list.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.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24">
+
+    <path
+            android:fillColor="@color/vector_icon_fill_state_list"
+            android:strokeColor="@color/vector_icon_stroke_state_list"
+            android:strokeWidth="3"
+            android:pathData="M16.0,5.0c-1.955.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z"/>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml
new file mode 100644
index 0000000..9d820dd
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200"
+        android:width="64dp">
+
+    <group>
+        <path
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"/>
+    </group>
+    <group
+            android:translateX="50"
+            android:translateY="50">
+        <path
+                android:name="twoLines"
+                android:pathData="M 100,20 l 0 80 l -30 -80"
+                android:fillColor="#FF000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeLineCap="butt"
+                android:strokeLineJoin="miter"
+                android:strokeMiterLimit="6"
+                android:strokeWidth="20"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml
new file mode 100644
index 0000000..0693460
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200"
+        android:width="64dp">
+
+    <group>
+        <path
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"/>
+    </group>
+    <group
+            android:translateX="50"
+            android:translateY="50">
+        <path
+                android:name="twoLines"
+                android:pathData="M 100,20 l 0 80 l -30 -80"
+                android:fillColor="#FF000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeLineCap="round"
+                android:strokeLineJoin="round"
+                android:strokeMiterLimit="10"
+                android:strokeWidth="20"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml
new file mode 100644
index 0000000..dcae16e
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200"
+        android:width="64dp">
+
+    <group>
+        <path
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"/>
+    </group>
+    <group
+            android:translateX="50"
+            android:translateY="50">
+        <path
+                android:name="twoLines"
+                android:pathData="M 100,20 l 0 80 l -30 -80"
+                android:fillColor="#FF000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeLineCap="square"
+                android:strokeLineJoin="bevel"
+                android:strokeMiterLimit="10"
+                android:strokeWidth="20"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml
similarity index 73%
rename from graphics/drawable/teststatic/res/drawable/vector_drawable14.xml
rename to graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml
index 102ae7a..d751d4a 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml
@@ -17,22 +17,22 @@
         android:height="64dp"
         android:width="64dp"
         android:viewportHeight="500"
-        android:viewportWidth="800" >
+        android:viewportWidth="800">
 
     <group
-        android:pivotX="90"
-        android:pivotY="100"
-        android:rotation="20">
+            android:pivotX="90"
+            android:pivotY="100"
+            android:rotation="20">
         <path
-            android:name="pie2"
-            android:pathData="M200,350 l 50,-25
+                android:name="pie2"
+                android:pathData="M200,350 l 50,-25
            a25,12 -30 0,1 100,-50 l 50,-25
            a25,25 -30 0,1 100,-50 l 50,-25
            a25,37 -30 0,1 100,-50 l 50,-25
            a25,50 -30 0,1 100,-50 l 50,-25"
-            android:fillColor="#00000000"
-            android:strokeColor="#FF00FF00"
-            android:strokeWidth="10" />
+                android:fillColor="#00000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10"/>
     </group>
 
-</vector>
\ No newline at end of file
+</vector>
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml
new file mode 100644
index 0000000..c8d8915
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200">
+
+    <group>
+        <path
+                android:name="background1"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+                android:fillColor="#FF000000"/>
+        <path
+                android:name="background2"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+                android:fillColor="#FF000000"/>
+    </group>
+    <group
+            android:pivotX="100"
+            android:pivotY="100"
+            android:rotation="90"
+            android:scaleX="0.75"
+            android:scaleY="0.5"
+            android:translateX="0.0"
+            android:translateY="100.0">
+        <path
+                android:name="twoLines"
+                android:pathData="M 100,10 v 90 M 10,100 h 90"
+                android:fillColor="#00000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml
new file mode 100644
index 0000000..6e23d2b
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200">
+
+    <group>
+        <path
+                android:name="background1"
+                android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+                android:fillColor="#FF000000"/>
+        <path
+                android:name="background2"
+                android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+                android:fillColor="#FF000000"/>
+    </group>
+    <group
+            android:pivotX="0"
+            android:pivotY="0"
+            android:rotation="90"
+            android:scaleX="0.75"
+            android:scaleY="0.5"
+            android:translateX="100.0"
+            android:translateY="100.0">
+        <path
+                android:name="twoLines"
+                android:pathData="M 100,10 v 90 M 10,100 h 90"
+                android:fillColor="#00000000"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml
new file mode 100644
index 0000000..d1d648e
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml
@@ -0,0 +1,68 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400">
+
+    <group android:name="backgroundGroup">
+        <path
+                android:name="background1"
+                android:fillColor="#80000000"
+                android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#80000000"
+                android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z"/>
+    </group>
+    <group
+            android:name="translateToCenterGroup"
+            android:translateX="50.0"
+            android:translateY="90.0">
+        <path
+                android:name="twoLines"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FFFF0000"
+                android:strokeWidth="20"/>
+
+        <group
+                android:name="rotationGroup"
+                android:pivotX="0.0"
+                android:pivotY="0.0"
+                android:rotation="-45.0">
+            <path
+                    android:name="twoLines1"
+                    android:pathData="M 0,0 v 100 M 0,0 h 100"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="20"/>
+
+            <group
+                    android:name="translateGroup"
+                    android:translateX="130.0"
+                    android:translateY="160.0">
+                <group android:name="scaleGroup">
+                    <path
+                            android:name="twoLines2"
+                            android:pathData="M 0,0 v 100 M 0,0 h 100"
+                            android:strokeColor="#FF0000FF"
+                            android:strokeWidth="20"/>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml
new file mode 100644
index 0000000..e4eb76c
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml
@@ -0,0 +1,81 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400">
+
+    <group android:name="backgroundGroup">
+        <path
+                android:name="background1"
+                android:fillColor="#80000000"
+                android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#80000000"
+                android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z"/>
+    </group>
+    <group
+            android:name="translateToCenterGroup"
+            android:translateX="50.0"
+            android:translateY="90.0">
+        <path
+                android:name="twoLines"
+                android:pathData="M 0,0 v 150 M 0,0 h 150"
+                android:strokeColor="#FFFF0000"
+                android:strokeWidth="20"/>
+
+        <group
+                android:name="rotationGroup"
+                android:pivotX="0.0"
+                android:pivotY="0.0"
+                android:rotation="-45.0">
+            <path
+                    android:name="twoLines1"
+                    android:pathData="M 0,0 v 100 M 0,0 h 100"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="20"/>
+
+            <group
+                    android:name="translateGroup"
+                    android:translateX="130.0"
+                    android:translateY="160.0">
+                <group android:name="scaleGroup">
+                    <path
+                            android:name="twoLines3"
+                            android:pathData="M 0,0 v 100 M 0,0 h 100"
+                            android:strokeColor="#FF0000FF"
+                            android:strokeWidth="20"/>
+                </group>
+            </group>
+
+            <group
+                    android:name="translateGroupHalf"
+                    android:translateX="65.0"
+                    android:translateY="80.0">
+                <group android:name="scaleGroup">
+                    <path
+                            android:name="twoLines2"
+                            android:pathData="M 0,0 v 100 M 0,0 h 100"
+                            android:strokeColor="#FF0000FF"
+                            android:strokeWidth="20"/>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml
new file mode 100644
index 0000000..3ccc070
--- /dev/null
+++ b/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml
@@ -0,0 +1,85 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400"
+        android:alpha="0.5">
+
+    <group android:name="backgroundGroup">
+        <path
+                android:name="background1"
+                android:fillColor="#FF000000"
+                android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z"/>
+        <path
+                android:name="background2"
+                android:fillColor="#FF000000"
+                android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z"/>
+    </group>
+    <group
+            android:name="translateToCenterGroup"
+            android:translateX="50.0"
+            android:translateY="90.0">
+        <path
+                android:name="twoLines"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FFFF0000"
+                android:strokeWidth="20"/>
+
+        <group
+                android:name="rotationGroup"
+                android:pivotX="0.0"
+                android:pivotY="0.0"
+                android:rotation="-45.0">
+            <path
+                    android:name="twoLines1"
+                    android:pathData="M 0,0 v 100 M 0,0 h 100"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="20"
+                    android:strokeAlpha="0.5"/>
+
+            <group
+                    android:name="translateGroup"
+                    android:translateX="130.0"
+                    android:translateY="160.0">
+                <group android:name="scaleGroup">
+                    <path
+                            android:name="twoLines3"
+                            android:pathData="M 0,0 v 100 M 0,0 h 100"
+                            android:strokeColor="#FF0000FF"
+                            android:strokeWidth="20"
+                            android:strokeAlpha="0.25"/>
+                </group>
+            </group>
+
+            <group
+                    android:name="translateGroupHalf"
+                    android:translateX="65.0"
+                    android:translateY="80.0">
+                <group android:name="scaleGroup">
+                    <path
+                            android:name="twoLines2"
+                            android:pathData="M 0,0 v 100 M 0,0 h 100"
+                            android:strokeColor="#FF0000FF"
+                            android:strokeWidth="20"
+                            android:strokeAlpha="0.5"/>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/values/colors.xml b/graphics/drawable/static/tests/res/values/colors.xml
similarity index 100%
rename from graphics/drawable/teststatic/res/values/colors.xml
rename to graphics/drawable/static/tests/res/values/colors.xml
diff --git a/graphics/drawable/static/tests/res/values/strings.xml b/graphics/drawable/static/tests/res/values/strings.xml
new file mode 100644
index 0000000..c279cd2
--- /dev/null
+++ b/graphics/drawable/static/tests/res/values/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+
+    <string name="twoLinePathData">"M 0,0 v 100 M 0,0 h 100"</string>
+    <string name="triangle">"M300,70 l 0,-70 70,70 0,0 -70,70z"</string>
+    <string name="rectangle">"M300,70 l 0,-70 70,0 0,140 -70,0 z"</string>
+    <string name="rectangle2">"M300,70 l 0,-70 70,0 0,70z M300,70 l 70,0 0,70 -70,0z"</string>
+    <string name="equal2">"M300,35 l 0,-35 70,0 0,35z M300,105 l 70,0 0,35 -70,0z"</string>
+    <string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0
+        0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25
+        5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"
+    </string>
+    <string name="heart">"m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3
+        -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707
+        9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"
+    </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+    <string name="triangle100">"M 100, 0 l 0, 100, -100, 0 z"</string>
+</resources>
diff --git a/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java b/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
new file mode 100644
index 0000000..7b57361
--- /dev/null
+++ b/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
@@ -0,0 +1,328 @@
+/*
+ * 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.graphics.drawable.tests;
+
+import android.content.res.Resources;
+import android.content.res.Resources.Theme;
+import android.graphics.*;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+import android.support.graphics.drawable.VectorDrawableCompat;
+import android.support.graphics.drawable.test.R;
+import android.test.AndroidTestCase;
+import android.util.Log;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class VectorDrawableTest extends AndroidTestCase {
+    private static final String LOGTAG = "VectorDrawableTest";
+
+    private static final int[] ICON_RES_IDS = new int[]{
+            R.drawable.vector_icon_create,
+            R.drawable.vector_icon_delete,
+            R.drawable.vector_icon_heart,
+            R.drawable.vector_icon_schedule,
+            R.drawable.vector_icon_settings,
+            R.drawable.vector_icon_random_path_1,
+            R.drawable.vector_icon_random_path_2,
+            R.drawable.vector_icon_repeated_cq,
+            R.drawable.vector_icon_repeated_st,
+            R.drawable.vector_icon_repeated_a_1,
+            R.drawable.vector_icon_repeated_a_2,
+            R.drawable.vector_icon_clip_path_1,
+            R.drawable.vector_icon_transformation_1,
+            R.drawable.vector_icon_transformation_2,
+            R.drawable.vector_icon_transformation_3,
+            R.drawable.vector_icon_transformation_4,
+            R.drawable.vector_icon_transformation_5,
+            R.drawable.vector_icon_transformation_6,
+            R.drawable.vector_icon_render_order_1,
+            R.drawable.vector_icon_render_order_2,
+            R.drawable.vector_icon_stroke_1,
+            R.drawable.vector_icon_stroke_2,
+            R.drawable.vector_icon_stroke_3,
+            R.drawable.vector_icon_scale_1,
+            R.drawable.vector_icon_scale_2,
+            R.drawable.vector_icon_implicit_lineto,
+            R.drawable.vector_icon_arcto,
+    };
+
+    private static final int[] GOLDEN_IMAGES = new int[]{
+            R.drawable.vector_icon_create_golden,
+            R.drawable.vector_icon_delete_golden,
+            R.drawable.vector_icon_heart_golden,
+            R.drawable.vector_icon_schedule_golden,
+            R.drawable.vector_icon_settings_golden,
+            R.drawable.vector_icon_random_path_1_golden,
+            R.drawable.vector_icon_random_path_2_golden,
+            R.drawable.vector_icon_repeated_cq_golden,
+            R.drawable.vector_icon_repeated_st_golden,
+            R.drawable.vector_icon_repeated_a_1_golden,
+            R.drawable.vector_icon_repeated_a_2_golden,
+            R.drawable.vector_icon_clip_path_1_golden,
+            R.drawable.vector_icon_transformation_1_golden,
+            R.drawable.vector_icon_transformation_2_golden,
+            R.drawable.vector_icon_transformation_3_golden,
+            R.drawable.vector_icon_transformation_4_golden,
+            R.drawable.vector_icon_transformation_5_golden,
+            R.drawable.vector_icon_transformation_6_golden,
+            R.drawable.vector_icon_render_order_1_golden,
+            R.drawable.vector_icon_render_order_2_golden,
+            R.drawable.vector_icon_stroke_1_golden,
+            R.drawable.vector_icon_stroke_2_golden,
+            R.drawable.vector_icon_stroke_3_golden,
+            R.drawable.vector_icon_scale_1_golden,
+            R.drawable.vector_icon_scale_2_golden,
+            R.drawable.vector_icon_implicit_lineto_golden,
+            R.drawable.vector_icon_arcto_golden,
+    };
+
+    private static final int TEST_ICON = R.drawable.vector_icon_create;
+
+    private static final int IMAGE_WIDTH = 64;
+    private static final int IMAGE_HEIGHT = 64;
+    // A small value is actually making sure that the values are matching
+    // exactly with the golden image.
+    // We can increase the threshold if the Skia is drawing with some variance
+    // on different devices. So far, the tests show they are matching correctly.
+    private static final float PIXEL_ERROR_THRESHOLD = 0.3f;
+    private static final float PIXEL_ERROR_COUNT_THRESHOLD = 0.1f;
+    private static final float PIXEL_DIFF_THRESHOLD = 0.025f;
+
+    private static final boolean DBG_DUMP_PNG = false;
+
+    private Resources mResources;
+    private VectorDrawableCompat mVectorDrawable;
+    private Bitmap mBitmap;
+    private Canvas mCanvas;
+    private Theme mTheme;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        final int width = IMAGE_WIDTH;
+        final int height = IMAGE_HEIGHT;
+
+        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        mCanvas = new Canvas(mBitmap);
+
+        mResources = mContext.getResources();
+        mTheme = mContext.getTheme();
+    }
+
+    public void testSimpleVectorDrawables() throws XmlPullParserException, IOException {
+        verifyVectorDrawables(ICON_RES_IDS, GOLDEN_IMAGES, null);
+    }
+
+
+    private void verifyVectorDrawables(int[] resIds, int[] goldenImages, int[] stateSet)
+            throws XmlPullParserException, IOException {
+        for (int i = 0; i < resIds.length; i++) {
+            // Setup VectorDrawable from xml file and draw into the bitmap.
+            mVectorDrawable = VectorDrawableCompat.create(mResources, resIds[i], mTheme);
+            mVectorDrawable.setBounds(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
+            if (stateSet != null) {
+                mVectorDrawable.setState(stateSet);
+            }
+
+            mBitmap.eraseColor(0);
+            mVectorDrawable.draw(mCanvas);
+
+            if (DBG_DUMP_PNG) {
+                saveVectorDrawableIntoPNG(mBitmap, resIds, i, stateSet);
+            } else {
+                // Start to compare
+                Bitmap golden = BitmapFactory.decodeResource(mResources, goldenImages[i]);
+                compareImages(mBitmap, golden, mResources.getString(resIds[i]));
+            }
+        }
+    }
+
+    // This is only for debugging or golden image (re)generation purpose.
+    private void saveVectorDrawableIntoPNG(Bitmap bitmap, int[] resIds, int index, int[] stateSet)
+            throws IOException {
+        // Save the image to the disk.
+        FileOutputStream out = null;
+        try {
+            String outputFolder = "/sdcard/temp/";
+            File folder = new File(outputFolder);
+            if (!folder.exists()) {
+                folder.mkdir();
+            }
+            String originalFilePath = mResources.getString(resIds[index]);
+            File originalFile = new File(originalFilePath);
+            String fileFullName = originalFile.getName();
+            String fileTitle = fileFullName.substring(0, fileFullName.lastIndexOf("."));
+            String stateSetTitle = getTitleForStateSet(stateSet);
+            String outputFilename = outputFolder + fileTitle + "_golden" + stateSetTitle + ".png";
+            File outputFile = new File(outputFilename);
+            if (!outputFile.exists()) {
+                outputFile.createNewFile();
+            }
+
+            out = new FileOutputStream(outputFile, false);
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+            Log.v(LOGTAG, "Write test No." + index + " to file successfully.");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+    /**
+     * Generates an underline-delimited list of states in a given state set.
+     * <p/>
+     * For example, the array {@code {R.attr.state_pressed}} would return
+     * {@code "_pressed"}.
+     *
+     * @param stateSet a state set
+     * @return a string representing the state set, or the empty string if the
+     * state set is empty or {@code null}
+     */
+    private String getTitleForStateSet(int[] stateSet) {
+        if (stateSet == null || stateSet.length == 0) {
+            return "";
+        }
+
+        final Resources res = getContext().getResources();
+        final StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < stateSet.length; i++) {
+            builder.append('_');
+
+            final String state = res.getResourceName(stateSet[i]);
+            final int stateIndex = state.indexOf("state_");
+            if (stateIndex >= 0) {
+                builder.append(state.substring(stateIndex + 6));
+            } else {
+                builder.append(stateSet[i]);
+            }
+        }
+
+        return builder.toString();
+    }
+
+    private void compareImages(Bitmap ideal, Bitmap given, String filename) {
+        int idealWidth = ideal.getWidth();
+        int idealHeight = ideal.getHeight();
+
+        assertTrue(idealWidth == given.getWidth());
+        assertTrue(idealHeight == given.getHeight());
+
+        int totalDiffPixelCount = 0;
+        float totalPixelCount = idealWidth * idealHeight;
+        for (int x = 0; x < idealWidth; x++) {
+            for (int y = 0; y < idealHeight; y++) {
+                int idealColor = ideal.getPixel(x, y);
+                int givenColor = given.getPixel(x, y);
+                if (idealColor == givenColor)
+                    continue;
+
+                float totalError = 0;
+                totalError += Math.abs(Color.red(idealColor) - Color.red(givenColor));
+                totalError += Math.abs(Color.green(idealColor) - Color.green(givenColor));
+                totalError += Math.abs(Color.blue(idealColor) - Color.blue(givenColor));
+                totalError += Math.abs(Color.alpha(idealColor) - Color.alpha(givenColor));
+
+                if ((totalError / 1024.0f) >= PIXEL_ERROR_THRESHOLD) {
+                    fail((filename + ": totalError is " + totalError));
+                }
+
+                if ((totalError / 1024.0f) >= PIXEL_DIFF_THRESHOLD) {
+                    totalDiffPixelCount++;
+                }
+            }
+        }
+        if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_COUNT_THRESHOLD) {
+            fail((filename + ": totalDiffPixelCount is " + totalDiffPixelCount));
+        }
+
+    }
+
+    public void testGetChangingConfigurations() {
+        VectorDrawableCompat vectorDrawable =
+                VectorDrawableCompat.create(mResources, TEST_ICON, mTheme);
+        Drawable.ConstantState constantState = vectorDrawable.getConstantState();
+
+        // default
+        assertEquals(0, constantState.getChangingConfigurations());
+        assertEquals(0, vectorDrawable.getChangingConfigurations());
+
+        // change the drawable's configuration does not affect the state's configuration
+        vectorDrawable.setChangingConfigurations(0xff);
+        assertEquals(0xff, vectorDrawable.getChangingConfigurations());
+        assertEquals(0, constantState.getChangingConfigurations());
+
+        // the state's configuration get refreshed
+        constantState = vectorDrawable.getConstantState();
+        assertEquals(0xff, constantState.getChangingConfigurations());
+
+        // set a new configuration to drawable
+        vectorDrawable.setChangingConfigurations(0xff00);
+        assertEquals(0xff, constantState.getChangingConfigurations());
+        assertEquals(0xffff, vectorDrawable.getChangingConfigurations());
+    }
+
+    public void testGetConstantState() {
+        VectorDrawableCompat vectorDrawable =
+                VectorDrawableCompat.create(mResources, R.drawable.vector_icon_arcto, mTheme);
+        Drawable.ConstantState constantState = vectorDrawable.getConstantState();
+        assertNotNull(constantState);
+        assertEquals(0, constantState.getChangingConfigurations());
+
+        vectorDrawable.setChangingConfigurations(1);
+        constantState = vectorDrawable.getConstantState();
+        assertNotNull(constantState);
+        assertEquals(1, constantState.getChangingConfigurations());
+    }
+
+    public void testMutate() {
+        Resources resources = mContext.getResources();
+        VectorDrawableCompat d1 =
+                VectorDrawableCompat.create(mResources, TEST_ICON, mTheme);
+        VectorDrawableCompat d2 =
+                (VectorDrawableCompat) d1.getConstantState().newDrawable(mResources);
+        VectorDrawableCompat d3 =
+                (VectorDrawableCompat) d1.getConstantState().newDrawable(mResources);
+
+        // d1 will be mutated, while d2 / d3 will not.
+        int originalAlpha = d2.getAlpha();
+
+        d1.setAlpha(0x80);
+        assertEquals(0x80, d1.getAlpha());
+        assertEquals(0x80, d2.getAlpha());
+        assertEquals(0x80, d3.getAlpha());
+
+        d1.mutate();
+        d1.setAlpha(0x40);
+        assertEquals(0x40, d1.getAlpha());
+        assertEquals(0x80, d2.getAlpha());
+        assertEquals(0x80, d3.getAlpha());
+
+        d2.setAlpha(0x20);
+        assertEquals(0x40, d1.getAlpha());
+        assertEquals(0x20, d2.getAlpha());
+        assertEquals(0x20, d3.getAlpha());
+
+        d2.setAlpha(originalAlpha);
+    }
+}
diff --git a/graphics/drawable/testanimated/Android.mk b/graphics/drawable/testanimated/Android.mk
deleted file mode 100644
index 004cddb..0000000
--- a/graphics/drawable/testanimated/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR = \
-        $(LOCAL_PATH)/res \
-        frameworks/support/graphics/drawable/res \
-
-LOCAL_PACKAGE_NAME := AndroidAnimatedVectorDrawableTests
-
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v11-animatedvectordrawable android-support-v4
-
-LOCAL_AAPT_FLAGS += --auto-add-overlay \
-        --extra-packages android.support.graphics.drawable \
-        --no-version-vectors
-
-include $(BUILD_PACKAGE)
diff --git a/graphics/drawable/testanimated/AndroidManifest.xml b/graphics/drawable/testanimated/AndroidManifest.xml
deleted file mode 100644
index 16171f2..0000000
--- a/graphics/drawable/testanimated/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.support.test.vectordrawable" >
-
-    <uses-sdk android:minSdkVersion="11" />
-
-    <application android:icon="@drawable/app_sample_code" android:label="AnimatedVectorDrawableCompatTest" >
-        <activity android:name="android.support.test.vectordrawable.TestAVDActivity" />
-        <intent-filter>
-            <action android:name="android.intent.action.MAIN" />
-
-            <category android:name="android.intent.category.LAUNCHER" />
-        </intent-filter>
-    </application>
-
-</manifest>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/anim/alpha_animation_progress_bar.xml b/graphics/drawable/testanimated/res/anim/alpha_animation_progress_bar.xml
deleted file mode 100644
index 2463a89..0000000
--- a/graphics/drawable/testanimated/res/anim/alpha_animation_progress_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <objectAnimator
-        android:duration="3350"
-        android:propertyName="alpha"
-        android:valueFrom="1"
-        android:valueTo="0.2" />
-
-</set>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/anim/trim_path_animation_progress_bar.xml b/graphics/drawable/testanimated/res/anim/trim_path_animation_progress_bar.xml
deleted file mode 100644
index 388c759..0000000
--- a/graphics/drawable/testanimated/res/anim/trim_path_animation_progress_bar.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <objectAnimator
-        android:duration="1300"
-        android:interpolator="@android:anim/linear_interpolator"
-        android:propertyName="trimPathStart"
-        android:repeatCount="-1"
-        android:valueFrom="0"
-        android:valueTo="0.75"
-        android:valueType="floatType" />
-    <objectAnimator
-        android:duration="1300"
-        android:interpolator="@android:anim/linear_interpolator"
-        android:propertyName="trimPathEnd"
-        android:repeatCount="-1"
-        android:valueFrom="0.25"
-        android:valueTo="1.0"
-        android:valueType="floatType" />
-    <objectAnimator
-        android:duration="1300"
-        android:interpolator="@android:anim/linear_interpolator"
-        android:propertyName="trimPathOffset"
-        android:repeatCount="-1"
-        android:valueFrom="0"
-        android:valueTo="0.25"
-        android:valueType="floatType" />
-
-</set>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml b/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml
deleted file mode 100644
index dac981b..0000000
--- a/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- 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.
--->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_grouping_1" >
-
-    <target
-        android:name="sun"
-        android:animation="@anim/animation_grouping_1_01" />
-    <target
-        android:name="earth"
-        android:animation="@anim/animation_grouping_1_01" />
-
-</animated-vector>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/app_sample_code.png b/graphics/drawable/testanimated/res/drawable/app_sample_code.png
deleted file mode 100755
index 66a1984..0000000
--- a/graphics/drawable/testanimated/res/drawable/app_sample_code.png
+++ /dev/null
Binary files differ
diff --git a/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml b/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml
deleted file mode 100644
index 06f098e..0000000
--- a/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="256"
-        android:viewportWidth="256" >
-
-    <group
-        android:name="shape_layer_1"
-        android:translateX="128"
-        android:translateY="128" >
-        <group android:name="sun" >
-            <path
-                android:name="ellipse_path_1"
-                android:fillColor="#ffff8000"
-                android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
-
-            <group
-                android:name="earth"
-                android:translateX="75" >
-                <path
-                    android:name="ellipse_path_1_1"
-                    android:fillColor="#ff5656ea"
-                    android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
-
-                <group
-                    android:name="moon"
-                    android:translateX="25" >
-                    <path
-                        android:name="ellipse_path_1_2"
-                        android:fillColor="#ffadadad"
-                        android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml b/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml
deleted file mode 100644
index 535265e..0000000
--- a/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="64"
-        android:viewportWidth="64"
-        android:name="root_bar" >
-
-    <group
-        android:name="root"
-        android:pivotX="0.0"
-        android:pivotY="0.0"
-        android:rotation="0"
-        android:translateX="32.0"
-        android:translateY="32.0" >
-        <group
-            android:name="rotationGroup"
-            android:pivotX="0.0"
-            android:pivotY="0.0"
-            android:rotation="0" >
-            <path
-                android:name="pie1"
-                android:fillColor="#00000000"
-                android:pathData="M0, 0 m 0, -9.5 a 9.5,9.5 0 1,1 0,19 a 9.5,9.5 0 1,1 0,-19"
-                android:strokeColor="#FF00FFFF"
-                android:strokeLineCap="round"
-                android:strokeLineJoin="miter"
-                android:strokeWidth="2"
-                android:trimPathEnd="0.1"
-                android:trimPathOffset="0"
-                android:trimPathStart="0" />
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/values/strings.xml b/graphics/drawable/testanimated/res/values/strings.xml
deleted file mode 100644
index c5451c8..0000000
--- a/graphics/drawable/testanimated/res/values/strings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources>
-
-    <string name="twoLinePathData">"M 0,0 v 100 M 0,0 h 100"</string>
-    <string name="triangle"> "M300,70 l 0,-70 70,70 0,0   -70,70z"</string>
-    <string name="rectangle">"M300,70 l 0,-70 70,0  0,140 -70,0 z"</string>
-    <string name="rectangle2">"M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z"</string>
-    <string name="equal2">    "M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z"</string>
-    <string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"</string>
-    <string name="heart">    "m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"</string>
-    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
-</resources>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/src/android/support/test/vectordrawable/TestAVDActivity.java b/graphics/drawable/testanimated/src/android/support/test/vectordrawable/TestAVDActivity.java
deleted file mode 100644
index c63c69f..0000000
--- a/graphics/drawable/testanimated/src/android/support/test/vectordrawable/TestAVDActivity.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.test.vectordrawable;
-
-import android.animation.ObjectAnimator;
-import android.app.Activity;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import java.text.DecimalFormat;
-
-public class TestAVDActivity extends Activity implements View.OnClickListener{
-    private static final String LOG_TAG = "TestActivity";
-
-    private static final String LOGCAT = "VectorDrawable1";
-    protected int[] icon = {
-        R.drawable.animation_vector_drawable_grouping_1,
-        R.drawable.animation_vector_progress_bar,
-    };
-
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        ObjectAnimator oa = new ObjectAnimator();
-        super.onCreate(savedInstanceState);
-        ScrollView scrollView = new ScrollView(this);
-        LinearLayout container = new LinearLayout(this);
-        scrollView.addView(container);
-        container.setOrientation(LinearLayout.VERTICAL);
-        Resources res = this.getResources();
-        container.setBackgroundColor(0xFF888888);
-        AnimatedVectorDrawableCompat []d = new AnimatedVectorDrawableCompat[icon.length];
-        long time =  android.os.SystemClock.currentThreadTimeMillis();
-        for (int i = 0; i < icon.length; i++) {
-             d[i] = AnimatedVectorDrawableCompat.create(this, icon[i]);
-        }
-        time =  android.os.SystemClock.currentThreadTimeMillis()-time;
-        TextView t = new TextView(this);
-        DecimalFormat df = new DecimalFormat("#.##");
-        t.setText("avgL=" + df.format(time / (icon.length)) + " ms");
-        container.addView(t);
-
-        addDrawableButtons(container, d);
-
-        // Now test constant state and mutate a bit.
-        AnimatedVectorDrawableCompat []copies = new AnimatedVectorDrawableCompat[3];
-        copies[0] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
-        copies[1] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
-        copies[2] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
-        copies[0].setAlpha(128);
-
-        // Expect to see the copies[0, 1] are showing alpha 128, and [2] are showing 255.
-        copies[2].mutate();
-        copies[2].setAlpha(255);
-
-        addDrawableButtons(container, copies);
-
-        setContentView(scrollView);
-    }
-
-    private void addDrawableButtons(LinearLayout container, AnimatedVectorDrawableCompat[] d) {
-        for (int i = 0; i < d.length; i++) {
-            Button button = new Button(this);
-            button.setWidth(200);
-            button.setHeight(200);
-            button.setBackgroundDrawable(d[i]);
-            container.addView(button);
-            button.setOnClickListener(this);
-        }
-    }
-
-    @Override
-    public void onClick(View v) {
-        AnimatedVectorDrawableCompat d = (AnimatedVectorDrawableCompat) v.getBackground();
-        d.start();
-    }
-}
diff --git a/graphics/drawable/teststatic/Android.mk b/graphics/drawable/teststatic/Android.mk
deleted file mode 100644
index 4c4a7ba..0000000
--- a/graphics/drawable/teststatic/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR = \
-        $(LOCAL_PATH)/res \
-        frameworks/support/graphics/drawable/res \
-
-LOCAL_PACKAGE_NAME := AndroidVectorDrawableTests
-
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-vectordrawable android-support-v4
-
-LOCAL_AAPT_FLAGS := \
-        --auto-add-overlay \
-        --extra-packages android.support.graphics.drawable \
-        --no-version-vectors
-
-include $(BUILD_PACKAGE)
-
diff --git a/graphics/drawable/teststatic/AndroidManifest.xml b/graphics/drawable/teststatic/AndroidManifest.xml
deleted file mode 100644
index 39ac8ba..0000000
--- a/graphics/drawable/teststatic/AndroidManifest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.support.test.vectordrawable" >
-
-    <uses-sdk android:minSdkVersion="7"/>
-
-    <application android:icon="@drawable/app_sample_code" android:label="VectorDrawableCompatTest" >
-        <activity android:name="android.support.test.vectordrawable.TestActivity" />
-
-        <intent-filter>
-            <action android:name="android.intent.action.MAIN" />
-
-            <category android:name="android.intent.category.LAUNCHER" />
-        </intent-filter>
-    </application>
-
-</manifest>
diff --git a/graphics/drawable/teststatic/res/drawable/app_sample_code.png b/graphics/drawable/teststatic/res/drawable/app_sample_code.png
deleted file mode 100755
index 66a1984..0000000
--- a/graphics/drawable/teststatic/res/drawable/app_sample_code.png
+++ /dev/null
Binary files differ
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml
deleted file mode 100644
index 286b487..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="48dp"
-        android:width="48dp"
-        android:viewportHeight="480"
-        android:viewportWidth="480" >
-
-    <group>
-        <path
-            android:name="box1"
-            android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
-            android:strokeLineCap="round"
-            android:strokeLineJoin="round" />
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml
deleted file mode 100644
index 7567887..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="64dp"
-        android:height="64dp" android:viewportWidth="320"
-          android:viewportHeight="320">
-    <group
-        android:rotation="180"
-        android:pivotX="70"
-        android:pivotY="120">
-        <path
-            android:name="house"
-            android:pathData="M 130,225 L 130,115 L 130,115 L 70,15 L 10,115 L 10,115 L 10,225 z"
-            android:fillColor="#ff440000"
-            android:strokeColor="#FF00FF00"
-            android:strokeWidth="10"
-            android:trimPathStart=".1"
-            android:trimPathEnd=".9"/>
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml
deleted file mode 100644
index 454468a..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="12.25"
-    android:viewportWidth="7.30625"
-    android:width="64dp" >
-
-    <group
-        android:pivotX="3.65"
-        android:pivotY="6.125"
-        android:rotation="-30" >
-        <clip-path
-            android:name="clip1"
-            android:pathData="
-                M 0, 6.125
-                l 7.3, 0
-                l 0, 12.25
-                l-7.3, 0
-                z" />
-
-        <group
-            android:pivotX="3.65"
-            android:pivotY="6.125"
-            android:rotation="30" >
-            <path
-                android:name="one"
-                android:fillColor="#ff88ff"
-                android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
-                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
-                l-5.046875,0.0 0.0-1.0Z" />
-        </group>
-    </group>
-    <group
-        android:pivotX="3.65"
-        android:pivotY="6.125"
-        android:rotation="-30" >
-        <clip-path
-            android:name="clip2"
-            android:pathData="
-                M 0, 0
-                l 7.3, 0
-                l 0, 6.125
-                l-7.3, 0
-                z" />
-
-        <group
-            android:pivotX="3.65"
-            android:pivotY="6.125"
-            android:rotation="30" >
-            <path
-                android:name="two"
-                android:fillColor="#ff88ff"
-                android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
-                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
-                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
-                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
-                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
-                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
-                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
-                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
-                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml
deleted file mode 100644
index e6658a6..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:autoMirrored="true"
-    android:height="64dp"
-    android:viewportHeight="12.25"
-    android:viewportWidth="7.30625"
-    android:width="64dp" >
-
-    <group>
-        <clip-path
-            android:name="clip1"
-            android:pathData="
-                M 3.65, 6.125
-                m-.001, 0
-                a .001,.001 0 1,0 .002,0
-                a .001,.001 0 1,0-.002,0z" />
-
-        <path
-            android:name="one"
-            android:fillColor="#ff88ff"
-            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
-                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
-                l-5.046875,0.0 0.0-1.0Z" />
-    </group>
-    <group>
-        <clip-path
-            android:name="clip2"
-            android:pathData="
-                M 3.65, 6.125
-                m-6, 0
-                a 6,6 0 1,0 12,0
-                a 6,6 0 1,0-12,0z" />
-
-        <path
-            android:name="two"
-            android:fillColor="#ff88ff"
-            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
-                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
-                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
-                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
-                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
-                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
-                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
-                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
-                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml
deleted file mode 100644
index d1723dc..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="12.25"
-        android:viewportWidth="7.30625" >
-
-    <group>
-        <path
-            android:name="one"
-            android:fillColor="#ffff00"
-            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
-                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
-                l-5.046875,0.0 0.0-1.0Z" />
-        <path
-            android:name="two"
-            android:fillColor="#ffff00"
-            android:fillAlpha="0"
-            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
-                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
-                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
-                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
-                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
-                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
-                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
-                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
-                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
-    </group>
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml
deleted file mode 100644
index 4b530fd..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-            android:width="64dp"
-            android:height="64dp"
-            android:viewportWidth="700"
-            android:viewportHeight="700">
-
-    <group>
-        <path android:pathData="M 569.374 461.472L 569.374 160.658L 160.658 160.658L 160.658 461.472L 569.374 461.472z"
-              android:name="path2451"
-              android:fillColor="#00000000"
-              android:strokeColor="#FF000000"
-              android:strokeWidth="30.65500000000000"/>
-        <path android:pathData="M 365.015 311.066"
-              android:name="path2453"
-              android:fillColor="#00000000"
-              android:strokeColor="#FF000000"
-              android:strokeWidth="30.655000000000001"/>
-        <path android:pathData="M 164.46 164.49L 340.78 343.158C 353.849 356.328 377.63 356.172 390.423 343.278L 566.622 165.928"
-              android:name="path2455"
-              android:strokeColor="#FF000000"
-              android:fillColor="#FFFFFFFF"
-              android:strokeWidth="30.655000000000001"/>
-        <path android:pathData="M 170.515 451.566L 305.61 313.46"
-              android:name="path2457"
-              android:fillColor="#00000000"
-              android:strokeColor="#000000"
-              android:strokeWidth="30.655000000000001"/>
-        <path android:pathData="M 557.968 449.974L 426.515 315.375"
-              android:name="path2459"
-              android:fillColor="#00000000"
-              android:strokeColor="#000000"
-              android:strokeWidth="30.655000000000001"/>
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml
deleted file mode 100644
index bbf2451..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-            android:width="64dp"
-            android:height="64dp" android:viewportWidth="140"
-          android:viewportHeight="110">
-
-    <group>
-        <path
-                android:name="back"
-                android:pathData="M 20,55 l 35.3-35.3 7.07,7.07-35.3,35.3 z
-              M 27,50 l 97,0 0,10-97,0 z
-              M 20,55 l 7.07-7.07 35.3,35.3-7.07,7.07 z"
-                android:fillColor="#ffffffff"
-                />
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml
deleted file mode 100644
index e5b59df..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-            android:width="64dp"
-            android:height="64dp" android:viewportWidth="600"
-          android:viewportHeight="600">
-
-    <group>
-        <path
-                android:name="pie1"
-                android:pathData="M535.441,412.339A280.868,280.868 0 1,1 536.186,161.733L284.493,286.29Z"
-                android:fillColor="#ffffcc00"
-                android:strokeColor="#FF00FF00"
-                android:strokeWidth="1"/>
-    </group>
-
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml
deleted file mode 100644
index ce2441d..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="200"
-        android:viewportWidth="200" >
-
-    <group
-        android:pivotX="100"
-        android:pivotY="100"
-        android:rotation="90">
-        <path
-            android:name="house"
-            android:fillColor="#ffffffff"
-            android:pathData="M 100,20 l 0,0 0,140-80,0 z M 100,20 l 0,0 80,140-80,0 z"/>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml
deleted file mode 100644
index 935d4a5..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportWidth="200"
-        android:viewportHeight="200">
-
-    <group>
-        <path
-            android:name="bar3"
-            android:fillColor="#FFFFFFFF"
-            android:pathData="M49.001,60c-5.466,0-9.899,4.478-9.899,10s4.434,10,9.899,10c5.468,0,9.899-4.478,9.899-10S54.469,60,49.001,60z" />
-        <path
-            android:name="bar2"
-            android:fillColor="#FFFFFFFF"
-            android:pathData="M28.001,48.787l7,7.07c7.731-7.811,20.269-7.81,28.001,0l6.999-7.07C58.403,37.071,39.599,37.071,28.001,48.787z" />
-        <path
-            android:name="bar1"
-            android:fillColor="#FF555555"
-            android:pathData="M14.001,34.645   L21,41.716c15.464-15.621,40.536-15.621,56,0l7.001-7.071C64.672,15.119,33.33,15.119,14.001,34.645z" />
-        <path
-            android:name="bar0"
-            android:fillColor="#FF555555"
-            android:pathData="M0,20.502l6.999,7.071   c23.196-23.431,60.806-23.431,84.002,0L98,20.503C70.938-6.834,27.063-6.834,0,20.502z" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml
deleted file mode 100644
index 05f481b..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="80"
-        android:viewportWidth="40" >
-
-    <group>
-        <path
-            android:name="battery"
-            android:fillColor="#3388ff"
-            android:pathData="M 20.28125,2.0000002 C 17.352748,2.0000002 15,4.3527485 15,7.2812502 L 15,8.0000002 L 13.15625,8.0000002 C 9.7507553,8.0000002 7,10.750759 7,14.15625 L 7,39.84375 C 7,43.24924 9.7507558,46 13.15625,46 L 33.84375,46 C 37.249245,46 39.999999,43.24924 40,39.84375 L 40,14.15625 C 40,10.75076 37.249243,8.0000002 33.84375,8.0000002 L 32,8.0000002 L 32,7.2812502 C 32,4.3527485 29.647252,2.0000002 26.71875,2.0000002 L 20.28125,2.0000002 z"
-            android:strokeColor="#ff8833"
-            android:strokeWidth="1" />
-        <path
-            android:name="spark"
-            android:fillColor="#FFFF0000"
-            android:pathData="M 30,18.031528 L 25.579581,23.421071 L 29.370621,26.765348 L 20.096792,37 L 21.156922,28.014053 L 17,24.902844 L 20.880632,18 L 30,18.031528 z" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml
deleted file mode 100644
index 94338a7..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:name="rootGroup"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="600"
-        android:viewportWidth="600"
-        android:alpha="0.5" >
-
-    <group
-        android:name="rotationGroup"
-        android:pivotX="300.0"
-        android:pivotY="300.0"
-        android:rotation="45.0" >
-        <path
-            android:name="pie1"
-            android:fillColor="#00000000"
-            android:pathData="M300,70 a230,230 0 1,0 1,0 z"
-            android:strokeColor="#FF777777"
-            android:strokeWidth="70"
-            android:trimPathEnd=".75"
-            android:trimPathOffset="0"
-            android:trimPathStart="0" />
-        <path
-            android:name="v"
-            android:fillColor="#000000"
-            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
-
-        <group
-            android:name="translateToCenterGroup"
-            android:rotation="0.0"
-            android:translateX="200.0"
-            android:translateY="200.0" >
-            <group
-                android:name="rotationGroup2"
-                android:pivotX="0.0"
-                android:pivotY="0.0"
-                android:rotation="-45.0" >
-                <path
-                    android:name="twoLines1"
-                    android:pathData="@string/twoLinePathData"
-                    android:strokeColor="#FFFF0000"
-                    android:strokeWidth="20" />
-
-                <group
-                    android:name="translateGroupHalf"
-                    android:translateX="65.0"
-                    android:translateY="80.0" >
-                    <group
-                        android:name="rotationGroup3"
-                        android:pivotX="-65.0"
-                        android:pivotY="-80.0"
-                        android:rotation="-45.0" >
-                        <path
-                            android:name="twoLines2"
-                            android:fillColor="#FF00FF00"
-                            android:pathData="@string/twoLinePathData"
-                            android:strokeColor="#FF00FF00"
-                            android:strokeWidth="20" />
-
-                        <group
-                            android:name="translateGroup"
-                            android:translateX="65.0"
-                            android:translateY="80.0" >
-                            <group
-                                android:name="rotationGroupBlue"
-                                android:pivotX="-65.0"
-                                android:pivotY="-80.0"
-                                android:rotation="-45.0" >
-                                <path
-                                    android:name="twoLines3"
-                                    android:pathData="@string/twoLinePathData"
-                                    android:strokeColor="#FF0000FF"
-                                    android:strokeWidth="20" />
-                            </group>
-                        </group>
-                    </group>
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml
deleted file mode 100644
index 097e028..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="600" >
-
-    <group>
-        <path
-            android:name="pie1"
-            android:fillColor="#ffffffff"
-            android:pathData="M300,200 h-150 a150,150 0 1,0 150,-150 z"
-            android:strokeColor="#FF00FF00"
-            android:strokeWidth="1" />
-        <path
-            android:name="half"
-            android:fillColor="#FFFF0000"
-            android:pathData="M275,175 v-150 a150,150 0 0,0 -150,150 z"
-            android:strokeColor="#FF0000FF"
-            android:strokeWidth="5" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml
deleted file mode 100644
index bdfcf81..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="500" >
-
-    <group
-        android:pivotX="250"
-        android:pivotY="200"
-        android:rotation="180">
-        <path
-            android:name="house"
-            android:fillColor="#ff440000"
-            android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
-            android:strokeColor="#FFFF0000"
-            android:strokeWidth="10" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml
deleted file mode 100644
index ed1efa0..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="200"
-        android:viewportWidth="200" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
-            android:fillColor="#FF000000"/>
-        <path
-            android:name="background2"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
-            android:fillColor="#FF000000"/>
-    </group>
-    <group
-        android:pivotX="100"
-        android:pivotY="100"
-        android:rotation="90"
-        android:scaleX="0.75"
-        android:scaleY="0.5"
-        android:translateX="0.0"
-        android:translateY="100.0">
-        <path
-            android:name="twoLines"
-            android:pathData="M 100,10 v 90 M 10,100 h 90"
-            android:strokeColor="#FF00FF00"
-            android:strokeWidth="10" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml
deleted file mode 100644
index ba15f41..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-            android:width="64dp"
-            android:height="64dp" android:viewportWidth="1200"
-          android:viewportHeight="600">
-
-    <group>
-        <path
-                android:name="house"
-                android:pathData="M200,300 Q400,50 600,300 T1000,300"
-                android:fillColor="#00000000"
-                android:strokeColor="#FFFF0000"
-                android:strokeWidth="10"/>
-    </group>
-
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml
deleted file mode 100644
index ee2122a..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="500" >
-
-    <group>
-        <path
-            android:name="house"
-            android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
-            android:fillColor="#00000000"
-            android:strokeColor="#FFFFFF00"
-            android:strokeWidth="10" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml
deleted file mode 100644
index b98e1de..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="800"
-        android:viewportWidth="1000" >
-
-    <group>
-        <path
-            android:name="house"
-            android:pathData="M10,300 Q400,550 600,300 T1000,300"
-            android:pivotX="90"
-            android:pivotY="100"
-            android:fillColor="#00000000"
-            android:strokeColor="#FFFF0000"
-            android:strokeWidth="60" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml
deleted file mode 100644
index 1c86818..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="480"
-        android:viewportWidth="480" >
-
-    <group>
-        <path
-            android:name="edit"
-            android:fillColor="#FF00FFFF"
-            android:pathData="M406.667,180c0,0 -100 -100 -113.334 -113.333
-    c-13.333 -13.334 -33.333,0 -33.333,0l-160,160c0,0 -40,153.333 -40,173.333c0,13.333,13.333,13.333,13.333,13.333l173.334 -40
-    c0,0,146.666 -146.666,160 -160C420,200,406.667,180,406.667,180z M226.399,356.823L131.95,378.62l-38.516 -38.522
-    c7.848 -34.675,20.152 -82.52,23.538 -95.593l3.027,2.162l106.667,106.666L226.399,356.823z"
-            android:strokeColor="#FF000000"
-            android:strokeWidth="10" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml
deleted file mode 100644
index 247f6bc..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="200"
-        android:viewportWidth="200" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
-            android:fillColor="#FF000000"/>
-        <path
-            android:name="background2"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
-            android:fillColor="#FF000000"/>
-    </group>
-    <group
-        android:pivotX="0"
-        android:pivotY="0"
-        android:rotation="90"
-        android:scaleX="0.75"
-        android:scaleY="0.5"
-        android:translateX="100.0"
-        android:translateY="100.0">
-        <path
-            android:name="twoLines"
-            android:pathData="M 100,10 v 90 M 10,100 h 90"
-            android:strokeColor="#FF00FF00"
-            android:strokeWidth="10" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml
deleted file mode 100644
index 39d891f..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="400" >
-
-    <group android:name="backgroundGroup" >
-        <path
-            android:name="background1"
-            android:fillColor="#80000000"
-            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#80000000"
-            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
-    </group>
-    <group
-        android:name="translateToCenterGroup"
-        android:translateX="50.0"
-        android:translateY="90.0" >
-        <path
-            android:name="twoLines"
-            android:pathData="M 0,0 v 100 M 0,0 h 100"
-            android:strokeColor="#FFFF0000"
-            android:strokeWidth="20" />
-
-        <group
-            android:name="rotationGroup"
-            android:pivotX="0.0"
-            android:pivotY="0.0"
-            android:rotation="-45.0" >
-            <path
-                android:name="twoLines1"
-                android:pathData="M 0,0 v 100 M 0,0 h 100"
-                android:strokeColor="#FF00FF00"
-                android:strokeWidth="20" />
-
-            <group
-                android:name="translateGroup"
-                android:translateX="130.0"
-                android:translateY="160.0" >
-                <group android:name="scaleGroup" >
-                    <path
-                        android:name="twoLines2"
-                        android:pathData="M 0,0 v 100 M 0,0 h 100"
-                        android:strokeColor="#FF0000FF"
-                        android:strokeWidth="20" />
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml
deleted file mode 100644
index 4a1c062..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="400" >
-
-    <group android:name="backgroundGroup" >
-        <path
-            android:name="background1"
-            android:fillColor="#80000000"
-            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#80000000"
-            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
-    </group>
-    <group
-        android:name="translateToCenterGroup"
-        android:translateX="50.0"
-        android:translateY="90.0" >
-        <path
-            android:name="twoLines"
-            android:pathData="@string/twoLinePathData"
-            android:strokeColor="#FFFF0000"
-            android:strokeWidth="20" />
-
-        <group
-            android:name="rotationGroup"
-            android:pivotX="0.0"
-            android:pivotY="0.0"
-            android:rotation="-45.0" >
-            <path
-                android:name="twoLines1"
-                android:pathData="@string/twoLinePathData"
-                android:strokeColor="#FF00FF00"
-                android:strokeWidth="20" />
-
-            <group
-                android:name="translateGroup"
-                android:translateX="130.0"
-                android:translateY="160.0" >
-                <group android:name="scaleGroup" >
-                    <path
-                        android:name="twoLines3"
-                        android:pathData="@string/twoLinePathData"
-                        android:strokeColor="#FF0000FF"
-                        android:strokeWidth="20" />
-                </group>
-            </group>
-
-            <group
-                android:name="translateGroupHalf"
-                android:translateX="65.0"
-                android:translateY="80.0" >
-                <group android:name="scaleGroup" >
-                    <path
-                        android:name="twoLines2"
-                        android:pathData="@string/twoLinePathData"
-                        android:fillColor="?android:attr/colorForeground"
-                        android:strokeColor="?android:attr/colorForeground"
-                        android:strokeWidth="20" />
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml
deleted file mode 100644
index a7a8bd3..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="400" >
-
-    <group android:name="backgroundGroup">
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
-    </group>
-    <group
-        android:name="translateToCenterGroup"
-        android:translateX="50.0"
-        android:translateY="90.0" >
-        <path
-            android:name="twoLines"
-            android:pathData="@string/twoLinePathData"
-            android:strokeColor="#FFFF0000"
-            android:strokeWidth="20" />
-
-        <group
-            android:name="rotationGroup"
-            android:pivotX="0.0"
-            android:pivotY="0.0"
-            android:rotation="-45.0">
-            <path
-                android:name="twoLines1"
-                android:pathData="@string/twoLinePathData"
-                android:strokeColor="#FF00FF00"
-                android:strokeWidth="20" />
-
-            <group
-                android:name="translateGroup"
-                android:translateX="130.0"
-                android:translateY="160.0">
-                <group android:name="scaleGroup" >
-                    <path
-                        android:name="twoLines3"
-                        android:pathData="@string/twoLinePathData"
-                        android:strokeColor="#FF0000FF"
-                        android:strokeWidth="20" />
-                </group>
-            </group>
-
-            <group
-                android:name="translateGroupHalf"
-                android:translateX="65.0"
-                android:translateY="80.0">
-                <group android:name="scaleGroup" >
-                    <path
-                        android:name="twoLines2"
-                        android:pathData="@string/twoLinePathData"
-                        android:fillColor="?android:attr/colorForeground"
-                        android:strokeColor="?android:attr/colorForeground"
-                        android:strokeWidth="20" />
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml
deleted file mode 100644
index 7c9e771..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="400"
-        android:viewportWidth="400" >
-
-    <group
-        android:name="FirstLevelGroup"
-        android:translateX="100.0"
-        android:translateY="0.0" >
-        <group
-            android:name="SecondLevelGroup1"
-            android:translateX="-100.0"
-            android:translateY="50.0" >
-            <path
-                android:fillColor="#FF00FF00"
-                android:pathData="@string/rectangle200" />
-
-            <group
-                android:name="ThridLevelGroup1"
-                android:translateX="-100.0"
-                android:translateY="50.0" >
-                <path
-                    android:fillColor="#FF0000FF"
-                    android:pathData="@string/rectangle200" />
-            </group>
-            <group
-                android:name="ThridLevelGroup2"
-                android:translateX="100.0"
-                android:translateY="50.0" >
-                <path
-                    android:fillColor="#FF000000"
-                    android:pathData="@string/rectangle200" />
-            </group>
-        </group>
-        <group
-            android:name="SecondLevelGroup2"
-            android:translateX="100.0"
-            android:translateY="50.0" >
-            <path
-                android:fillColor="#FF0000FF"
-                android:pathData="@string/rectangle200" />
-
-            <group
-                android:name="ThridLevelGroup3"
-                android:translateX="-100.0"
-                android:translateY="50.0" >
-                <path
-                    android:fillColor="#FFFF0000"
-                    android:pathData="@string/rectangle200" />
-            </group>
-            <group
-                android:name="ThridLevelGroup4"
-                android:translateX="100.0"
-                android:translateY="50.0" >
-                <path
-                    android:fillColor="#FF00FF00"
-                    android:pathData="@string/rectangle200" />
-            </group>
-        </group>
-
-        <path
-            android:fillColor="#FFFF0000"
-            android:pathData="@string/rectangle200" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml
deleted file mode 100644
index eda06d8..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:translateX="50"
-        android:translateY="50" >
-        <path
-            android:name="twoLines"
-            android:pathData="M 100,20 l 0 80 l -30 -80"
-            android:strokeColor="#FF00FF00"
-            android:strokeLineCap="butt"
-            android:strokeLineJoin="miter"
-            android:strokeMiterLimit="5"
-            android:strokeWidth="20" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml
deleted file mode 100644
index cd46dd9..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:translateX="50"
-        android:translateY="50" >
-        <path
-            android:name="twoLines"
-            android:pathData="M 100,20 l 0 80 l -30 -80"
-            android:strokeColor="#FF00FF00"
-            android:strokeLineCap="round"
-            android:strokeLineJoin="round"
-            android:strokeMiterLimit="10"
-            android:strokeWidth="20" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml
deleted file mode 100644
index 812af6b..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp"
-    android:autoMirrored="true" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:translateX="50"
-        android:translateY="50" >
-        <path
-            android:name="twoLines"
-            android:pathData="M 100,20 l 0 80 l -30 -80"
-            android:strokeColor="#FF00FF00"
-            android:strokeLineCap="square"
-            android:strokeLineJoin="bevel"
-            android:strokeMiterLimit="10"
-            android:strokeWidth="20" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml
deleted file mode 100644
index 24f7372..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="48dp"
-        android:width="48dp"
-        android:viewportHeight="48"
-        android:viewportWidth="48" >
-
-    <group>
-        <path
-            android:name="plus1"
-            android:pathData="M20 16h-4v8h-8v4h8v8h4v-8h8v-4h-8zm9-3.84v3.64l5-1v21.2h4v-26z"
-            android:fillColor="#ff00ff00"/>
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml
deleted file mode 100644
index 828f0d9..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="@color/color0"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="@color/color2"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:pivotX="0"
-        android:pivotY="0"
-        android:rotation="90" >
-        <group
-            android:scaleX="1.5"
-            android:scaleY="1" >
-            <group
-                android:pivotX="0"
-                android:pivotY="0"
-                android:rotation="-90" >
-                <group
-                    android:scaleX="1.5"
-                    android:scaleY="1" >
-                    <path
-                        android:name="twoLines"
-                        android:fillColor="#FFFF0000"
-                        android:pathData="@string/triangle100"
-                        android:strokeColor="#FF00FF00"
-                        android:strokeWidth="10" />
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml
deleted file mode 100644
index 200eb61..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:scaleX="2"
-        android:scaleY="0.5" >
-        <group
-            android:pivotX="100"
-            android:pivotY="100"
-            android:rotation="45" >
-            <path
-                android:name="twoLines"
-                android:fillColor="#FFFF0000"
-                android:pathData="M 100, 0 l 0, 100, -100, 0 z"
-                android:strokeColor="#FF00FF00"
-                android:strokeWidth="10" />
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml
deleted file mode 100644
index a40fc9c..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="64dp"
-    android:viewportHeight="200"
-    android:viewportWidth="200"
-    android:width="64dp" >
-
-    <group>
-        <path
-            android:name="background1"
-            android:fillColor="#FF000000"
-            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
-        <path
-            android:name="background2"
-            android:fillColor="#FF000000"
-            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
-    </group>
-    <group
-        android:pivotX="0"
-        android:pivotY="0"
-        android:rotation="45" >
-        <group
-            android:pivotX="0"
-            android:pivotY="0"
-            android:rotation="90" >
-            <group
-                android:scaleX="1.5"
-                android:scaleY="1" >
-                <group
-                    android:pivotX="0"
-                    android:pivotY="0"
-                    android:rotation="-90" >
-                    <group
-                        android:scaleX="1.5"
-                        android:scaleY="1" >
-                        <path
-                            android:name="twoLines"
-                            android:fillColor="#FFFF0000"
-                            android:pathData="M 100, 0 l 0, 100, -100, 0 z"
-                            android:strokeColor="#FF00FF00"
-                            android:strokeWidth="10" />
-                    </group>
-                </group>
-            </group>
-        </group>
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_test01.xml b/graphics/drawable/teststatic/res/drawable/vector_test01.xml
deleted file mode 100644
index 8b891d6..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_test01.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at"+
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="128dp"
-        android:width="128dp"
-        android:viewportHeight="512"
-        android:viewportWidth="512" >
-
-    <group>
-        <path
-            android:name="002b"
-            android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0t-200,299"
-            android:strokeColor="#FF0000FF"
-            android:strokeWidth="4"
-            android:fillColor="#00000000" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_test02.xml b/graphics/drawable/teststatic/res/drawable/vector_test02.xml
deleted file mode 100644
index e0af323..0000000
--- a/graphics/drawable/teststatic/res/drawable/vector_test02.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at"+
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="128dp"
-        android:width="128dp"
-        android:viewportHeight="512"
-        android:viewportWidth="512" >
-
-    <group>
-        <path
-            android:name="002b"
-            android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0T-200,299"
-            android:strokeColor="#FF0000FF"
-            android:strokeWidth="4"
-            android:fillColor="#00000000" />
-    </group>
-
-</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/raw/vector_drawable01.xml b/graphics/drawable/teststatic/res/raw/vector_drawable01.xml
deleted file mode 100644
index baa3fc7..0000000
--- a/graphics/drawable/teststatic/res/raw/vector_drawable01.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:auto="http://schemas.android.com/apk/res-auto"
-        android:height="48dp"
-        android:width="48dp"
-        android:viewportHeight="480"
-        android:viewportWidth="480" >
-
-    <group>
-        <path
-            android:name="box1"
-            android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
-            android:fillColor="?android:attr/colorControlActivated"
-            android:strokeColor="?android:attr/colorControlActivated"
-            android:strokeLineCap="round"
-            android:strokeLineJoin="round" />
-    </group>
-</vector>
diff --git a/graphics/drawable/teststatic/res/values/strings.xml b/graphics/drawable/teststatic/res/values/strings.xml
deleted file mode 100644
index 065e7d9..0000000
--- a/graphics/drawable/teststatic/res/values/strings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources>
-
-    <string name="twoLinePathData">"M 0,0 v 100 M 0,0 h 100"</string>
-    <string name="triangle"> "M300,70 l 0,-70 70,70 0,0   -70,70z"</string>
-    <string name="rectangle">"M300,70 l 0,-70 70,0  0,140 -70,0 z"</string>
-    <string name="rectangle2">"M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z"</string>
-    <string name="equal2">    "M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z"</string>
-    <string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"</string>
-    <string name="heart">    "m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"</string>
-    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
-    <string name="triangle100">"M 100, 0 l 0, 100, -100, 0 z"</string>
-</resources>
diff --git a/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java b/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java
deleted file mode 100644
index c92ff47..0000000
--- a/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.test.vectordrawable;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.drawable.Drawable.ConstantState;
-import android.os.Bundle;
-import android.support.graphics.drawable.VectorDrawableCompat;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import java.text.DecimalFormat;
-
-public class TestActivity extends Activity {
-    private static final String LOG_TAG = "TestActivity";
-
-    private static final String LOGCAT = "VectorDrawable1";
-    protected int[] icon = {
-            R.drawable.vector_drawable_scale0,
-            R.drawable.vector_drawable_scale1,
-            R.drawable.vector_drawable_scale2,
-            R.drawable.vector_drawable_scale3,
-            R.drawable.vector_drawable01,
-            R.drawable.vector_drawable02,
-            R.drawable.vector_drawable03,
-            R.drawable.vector_drawable04,
-            R.drawable.vector_drawable05,
-            R.drawable.vector_drawable06,
-            R.drawable.vector_drawable07,
-            R.drawable.vector_drawable08,
-            R.drawable.vector_drawable09,
-            R.drawable.vector_drawable10,
-            R.drawable.vector_drawable11,
-            R.drawable.vector_drawable12,
-            R.drawable.vector_drawable13,
-            R.drawable.vector_drawable14,
-            R.drawable.vector_drawable15,
-            R.drawable.vector_drawable16,
-            R.drawable.vector_drawable17,
-            R.drawable.vector_drawable18,
-            R.drawable.vector_drawable19,
-            R.drawable.vector_drawable20,
-            R.drawable.vector_drawable21,
-            R.drawable.vector_drawable22,
-            R.drawable.vector_drawable23,
-            R.drawable.vector_drawable24,
-            R.drawable.vector_drawable25,
-            R.drawable.vector_drawable26,
-            R.drawable.vector_drawable27,
-            R.drawable.vector_drawable28,
-            R.drawable.vector_drawable29,
-            R.drawable.vector_drawable30,
-            R.drawable.vector_test01,
-            R.drawable.vector_test02
-    };
-
-    private static final int EXTRA_TESTS = 2;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        ScrollView scrollView = new ScrollView(this);
-        LinearLayout container = new LinearLayout(this);
-        scrollView.addView(container);
-        container.setOrientation(LinearLayout.VERTICAL);
-        Resources res = this.getResources();
-        container.setBackgroundColor(0xFF888888);
-        VectorDrawableCompat []d = new VectorDrawableCompat[icon.length];
-        long time =  android.os.SystemClock.currentThreadTimeMillis();
-        for (int i = 0; i < icon.length; i++) {
-             d[i] = VectorDrawableCompat.create(res, icon[i], getTheme());
-        }
-        time =  android.os.SystemClock.currentThreadTimeMillis()-time;
-
-        // Testing Tint on one particular case.
-        if (d.length > 3) {
-            d[3].setTint(0x8000FF00);
-            d[3].setTintMode(Mode.MULTIPLY);
-        }
-
-        // Testing Constant State like operation by creating the first 2 icons
-        // from the 3rd one's constant state.
-        VectorDrawableCompat []extras = new VectorDrawableCompat[EXTRA_TESTS];
-        ConstantState state = d[0].getConstantState();
-        extras[0] = (VectorDrawableCompat) state.newDrawable();
-        extras[1] = (VectorDrawableCompat) state.newDrawable();
-
-        // This alpha change is expected to affect both extra 0, 1, and d0.
-        extras[0].setAlpha(128);
-
-        d[0].mutate();
-        d[0].setAlpha(255);
-
-        // Just show the average create time as the first view.
-        TextView t = new TextView(this);
-        DecimalFormat df = new DecimalFormat("#.##");
-        t.setText("avgL=" + df.format(time / (icon.length)) + " ms");
-        container.addView(t);
-
-        addDrawableButtons(container, extras);
-
-        addDrawableButtons(container, d);
-
-        setContentView(scrollView);
-    }
-
-    private void addDrawableButtons(LinearLayout container, VectorDrawableCompat[] d) {
-        // Add the VD into consequent views.
-        for (int i = 0; i < d.length; i++) {
-            Button button = new Button(this);
-            button.setWidth(200);
-            // Note that setBackgroundResource() will fail b/c createFromXmlInner() failed
-            // to recognize <vector> pre-L.
-            button.setBackgroundDrawable(d[i]);
-            container.addView(button);
-        }
-    }
-}
diff --git a/percent/api/23.1.1.txt b/percent/api/23.1.1.txt
new file mode 100644
index 0000000..eb10df8
--- /dev/null
+++ b/percent/api/23.1.1.txt
@@ -0,0 +1,65 @@
+package android.support.percent {
+
+  public class PercentFrameLayout extends android.widget.FrameLayout {
+    ctor public PercentFrameLayout(android.content.Context);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout.LayoutParams(int, int);
+    ctor public PercentFrameLayout.LayoutParams(int, int, int);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public class PercentLayoutHelper {
+    ctor public PercentLayoutHelper(android.view.ViewGroup);
+    method public void adjustChildren(int, int);
+    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
+    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
+    method public boolean handleMeasuredStateTooSmall();
+    method public void restoreOriginalParams();
+  }
+
+  public static class PercentLayoutHelper.PercentLayoutInfo {
+    ctor public PercentLayoutHelper.PercentLayoutInfo();
+    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
+    method public void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public float aspectRatio;
+    field public float bottomMarginPercent;
+    field public float endMarginPercent;
+    field public float heightPercent;
+    field public float leftMarginPercent;
+    field public float rightMarginPercent;
+    field public float startMarginPercent;
+    field public float topMarginPercent;
+    field public float widthPercent;
+  }
+
+  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
+    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public class PercentRelativeLayout extends android.widget.RelativeLayout {
+    ctor public PercentRelativeLayout(android.content.Context);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout.LayoutParams(int, int);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+}
+
diff --git a/percent/build.gradle b/percent/build.gradle
index 6fbc478..89a932c 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -4,11 +4,20 @@
 
 dependencies {
     compile project(':support-v4')
+
+    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
+    testCompile 'junit:junit:4.12'
 }
 
 android {
     compileSdkVersion 'current'
 
+    defaultConfig {
+        minSdkVersion 8
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
@@ -20,7 +29,9 @@
         // tests/java, tests/res, tests/assets, ...
         // This is a *reset* so it replaces the default paths
         androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
+        androidTest.java.srcDir 'tests/java'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
 
     compileOptions {
diff --git a/percent/src/android/support/percent/PercentLayoutHelper.java b/percent/src/android/support/percent/PercentLayoutHelper.java
index b670385..cce222f 100644
--- a/percent/src/android/support/percent/PercentLayoutHelper.java
+++ b/percent/src/android/support/percent/PercentLayoutHelper.java
@@ -72,6 +72,9 @@
 public class PercentLayoutHelper {
     private static final String TAG = "PercentLayout";
 
+    private static final boolean DEBUG = false;
+    private static final boolean VERBOSE = false;
+
     private final ViewGroup mHost;
 
     public PercentLayoutHelper(ViewGroup host) {
@@ -96,7 +99,7 @@
      * @param heightMeasureSpec Height MeasureSpec of the parent ViewGroup.
      */
     public void adjustChildren(int widthMeasureSpec, int heightMeasureSpec) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
+        if (DEBUG) {
             Log.d(TAG, "adjustChildren: " + mHost + " widthMeasureSpec: "
                     + View.MeasureSpec.toString(widthMeasureSpec) + " heightMeasureSpec: "
                     + View.MeasureSpec.toString(heightMeasureSpec));
@@ -107,13 +110,13 @@
         for (int i = 0, N = mHost.getChildCount(); i < N; i++) {
             View view = mHost.getChildAt(i);
             ViewGroup.LayoutParams params = view.getLayoutParams();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
+            if (DEBUG) {
                 Log.d(TAG, "should adjust " + view + " " + params);
             }
             if (params instanceof PercentLayoutParams) {
                 PercentLayoutInfo info =
                         ((PercentLayoutParams) params).getPercentLayoutInfo();
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                if (DEBUG) {
                     Log.d(TAG, "using " + info);
                 }
                 if (info != null) {
@@ -139,7 +142,7 @@
         float value = array.getFraction(R.styleable.PercentLayout_Layout_layout_widthPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent width: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -147,7 +150,7 @@
         }
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_heightPercent, 1, 1, -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent height: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -155,7 +158,7 @@
         }
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginPercent, 1, 1, -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -167,7 +170,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginLeftPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent left margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -176,7 +179,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginTopPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent top margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -185,7 +188,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginRightPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent right margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -194,7 +197,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginBottomPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent bottom margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -203,7 +206,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginStartPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent start margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -212,7 +215,7 @@
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_marginEndPercent, 1, 1,
                 -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "percent end margin: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -221,7 +224,7 @@
 
         value = array.getFraction(R.styleable.PercentLayout_Layout_layout_aspectRatio, 1, 1, -1f);
         if (value != -1f) {
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            if (VERBOSE) {
                 Log.v(TAG, "aspect ratio: " + value);
             }
             info = info != null ? info : new PercentLayoutInfo();
@@ -229,7 +232,7 @@
         }
 
         array.recycle();
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
+        if (DEBUG) {
             Log.d(TAG, "constructed: " + info);
         }
         return info;
@@ -244,13 +247,13 @@
         for (int i = 0, N = mHost.getChildCount(); i < N; i++) {
             View view = mHost.getChildAt(i);
             ViewGroup.LayoutParams params = view.getLayoutParams();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
+            if (DEBUG) {
                 Log.d(TAG, "should restore " + view + " " + params);
             }
             if (params instanceof PercentLayoutParams) {
                 PercentLayoutInfo info =
                         ((PercentLayoutParams) params).getPercentLayoutInfo();
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                if (DEBUG) {
                     Log.d(TAG, "using " + info);
                 }
                 if (info != null) {
@@ -283,7 +286,7 @@
         for (int i = 0, N = mHost.getChildCount(); i < N; i++) {
             View view = mHost.getChildAt(i);
             ViewGroup.LayoutParams params = view.getLayoutParams();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
+            if (DEBUG) {
                 Log.d(TAG, "should handle measured state too small " + view + " " + params);
             }
             if (params instanceof PercentLayoutParams) {
@@ -301,7 +304,7 @@
                 }
             }
         }
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
+        if (DEBUG) {
             Log.d(TAG, "should trigger second measure pass: " + needsSecondMeasure);
         }
         return needsSecondMeasure;
@@ -389,7 +392,7 @@
                 }
             }
 
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
+            if (DEBUG) {
                 Log.d(TAG, "after fillLayoutParams: (" + params.width + ", " + params.height + ")");
             }
         }
@@ -432,7 +435,7 @@
                 MarginLayoutParamsCompat.setMarginEnd(params,
                         (int) (widthHint * endMarginPercent));
             }
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
+            if (DEBUG) {
                 Log.d(TAG, "after fillMarginLayoutParams: (" + params.width + ", " + params.height
                         + ")");
             }
diff --git a/percent/src/android/support/percent/PercentRelativeLayout.java b/percent/src/android/support/percent/PercentRelativeLayout.java
index 02a9188..1c00c4b 100644
--- a/percent/src/android/support/percent/PercentRelativeLayout.java
+++ b/percent/src/android/support/percent/PercentRelativeLayout.java
@@ -40,7 +40,7 @@
  *         app:layout_heightPercent="50%"
  *         app:layout_marginTopPercent="25%"
  *         app:layout_marginLeftPercent="25%"/&gt
- * &lt;/android.support.percent.PercentFrameLayout/&gt
+ * &lt;/android.support.percent.PercentFrameLayout&gt
  * </pre>
  *
  * The attributes that you can use are:
diff --git a/percent/tests/AndroidManifest.xml b/percent/tests/AndroidManifest.xml
new file mode 100644
index 0000000..e864d96
--- /dev/null
+++ b/percent/tests/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.percent.test">
+    <uses-sdk
+            android:minSdkVersion="8"
+            android:targetSdkVersion="23"/>
+
+    <application android:supportsRtl="true">
+        <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.support.percent.TestFrameActivity"/>
+    </application>
+
+    <instrumentation
+            android:name="android.test.InstrumentationTestRunner"
+            android:targetPackage="android.support.percent.test"/>
+</manifest>
diff --git a/percent/tests/NO_DOCS b/percent/tests/NO_DOCS
new file mode 100644
index 0000000..0c81e4a
--- /dev/null
+++ b/percent/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/percent/tests/java/android/support/percent/PercentFrameTest.java b/percent/tests/java/android/support/percent/PercentFrameTest.java
new file mode 100644
index 0000000..9e689ab
--- /dev/null
+++ b/percent/tests/java/android/support/percent/PercentFrameTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.percent;
+
+import android.support.percent.PercentFrameLayout;
+import android.support.percent.TestFrameActivity;
+import android.support.percent.test.R;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+
+public class PercentFrameTest extends ActivityInstrumentationTestCase2<TestFrameActivity> {
+    private PercentFrameLayout mPercentFrameLayout;
+    private View mChild;
+
+    public PercentFrameTest() {
+        super("android.support.percent", TestFrameActivity.class);
+    }
+
+    public void setUp() throws Exception {
+        super.setUp();
+
+        final TestFrameActivity activity = getActivity();
+        mPercentFrameLayout = (PercentFrameLayout) activity.findViewById(R.id.percent_frame);
+        mChild = mPercentFrameLayout.findViewById(R.id.percent_child);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testBasics() {
+        int containerWidth = mPercentFrameLayout.getWidth();
+        int containerHeight = mPercentFrameLayout.getHeight();
+
+        int childWidth = mChild.getWidth();
+        int childHeight = mChild.getHeight();
+        int childLeft = mChild.getLeft();
+        int childTop = mChild.getTop();
+
+        assertEquals("Child width as 50% of the container", containerWidth / 2, childWidth);
+        assertEquals("Child height as 50% of the container", containerHeight / 2, childHeight);
+        assertEquals("Child left margin as 20% of the container", containerWidth / 5, childLeft);
+        assertEquals("Child top margin as 20% of the container", containerHeight / 5, childTop);
+    }
+}
diff --git a/percent/tests/java/android/support/percent/TestFrameActivity.java b/percent/tests/java/android/support/percent/TestFrameActivity.java
new file mode 100644
index 0000000..9a7da76
--- /dev/null
+++ b/percent/tests/java/android/support/percent/TestFrameActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.percent.test.R;
+import android.view.WindowManager;
+
+import java.util.ArrayList;
+
+public class TestFrameActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(R.layout.percent_frame_layout);
+    }
+}
diff --git a/percent/tests/res/layout/percent_frame_layout.xml b/percent/tests/res/layout/percent_frame_layout.xml
new file mode 100644
index 0000000..56b316e
--- /dev/null
+++ b/percent/tests/res/layout/percent_frame_layout.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<android.support.percent.PercentFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/percent_frame"
+    android:layout_width="200px"
+    android:layout_height="match_parent">
+
+    <!-- Note the usage of layout_gravity that addresses a bug in FrameLayout on v9 and older
+         devices that didn't correctly treat the margin attributes. -->
+    <View
+        android:id="@+id/percent_child"
+        app:layout_widthPercent="50%"
+        app:layout_heightPercent="50%"
+        app:layout_marginTopPercent="20%"
+        app:layout_marginLeftPercent="20%"
+        android:layout_gravity="top" />
+
+</android.support.percent.PercentFrameLayout>
+
diff --git a/recommendation/api/23.1.1.txt b/recommendation/api/23.1.1.txt
new file mode 100644
index 0000000..ce69b31
--- /dev/null
+++ b/recommendation/api/23.1.1.txt
@@ -0,0 +1,132 @@
+package android.support.app.recommendation {
+
+  public final class ContentRecommendation {
+    method public java.lang.String getBackgroundImageUri();
+    method public int getBadgeImageResourceId();
+    method public int getColor();
+    method public android.graphics.Bitmap getContentImage();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
+    method public java.lang.String[] getContentTypes();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getGroup();
+    method public java.lang.String getIdTag();
+    method public java.lang.String getMaturityRating();
+    method public android.app.Notification getNotificationObject(android.content.Context);
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public int getProgressMax();
+    method public int getProgressValue();
+    method public long getRunningTime();
+    method public java.lang.String getSortKey();
+    method public java.lang.String getSourceName();
+    method public int getStatus();
+    method public java.lang.String getText();
+    method public java.lang.String getTitle();
+    method public boolean hasProgressInfo();
+    method public boolean isAutoDismiss();
+    method public void setAutoDismiss(boolean);
+    method public void setGroup(java.lang.String);
+    method public void setProgress(int, int);
+    method public void setSortKey(java.lang.String);
+    method public void setStatus(int);
+    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
+    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
+    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
+    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
+    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
+    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
+    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
+    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
+    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
+    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
+    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
+    field public static final int CONTENT_STATUS_READY = 0; // 0x0
+    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
+    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
+    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
+    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
+    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
+    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
+    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
+    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
+    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
+    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
+    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
+    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
+    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
+    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
+    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
+    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
+    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
+    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
+  }
+
+  public static final class ContentRecommendation.Builder {
+    ctor public ContentRecommendation.Builder();
+    method public android.support.app.recommendation.ContentRecommendation build();
+    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
+  }
+
+  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
+  }
+
+  public static class ContentRecommendation.IntentData {
+    ctor public ContentRecommendation.IntentData();
+  }
+
+  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
+  }
+
+  public final class RecommendationExtender implements android.app.Notification.Extender {
+    ctor public RecommendationExtender();
+    ctor public RecommendationExtender(android.app.Notification);
+    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
+    method public java.lang.String[] getContentTypes();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getMaturityRating();
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public long getRunningTime();
+    method public int getStatus();
+    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
+    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
+  }
+
+}
+
diff --git a/settings.gradle b/settings.gradle
index d33c2ac..1d6e882 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -51,3 +51,10 @@
 
 include ':support-recommendation'
 project(':support-recommendation').projectDir = new File(rootDir, 'recommendation')
+
+include ':support-vector-drawable'
+project(':support-vector-drawable').projectDir = new File(rootDir, 'graphics/drawable/static')
+
+include ':support-animated-vector-drawable'
+project(':support-animated-vector-drawable').projectDir = new File(rootDir, 'graphics/drawable/animated')
+
diff --git a/tests/Android.mk b/tests/Android.mk
index 7bd3b00..7993eed 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -5,7 +5,7 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, java)
 
-LOCAL_STATIC_JAVA_LIBRARIES := mockito-target android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target android-support-v4 junit-runner
 LOCAL_JAVA_LIBRARIES := android.test.runner
 LOCAL_PACKAGE_NAME := AndroidSupportTests
 
diff --git a/v13/api/23.1.1.txt b/v13/api/23.1.1.txt
new file mode 100644
index 0000000..36ea6c0
--- /dev/null
+++ b/v13/api/23.1.1.txt
@@ -0,0 +1,38 @@
+package android.support.v13.app {
+
+  public class FragmentCompat {
+    ctor public FragmentCompat();
+    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
+    method public static void setMenuVisibility(android.app.Fragment, boolean);
+    method public static void setUserVisibleHint(android.app.Fragment, boolean);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
+  }
+
+  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
+    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentPagerAdapter(android.app.FragmentManager);
+    method public abstract android.app.Fragment getItem(int);
+    method public long getItemId(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
+    method public abstract android.app.Fragment getItem(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public FragmentTabHost(android.content.Context);
+    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method public void onTabChanged(java.lang.String);
+    method public void setup(android.content.Context, android.app.FragmentManager);
+    method public void setup(android.content.Context, android.app.FragmentManager, int);
+  }
+
+}
+
diff --git a/v14/preference/Android.mk b/v14/preference/Android.mk
index fc7a9aa..6f56bac 100644
--- a/v14/preference/Android.mk
+++ b/v14/preference/Android.mk
@@ -21,7 +21,7 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v14-preference-res
 LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, dummy)
+LOCAL_SRC_FILES := $(call all-java-files-under, ../../v7/preference/constants)
 LOCAL_RESOURCE_DIR := \
         frameworks/support/v7/appcompat/res \
         frameworks/support/v7/preference/res \
@@ -56,4 +56,4 @@
 support_module_src_files := $(LOCAL_SRC_FILES)
 support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
 support_module_java_packages := android.support.v14.preference
-include $(SUPPORT_API_CHECK)
\ No newline at end of file
+include $(SUPPORT_API_CHECK)
diff --git a/v14/preference/api/23.1.1.txt b/v14/preference/api/23.1.1.txt
new file mode 100644
index 0000000..fed4623
--- /dev/null
+++ b/v14/preference/api/23.1.1.txt
@@ -0,0 +1,94 @@
+package android.support.v14.preference {
+
+  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public EditTextPreferenceDialogFragment();
+    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public ListPreferenceDialogFragment();
+    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public MultiSelectListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence[] getEntryValues();
+    method protected boolean[] getSelectedItems();
+    method public java.util.Set<java.lang.String> getValues();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValues(java.util.Set<java.lang.String>);
+  }
+
+  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public MultiSelectListPreferenceDialogFragment();
+    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragment();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreference(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+}
+
diff --git a/v14/preference/res/layout/preference_widget_switch.xml b/v14/preference/res/layout/preference_widget_switch.xml
index ae83afa..afc4351 100644
--- a/v14/preference/res/layout/preference_widget_switch.xml
+++ b/v14/preference/res/layout/preference_widget_switch.xml
@@ -18,7 +18,7 @@
 <!-- Layout used by SwitchPreference for the switch widget style. This is inflated
      inside android.R.layout.preference. -->
 <Switch xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/switchWidget"
+    android:id="@android:id/switch_widget"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:focusable="false"
diff --git a/v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java b/v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java
index 2a636fe..8316b0d 100644
--- a/v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java
+++ b/v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java
@@ -72,7 +72,8 @@
     }
 
     public MultiSelectListPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.dialogPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
+                android.R.attr.dialogPreferenceStyle));
     }
 
     public MultiSelectListPreference(Context context) {
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
index b9fc935..d1a0697 100644
--- a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
+++ b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
@@ -28,7 +28,9 @@
 import android.os.Message;
 import android.support.annotation.Nullable;
 import android.support.annotation.XmlRes;
+import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v4.view.ViewCompat;
+import android.support.v7.preference.AndroidResources;
 import android.support.v7.preference.DialogPreference;
 import android.support.v7.preference.EditTextPreference;
 import android.support.v7.preference.ListPreference;
@@ -242,7 +244,8 @@
 
         TypedArray a = mStyledContext.obtainStyledAttributes(null,
                 R.styleable.PreferenceFragment,
-                R.attr.preferenceFragmentStyle,
+                TypedArrayUtils.getAttr(mStyledContext, R.attr.preferenceFragmentStyle,
+                        AndroidResources.ANDROID_R_PREFERENCE_FRAGMENT_STYLE),
                 0);
 
         mLayoutResId = a.getResourceId(R.styleable.PreferenceFragment_android_layout, mLayoutResId);
@@ -263,10 +266,10 @@
 
         final View view = themedInflater.inflate(mLayoutResId, container, false);
 
-        final View rawListContainer = view.findViewById(R.id.list_container);
+        final View rawListContainer = view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER);
         if (!(rawListContainer instanceof ViewGroup)) {
-            throw new RuntimeException("Content has view with id attribute 'R.id.list_container' "
-                    + "that is not a ViewGroup class");
+            throw new RuntimeException("Content has view with id attribute "
+                    + "'android.R.id.list_container' that is not a ViewGroup class");
         }
 
         final ViewGroup listContainer = (ViewGroup) rawListContainer;
diff --git a/v14/preference/src/android/support/v14/preference/SwitchPreference.java b/v14/preference/src/android/support/v14/preference/SwitchPreference.java
index 1a46cc4..ac2a9c6 100644
--- a/v14/preference/src/android/support/v14/preference/SwitchPreference.java
+++ b/v14/preference/src/android/support/v14/preference/SwitchPreference.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.support.v4.content.res.TypedArrayUtils;
+import android.support.v7.preference.AndroidResources;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.support.v7.preference.TwoStatePreference;
 import android.util.AttributeSet;
@@ -121,7 +122,8 @@
      * @param attrs Style attributes that differ from the default
      */
     public SwitchPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.switchPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.switchPreferenceStyle,
+                android.R.attr.switchPreferenceStyle));
     }
 
     /**
@@ -136,7 +138,7 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        View switchView = holder.findViewById(R.id.switchWidget);
+        View switchView = holder.findViewById(AndroidResources.ANDROID_R_SWITCH_WIDGET);
         syncSwitchView(switchView);
         syncSummaryView(holder);
     }
diff --git a/v17/leanback/api/23.1.1.txt b/v17/leanback/api/23.1.1.txt
new file mode 100644
index 0000000..962367d
--- /dev/null
+++ b/v17/leanback/api/23.1.1.txt
@@ -0,0 +1,1796 @@
+package android.support.v17.leanback.app {
+
+  public final class BackgroundManager {
+    method public void attach(android.view.Window);
+    method public final int getColor();
+    method public android.graphics.drawable.Drawable getDefaultDimLayer();
+    method public android.graphics.drawable.Drawable getDimLayer();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
+    method public boolean isAttached();
+    method public void release();
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColor(int);
+    method public void setDimLayer(android.graphics.drawable.Drawable);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setThemeDrawableResourceId(int);
+  }
+
+   abstract class BaseRowFragment extends android.app.Fragment {
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public BrowseFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method protected java.lang.Object createEntranceTransition();
+    method public void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public int getHeadersState();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void onSaveInstanceState(android.os.Bundle);
+    method public void onStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static class BrowseFragment.BrowseTransitionListener {
+    ctor public BrowseFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public BrowseSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method protected java.lang.Object createEntranceTransition();
+    method public void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public int getHeadersState();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void onSaveInstanceState(android.os.Bundle);
+    method public void onStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static class BrowseSupportFragment.BrowseTransitionListener {
+    ctor public BrowseSupportFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public DetailsFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method public void onStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public DetailsSupportFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method public void onStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public class ErrorFragment extends android.app.Fragment {
+    ctor public ErrorFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public java.lang.String getTitle();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+    method public void setTitle(java.lang.String);
+  }
+
+  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
+    ctor public ErrorSupportFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public java.lang.String getTitle();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+    method public void setTitle(java.lang.String);
+  }
+
+  public class GuidedStepFragment extends android.app.Fragment {
+    ctor public GuidedStepFragment();
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method protected int getContainerIdForBackground();
+    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getUiStyle();
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected android.app.Fragment onProvideBackgroundFragment();
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+  }
+
+  public static class GuidedStepFragment.GuidedStepBackgroundFragment extends android.app.Fragment {
+    ctor public GuidedStepFragment.GuidedStepBackgroundFragment();
+    method protected void onProvideFragmentTransitions();
+  }
+
+  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
+    ctor public GuidedStepSupportFragment();
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method protected int getContainerIdForBackground();
+    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getUiStyle();
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected android.support.v4.app.Fragment onProvideBackgroundSupportFragment();
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+  }
+
+  public static class GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment extends android.support.v4.app.Fragment {
+    ctor public GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment();
+    method protected void onProvideFragmentTransitions();
+  }
+
+  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
+    ctor public HeadersFragment();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
+  }
+
+   static abstract interface HeadersFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked();
+  }
+
+   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
+    ctor public HeadersSupportFragment();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
+  }
+
+   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked();
+  }
+
+   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
+    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
+    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
+    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
+    method public void detach();
+    method public int getCurrentPosition();
+    method public int getCurrentSpeedId();
+    method public android.graphics.drawable.Drawable getMediaArt();
+    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
+    method public int getMediaDuration();
+    method public java.lang.CharSequence getMediaSubtitle();
+    method public java.lang.CharSequence getMediaTitle();
+    method public long getSupportedActions();
+    method public boolean hasValidMedia();
+    method public boolean isMediaPlaying();
+    method protected void pausePlayback();
+    method protected void skipToNext();
+    method protected void skipToPrevious();
+    method protected void startPlayback(int);
+  }
+
+  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackControlGlue(android.content.Context, int[]);
+    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
+    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
+    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
+    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
+    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    method public void enableProgressUpdating(boolean);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
+    method public abstract android.graphics.drawable.Drawable getMediaArt();
+    method public abstract int getMediaDuration();
+    method public abstract java.lang.CharSequence getMediaSubtitle();
+    method public abstract java.lang.CharSequence getMediaTitle();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public int[] getRewindSpeeds();
+    method public abstract long getSupportedActions();
+    method public int getUpdatePeriod();
+    method public abstract boolean hasValidMedia();
+    method public boolean isFadingEnabled();
+    method public abstract boolean isMediaPlaying();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method protected void onStateChanged();
+    method protected abstract void pausePlayback();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setFadingEnabled(boolean);
+    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method protected abstract void skipToNext();
+    method protected abstract void skipToPrevious();
+    method protected abstract void startPlayback(int);
+    method public void updateProgress();
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public abstract class PlaybackControlSupportGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackControlSupportGlue(android.content.Context, int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, int[], int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[], int[]);
+    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
+    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    method public void enableProgressUpdating(boolean);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment getFragment();
+    method public abstract android.graphics.drawable.Drawable getMediaArt();
+    method public abstract int getMediaDuration();
+    method public abstract java.lang.CharSequence getMediaSubtitle();
+    method public abstract java.lang.CharSequence getMediaTitle();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public int[] getRewindSpeeds();
+    method public abstract long getSupportedActions();
+    method public int getUpdatePeriod();
+    method public abstract boolean hasValidMedia();
+    method public boolean isFadingEnabled();
+    method public abstract boolean isMediaPlaying();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method protected void onStateChanged();
+    method protected abstract void pausePlayback();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setFadingEnabled(boolean);
+    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method protected abstract void skipToNext();
+    method protected abstract void skipToPrevious();
+    method protected abstract void startPlayback(int);
+    method public void updateProgress();
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
+    ctor public PlaybackOverlayFragment();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void onDestroyView();
+    method public void onResume();
+    method public void setBackgroundType(int);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
+    method public abstract boolean handleInputEvent(android.view.InputEvent);
+  }
+
+  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
+    ctor public PlaybackOverlaySupportFragment();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void onDestroyView();
+    method public void onResume();
+    method public void setBackgroundType(int);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
+    method public abstract boolean handleInputEvent(android.view.InputEvent);
+  }
+
+  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
+    ctor public RowsFragment();
+    method public void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+  }
+
+  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
+    ctor public RowsSupportFragment();
+    method public void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+  }
+
+  public class SearchFragment extends android.app.Fragment {
+    ctor public SearchFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class SearchSupportFragment extends android.support.v4.app.Fragment {
+    ctor public SearchSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchSupportFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class VerticalGridFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public VerticalGridFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public void onDestroyView();
+    method public void onStart();
+    method public void onViewCreated(android.view.View, android.os.Bundle);
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public VerticalGridSupportFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public void onDestroyView();
+    method public void onStart();
+    method public void onViewCreated(android.view.View, android.os.Bundle);
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+}
+
+package android.support.v17.leanback.database {
+
+  public abstract class CursorMapper {
+    ctor public CursorMapper();
+    method protected abstract java.lang.Object bind(android.database.Cursor);
+    method protected abstract void bindColumns(android.database.Cursor);
+    method public java.lang.Object convert(android.database.Cursor);
+  }
+
+}
+
+package android.support.v17.leanback.graphics {
+
+  public final class ColorFilterCache {
+    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
+    method public android.graphics.ColorFilter getFilterForLevel(float);
+  }
+
+  public final class ColorFilterDimmer {
+    method public void applyFilterToView(android.view.View);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
+    method public android.graphics.ColorFilter getColorFilter();
+    method public android.graphics.Paint getPaint();
+    method public void setActiveLevel(float);
+  }
+
+  public final class ColorOverlayDimmer {
+    method public int applyToColor(int);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
+    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
+    method public int getAlpha();
+    method public float getAlphaFloat();
+    method public android.graphics.Paint getPaint();
+    method public boolean needsDraw();
+    method public void setActiveLevel(float);
+  }
+
+}
+
+package android.support.v17.leanback.system {
+
+  public class Settings {
+    method public boolean getBoolean(java.lang.String);
+    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
+    method public void setBoolean(java.lang.String, boolean);
+    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
+  }
+
+}
+
+package android.support.v17.leanback.widget {
+
+  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public AbstractDetailsDescriptionPresenter();
+    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getBody();
+    method public android.widget.TextView getSubtitle();
+    method public android.widget.TextView getTitle();
+  }
+
+  public class Action {
+    ctor public Action(long);
+    ctor public Action(long, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
+    method public final void addKeyCode(int);
+    method public final android.graphics.drawable.Drawable getIcon();
+    method public final long getId();
+    method public final java.lang.CharSequence getLabel1();
+    method public final java.lang.CharSequence getLabel2();
+    method public final void removeKeyCode(int);
+    method public final boolean respondsToKeyCode(int);
+    method public final void setIcon(android.graphics.drawable.Drawable);
+    method public final void setId(long);
+    method public final void setLabel1(java.lang.CharSequence);
+    method public final void setLabel2(java.lang.CharSequence);
+  }
+
+  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ArrayObjectAdapter();
+    method public void add(java.lang.Object);
+    method public void add(int, java.lang.Object);
+    method public void addAll(int, java.util.Collection);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public boolean remove(java.lang.Object);
+    method public int removeItems(int, int);
+    method public void replace(int, java.lang.Object);
+    method public int size();
+    method public java.util.List<E> unmodifiableList();
+  }
+
+  public class BaseCardView extends android.widget.FrameLayout {
+    ctor public BaseCardView(android.content.Context);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
+    method public int getCardType();
+    method public int getExtraVisibility();
+    method public int getInfoVisibility();
+    method public boolean isSelectedAnimationDelayed();
+    method public void setCardType(int);
+    method public void setExtraVisibility(int);
+    method public void setInfoVisibility(int);
+    method public void setSelectedAnimationDelayed(boolean);
+    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
+    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
+    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
+    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
+    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
+  }
+
+  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView.LayoutParams(int, int);
+    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
+    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
+    field public static final int VIEW_TYPE_INFO = 1; // 0x1
+    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
+    field public int viewType;
+  }
+
+  public class BrowseFrameLayout extends android.widget.FrameLayout {
+    ctor public BrowseFrameLayout(android.content.Context);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
+    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
+    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
+    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
+    method public abstract android.view.View onFocusSearch(android.view.View, int);
+  }
+
+  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ClassPresenterSelector();
+    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ControlButtonPresenterSelector();
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
+    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
+  }
+
+  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public CursorObjectAdapter();
+    method public void changeCursor(android.database.Cursor);
+    method public void close();
+    method public java.lang.Object get(int);
+    method public final android.database.Cursor getCursor();
+    method public final android.support.v17.leanback.database.CursorMapper getMapper();
+    method protected final void invalidateCache(int);
+    method protected final void invalidateCache(int, int);
+    method public boolean isClosed();
+    method protected void onCursorChanged();
+    method protected void onMapperChanged();
+    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
+    method public int size();
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+  }
+
+  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DetailsOverviewLogoPresenter();
+    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+  }
+
+  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
+  }
+
+  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
+    ctor public DetailsOverviewRow(java.lang.Object);
+    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
+    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public boolean isImageScaleUpAllowed();
+    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
+    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setImageScaleUpAllowed(boolean);
+    method public final void setItem(java.lang.Object);
+  }
+
+  public static class DetailsOverviewRow.Listener {
+    ctor public DetailsOverviewRow.Listener();
+    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+  }
+
+  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public boolean isStyleLarge();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setStyleLarge(boolean);
+  }
+
+  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
+  }
+
+  public abstract interface FacetProvider {
+    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
+  }
+
+  public abstract interface FacetProviderAdapter {
+    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+  }
+
+  public abstract interface FocusHighlight {
+    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
+    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
+    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
+    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
+    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
+  }
+
+  public class FocusHighlightHelper {
+    ctor public FocusHighlightHelper();
+    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+  }
+
+  public abstract interface FragmentAnimationProvider {
+    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public final int getActionsBackgroundColor();
+    method public final int getAlignmentMode();
+    method public final int getBackgroundColor();
+    method public final int getInitialState();
+    method protected int getLayoutResourceId();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public final boolean isParticipatingEntranceTransition();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    method public final void setActionsBackgroundColor(int);
+    method public final void setAlignmentMode(int);
+    method public final void setBackgroundColor(int);
+    method public final void setInitialState(int);
+    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setParticipatingEntranceTransition(boolean);
+    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
+    field public static final int ALIGN_MODE_START = 0; // 0x0
+    field public static final int STATE_FULL = 1; // 0x1
+    field public static final int STATE_HALF = 0; // 0x0
+    field public static final int STATE_SMALL = 2; // 0x2
+    field protected int mInitialState;
+  }
+
+  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
+    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
+    method public final android.view.ViewGroup getActionsRow();
+    method public final android.view.ViewGroup getDetailsDescriptionFrame();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
+    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
+    method public final android.view.ViewGroup getOverviewView();
+    method public final int getState();
+    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
+  }
+
+  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewSharedElementHelper();
+    method public boolean getAutoStartSharedElementTransition();
+    method public void setAutoStartSharedElementTransition(boolean);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public void startPostponedEnterTransition();
+  }
+
+  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidanceStylist();
+    method public android.widget.TextView getBreadcrumbView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideLayoutId();
+  }
+
+  public static class GuidanceStylist.Guidance {
+    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
+    method public java.lang.String getBreadcrumb();
+    method public java.lang.String getDescription();
+    method public android.graphics.drawable.Drawable getIconDrawable();
+    method public java.lang.String getTitle();
+  }
+
+  public class GuidedAction extends android.support.v17.leanback.widget.Action {
+    method public int getCheckSetId();
+    method public java.lang.CharSequence getDescription();
+    method public java.lang.CharSequence getEditTitle();
+    method public android.content.Intent getIntent();
+    method public java.lang.CharSequence getTitle();
+    method public boolean hasMultilineDescription();
+    method public boolean hasNext();
+    method public boolean infoOnly();
+    method public boolean isChecked();
+    method public boolean isEditTitleUsed();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public void setChecked(boolean);
+    method public void setDescription(java.lang.CharSequence);
+    method public void setEditTitle(java.lang.CharSequence);
+    method public void setEnabled(boolean);
+    method public void setTitle(java.lang.CharSequence);
+    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+    field public static final int NO_CHECK_SET = 0; // 0x0
+    field public static final int NO_DRAWABLE = 0; // 0x0
+  }
+
+  public static class GuidedAction.Builder {
+    ctor public GuidedAction.Builder();
+    method public android.support.v17.leanback.widget.GuidedAction build();
+    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder editTitle(java.lang.String);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder editable(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
+  }
+
+  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
+    ctor public GuidedActionEditText(android.content.Context);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidedActionsStylist();
+    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
+    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideItemLayoutId();
+    method public int onProvideLayoutId();
+    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
+    field protected android.view.View mMainView;
+    field protected android.view.View mSelectorView;
+  }
+
+  public static class GuidedActionsStylist.ViewHolder {
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
+    method public android.widget.ImageView getCheckmarkView();
+    method public android.widget.ImageView getChevronView();
+    method public android.view.View getContentView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.EditText getEditableTitleView();
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    field public final android.view.View view;
+  }
+
+  public class HeaderItem {
+    ctor public HeaderItem(long, java.lang.String);
+    ctor public HeaderItem(java.lang.String);
+    method public final long getId();
+    method public final java.lang.String getName();
+  }
+
+  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
+    ctor public HorizontalHoverCardSwitcher();
+    method protected void insertView(android.view.View);
+    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
+  }
+
+  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
+    ctor public ImageCardView(android.content.Context, int);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
+    ctor public ImageCardView(android.content.Context);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
+    method public android.graphics.drawable.Drawable getBadgeImage();
+    method public java.lang.CharSequence getContentText();
+    method public android.graphics.drawable.Drawable getInfoAreaBackground();
+    method public android.graphics.drawable.Drawable getMainImage();
+    method public final android.widget.ImageView getMainImageView();
+    method public java.lang.CharSequence getTitleText();
+    method public void setBadgeImage(android.graphics.drawable.Drawable);
+    method public void setContentText(java.lang.CharSequence);
+    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
+    method public void setInfoAreaBackgroundColor(int);
+    method public void setMainImage(android.graphics.drawable.Drawable);
+    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
+    method public void setMainImageAdjustViewBounds(boolean);
+    method public void setMainImageDimensions(int, int);
+    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
+    method public void setTitleText(java.lang.CharSequence);
+    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
+    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
+    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
+    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
+    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
+  }
+
+  public abstract interface ImeKeyMonitor {
+    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public static abstract interface ImeKeyMonitor.ImeKeyListener {
+    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ItemBridgeAdapter();
+    method public void clear();
+    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+    method public int getItemCount();
+    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
+    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
+    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
+    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
+    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
+  }
+
+  public static class ItemBridgeAdapter.AdapterListener {
+    ctor public ItemBridgeAdapter.AdapterListener();
+    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+  }
+
+  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    method public final java.lang.Object getExtraObject();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.Presenter getPresenter();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
+    method public void setExtraObject(java.lang.Object);
+  }
+
+  public static abstract class ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapter.Wrapper();
+    method public abstract android.view.View createWrapper(android.view.View);
+    method public abstract void wrap(android.view.View, android.view.View);
+  }
+
+  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
+    method public android.view.View createWrapper(android.view.View);
+    method public void wrap(android.view.View, android.view.View);
+  }
+
+  public class ListRow extends android.support.v17.leanback.widget.Row {
+    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+  }
+
+  public final class ListRowHoverCardView extends android.widget.LinearLayout {
+    ctor public ListRowHoverCardView(android.content.Context);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
+    method public final java.lang.CharSequence getDescription();
+    method public final java.lang.CharSequence getTitle();
+    method public final void setDescription(java.lang.CharSequence);
+    method public final void setTitle(java.lang.CharSequence);
+  }
+
+  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public ListRowPresenter();
+    ctor public ListRowPresenter(int);
+    ctor public ListRowPresenter(int, boolean);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public int getExpandedRowHeight();
+    method public final int getFocusZoomFactor();
+    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
+    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
+    method public int getRowHeight();
+    method public final boolean getShadowEnabled();
+    method public final deprecated int getZoomFactor();
+    method public final boolean isFocusDimmerUsed();
+    method public final boolean isKeepChildForeground();
+    method public boolean isUsingDefaultListSelectEffect();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void setExpandedRowHeight(int);
+    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public final void setKeepChildForeground(boolean);
+    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
+    method public void setRowHeight(int);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
+    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
+    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+  }
+
+  public final class ListRowView extends android.widget.LinearLayout {
+    ctor public ListRowView(android.content.Context);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
+  }
+
+  public abstract class ObjectAdapter {
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ObjectAdapter();
+    method public abstract java.lang.Object get(int);
+    method public long getId(int);
+    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public final boolean hasStableIds();
+    method protected final void notifyChanged();
+    method protected final void notifyItemRangeChanged(int, int);
+    method protected final void notifyItemRangeInserted(int, int);
+    method protected final void notifyItemRangeRemoved(int, int);
+    method protected void onHasStableIdsChanged();
+    method protected void onPresenterSelectorChanged();
+    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    method public final void setHasStableIds(boolean);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public abstract int size();
+    method public final void unregisterAllObservers();
+    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    field public static final int NO_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class ObjectAdapter.DataObserver {
+    ctor public ObjectAdapter.DataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public abstract interface OnActionClickedListener {
+    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+  }
+
+  public abstract interface OnChildLaidOutListener {
+    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract deprecated interface OnChildSelectedListener {
+    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+  }
+
+  public abstract interface OnItemViewClickedListener {
+    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public abstract interface OnItemViewSelectedListener {
+    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
+    ctor public PlaybackControlsRow(java.lang.Object);
+    ctor public PlaybackControlsRow();
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
+    method public int getBufferedProgress();
+    method public int getCurrentTime();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
+    method public int getTotalTime();
+    method public void setBufferedProgress(int);
+    method public void setCurrentTime(int);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setTotalTime(int);
+  }
+
+  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MultiAction(int);
+    method public int getActionCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getIndex();
+    method public java.lang.String getLabel(int);
+    method public java.lang.String getSecondaryLabel(int);
+    method public void nextIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+    method public void setLabels(java.lang.String[]);
+    method public void setSecondaryLabels(java.lang.String[]);
+  }
+
+  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
+    field public static int PAUSE;
+    field public static int PLAY;
+  }
+
+  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
+    field public static int ALL;
+    field public static int NONE;
+    field public static int ONE;
+  }
+
+  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
+    field public static int OUTLINE;
+    field public static int SOLID;
+  }
+
+  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
+  }
+
+  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public PlaybackControlsRowPresenter();
+    method public boolean areSecondaryActionsHidden();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+    method public void setSecondaryActionsHidden(boolean);
+    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
+    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
+  }
+
+  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
+  }
+
+  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter();
+    method protected static void cancelAnimationsRecursive(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
+  }
+
+  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter.ViewHolder(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    field public final android.view.View view;
+  }
+
+  public abstract class PresenterSelector {
+    ctor public PresenterSelector();
+    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
+  }
+
+  public abstract class PresenterSwitcher {
+    ctor public PresenterSwitcher();
+    method public void clear();
+    method public final android.view.ViewGroup getParentViewGroup();
+    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
+    method protected abstract void insertView(android.view.View);
+    method protected void onViewSelected(android.view.View);
+    method public void select(java.lang.Object);
+    method protected void showView(android.view.View, boolean);
+    method public void unselect();
+  }
+
+  public class Row {
+    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row();
+    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
+    method public final long getId();
+    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
+    method public final void setId(long);
+  }
+
+  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowHeaderPresenter();
+    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
+    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public boolean isNullItemVisibilityGone();
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setNullItemVisibilityGone(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
+  }
+
+  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
+    method public final float getSelectLevel();
+  }
+
+  public final class RowHeaderView extends android.widget.TextView {
+    ctor public RowHeaderView(android.content.Context);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowPresenter();
+    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
+    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final boolean getSelectEffectEnabled();
+    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final int getSyncActivatePolicy();
+    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected boolean isClippingChildren();
+    method public boolean isUsingDefaultSelectEffect();
+    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
+    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setSelectEffectEnabled(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
+    method public final void setSyncActivatePolicy(int);
+    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
+    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
+  }
+
+  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowPresenter.ViewHolder(android.view.View);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
+    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.view.View.OnKeyListener getOnKeyListener();
+    method public final android.support.v17.leanback.widget.Row getRow();
+    method public final float getSelectLevel();
+    method public final boolean isExpanded();
+    method public final boolean isSelected();
+    method public final void setActivated(boolean);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setOnKeyListener(android.view.View.OnKeyListener);
+    method public final void syncActivatedStatus(android.view.View);
+    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
+  }
+
+  public class SearchBar extends android.widget.RelativeLayout {
+    ctor public SearchBar(android.content.Context);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public java.lang.CharSequence getHint();
+    method public java.lang.String getTitle();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
+    method public void setSearchQuery(java.lang.String);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+    method public void stopRecognition();
+  }
+
+  public static abstract interface SearchBar.SearchBarListener {
+    method public abstract void onKeyboardDismiss(java.lang.String);
+    method public abstract void onSearchQueryChange(java.lang.String);
+    method public abstract void onSearchQuerySubmit(java.lang.String);
+  }
+
+  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
+    ctor public SearchEditText(android.content.Context);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
+  }
+
+  public static abstract interface SearchEditText.OnKeyboardDismissListener {
+    method public abstract void onKeyboardDismiss();
+  }
+
+  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
+    ctor public SearchOrbView(android.content.Context);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableOrbColorAnimation(boolean);
+    method public int getOrbColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
+    method public android.graphics.drawable.Drawable getOrbIcon();
+    method public void onClick(android.view.View);
+    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
+    method public void setOrbColor(int);
+    method public deprecated void setOrbColor(int, int);
+    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setOrbIcon(android.graphics.drawable.Drawable);
+  }
+
+  public static class SearchOrbView.Colors {
+    ctor public SearchOrbView.Colors(int);
+    ctor public SearchOrbView.Colors(int, int);
+    ctor public SearchOrbView.Colors(int, int, int);
+    method public static int getBrightColor(int);
+    field public int brightColor;
+    field public int color;
+    field public int iconColor;
+  }
+
+  public class ShadowOverlayContainer extends android.widget.FrameLayout {
+    ctor public ShadowOverlayContainer(android.content.Context);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
+    method public int getShadowType();
+    method public android.view.View getWrappedView();
+    method public deprecated void initialize(boolean, boolean);
+    method public deprecated void initialize(boolean, boolean, boolean);
+    method public static void prepareParentForShadow(android.view.ViewGroup);
+    method public void setOverlayColor(int);
+    method public void setShadowFocusLevel(float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsShadow();
+    method public void useDynamicShadow();
+    method public void useDynamicShadow(float, float);
+    method public void useStaticShadow();
+    method public void wrap(android.view.View);
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public final class ShadowOverlayHelper {
+    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
+    method public int getShadowType();
+    method public boolean needsOverlay();
+    method public boolean needsRoundedCorner();
+    method public boolean needsWrapper();
+    method public void onViewCreated(android.view.View);
+    method public void prepareParentForShadow(android.view.ViewGroup);
+    method public static void setNoneWrapperOverlayColor(android.view.View, int);
+    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
+    method public void setOverlayColor(android.view.View, int);
+    method public void setShadowFocusLevel(android.view.View, float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsForeground();
+    method public static boolean supportsRoundedCorner();
+    method public static boolean supportsShadow();
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public static final class ShadowOverlayHelper.Builder {
+    ctor public ShadowOverlayHelper.Builder();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
+  }
+
+  public static final class ShadowOverlayHelper.Options {
+    ctor public ShadowOverlayHelper.Options();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
+    method public final float getDynamicShadowFocusedZ();
+    method public final float getDynamicShadowUnfocusedZ();
+    method public final int getRoundedCornerRadius();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
+    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
+  }
+
+  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public SparseArrayObjectAdapter();
+    method public void clear(int);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public int indexOf(int);
+    method public java.lang.Object lookup(int);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public void set(int, java.lang.Object);
+    method public int size();
+  }
+
+  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
+    ctor public SpeechOrbView(android.content.Context);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void setSoundLevel(int);
+    method public void showListening();
+    method public void showNotListening();
+  }
+
+  public abstract interface SpeechRecognitionCallback {
+    method public abstract void recognizeSpeech();
+  }
+
+   class StreamingTextView extends android.widget.EditText {
+    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
+    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
+    method public static boolean isLayoutRtl(android.view.View);
+    method public void reset();
+    method public void setFinalRecognizedText(java.lang.CharSequence);
+    method public void updateRecognizedText(java.lang.String, java.lang.String);
+    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
+  }
+
+  public class TitleHelper {
+    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public android.view.ViewGroup getSceneRoot();
+    method public android.support.v17.leanback.widget.TitleView getTitleView();
+    method public void showTitle(boolean);
+  }
+
+  public class TitleView extends android.widget.FrameLayout {
+    ctor public TitleView(android.content.Context);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableAnimation(boolean);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.String);
+  }
+
+  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public VerticalGridPresenter();
+    ctor public VerticalGridPresenter(int);
+    ctor public VerticalGridPresenter(int, boolean);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public final int getFocusZoomFactor();
+    method public final boolean getKeepChildForeground();
+    method public int getNumberOfColumns();
+    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public final boolean getShadowEnabled();
+    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
+    method public final boolean isFocusDimmerUsed();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
+    method public final void setKeepChildForeground(boolean);
+    method public void setNumberOfColumns(int);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
+    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
+  }
+
+  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+}
+
diff --git a/v17/leanback/api/current.txt b/v17/leanback/api/current.txt
index a4decd8..d255a78 100644
--- a/v17/leanback/api/current.txt
+++ b/v17/leanback/api/current.txt
@@ -19,6 +19,7 @@
    abstract class BaseRowFragment extends android.app.Fragment {
     method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
     method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
     method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
     method public void setSelectedPosition(int);
@@ -28,6 +29,7 @@
    abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
     method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
     method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
     method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
     method public void setSelectedPosition(int);
@@ -41,9 +43,13 @@
     method public void enableRowScaling(boolean);
     method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public int getBrandColor();
+    method public android.support.v17.leanback.app.HeadersFragment getHeadersFragment();
     method public int getHeadersState();
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
     method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method public int getSelectedPosition();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
     method public final boolean isHeadersTransitionOnBackEnabled();
     method public boolean isInHeadersTransition();
     method public boolean isShowingHeaders();
@@ -63,6 +69,7 @@
     method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
     method public void setSelectedPosition(int);
     method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.PresenterViewHolderTask);
     method public void startHeadersTransition(boolean);
     field public static final int HEADERS_DISABLED = 3; // 0x3
     field public static final int HEADERS_ENABLED = 1; // 0x1
@@ -83,8 +90,12 @@
     method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public int getBrandColor();
     method public int getHeadersState();
+    method public android.support.v17.leanback.app.HeadersSupportFragment getHeadersSupportFragment();
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
     method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method public int getSelectedPosition();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
     method public final boolean isHeadersTransitionOnBackEnabled();
     method public boolean isInHeadersTransition();
     method public boolean isShowingHeaders();
@@ -104,6 +115,7 @@
     method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
     method public void setSelectedPosition(int);
     method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.PresenterViewHolderTask);
     method public void startHeadersTransition(boolean);
     field public static final int HEADERS_DISABLED = 3; // 0x3
     field public static final int HEADERS_ENABLED = 1; // 0x1
@@ -121,6 +133,7 @@
     method protected java.lang.Object createEntranceTransition();
     method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
     method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
     method protected void onEntranceTransitionEnd();
     method protected void onEntranceTransitionPrepare();
@@ -143,6 +156,7 @@
     method protected java.lang.Object createEntranceTransition();
     method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
     method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
     method protected void onEntranceTransitionEnd();
     method protected void onEntranceTransitionPrepare();
@@ -205,6 +219,8 @@
     method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
     method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
     method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public void collapseSubActions();
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
     method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
     method public int findActionPositionById(long);
     method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
@@ -224,6 +240,7 @@
     method public int getSelectedActionPosition();
     method public int getSelectedButtonActionPosition();
     method public int getUiStyle();
+    method public boolean isSubActionsExpanded();
     method public static boolean isUiStyleDefault(java.lang.String);
     method public static boolean isUiStyleEntrance(java.lang.String);
     method public void notifyActionChanged(int);
@@ -242,6 +259,7 @@
     method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
     method protected void onProvideFragmentTransitions();
     method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
     method public void popBackStackToGuidedStepFragment(java.lang.Class, int);
     method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
     method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
@@ -259,6 +277,8 @@
     method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
     method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
     method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public void collapseSubActions();
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
     method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
     method public int findActionPositionById(long);
     method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
@@ -278,6 +298,7 @@
     method public int getSelectedActionPosition();
     method public int getSelectedButtonActionPosition();
     method public int getUiStyle();
+    method public boolean isSubActionsExpanded();
     method public static boolean isUiStyleDefault(java.lang.String);
     method public static boolean isUiStyleEntrance(java.lang.String);
     method public void notifyActionChanged(int);
@@ -296,6 +317,7 @@
     method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
     method protected void onProvideFragmentTransitions();
     method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
     method public void popBackStackToGuidedStepSupportFragment(java.lang.Class, int);
     method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
     method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
@@ -529,9 +551,12 @@
     method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
     method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
     method public void setExpand(boolean);
     method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
     method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.PresenterViewHolderTask);
   }
 
   public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
@@ -540,9 +565,12 @@
     method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
     method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
     method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
     method public void setExpand(boolean);
     method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
     method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.PresenterViewHolderTask);
   }
 
   public class SearchFragment extends android.app.Fragment {
@@ -827,6 +855,7 @@
     ctor public DetailsOverviewLogoPresenter();
     method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
     method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.view.View onCreateView(android.view.ViewGroup);
     method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
     method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
     method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
@@ -834,6 +863,10 @@
 
   public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
     ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter getParentPresenter();
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder getParentViewHolder();
+    method public boolean isSizeFromDrawableIntrinsic();
+    method public void setSizeFromDrawableIntrinsic(boolean);
     field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
     field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
   }
@@ -1003,9 +1036,11 @@
     method public java.lang.CharSequence getEditTitle();
     method public int getInputType();
     method public android.content.Intent getIntent();
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getSubActions();
     method public java.lang.CharSequence getTitle();
     method public boolean hasMultilineDescription();
     method public boolean hasNext();
+    method public boolean hasSubActions();
     method public boolean infoOnly();
     method public boolean isChecked();
     method public boolean isDescriptionEditable();
@@ -1019,6 +1054,7 @@
     method public void setEditTitle(java.lang.CharSequence);
     method public void setEnabled(boolean);
     method public void setFocusable(boolean);
+    method public void setSubActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
     method public void setTitle(java.lang.CharSequence);
     field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
     field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
@@ -1033,37 +1069,43 @@
     field public static final int NO_CHECK_SET = 0; // 0x0
   }
 
-  public static class GuidedAction.Builder {
+  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
     ctor public GuidedAction.Builder();
+    method public android.support.v17.leanback.widget.GuidedAction build();
+  }
+
+  public static abstract class GuidedAction.BuilderBase {
+    ctor public GuidedAction.BuilderBase();
     method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
-    method public final android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructCancel(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructContinue(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructFinish(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructNo(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructOK(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder constructYes(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.CharSequence);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder descriptionEditInputType(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder descriptionEditable(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder descriptionInputType(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editDescription(java.lang.CharSequence);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editInputType(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editTitle(java.lang.CharSequence);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editable(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder focusable(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder inputType(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.CharSequence);
+    method public abstract T build();
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> checkSetId(int);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> checked(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructCancel(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructContinue(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructFinish(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructNo(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructOK(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> constructYes(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> description(java.lang.CharSequence);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> descriptionEditInputType(int);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> descriptionEditable(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> descriptionInputType(int);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> editDescription(java.lang.CharSequence);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> editInputType(int);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> editTitle(java.lang.CharSequence);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> editable(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> enabled(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> focusable(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> hasNext(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> icon(android.graphics.drawable.Drawable);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> iconResourceId(int, android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> id(long);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> infoOnly(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> inputType(int);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> intent(android.content.Intent);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> multilineDescription(boolean);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public android.support.v17.leanback.widget.GuidedAction.BuilderBase<T> title(java.lang.CharSequence);
   }
 
   public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
@@ -1076,8 +1118,13 @@
   public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
     ctor public GuidedActionsStylist();
     method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
+    method public android.support.v17.leanback.widget.GuidedAction getExpandedAction();
     method public int getItemViewType(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.VerticalGridView getSubActionsGridView();
     method public boolean isButtonActions();
+    method public boolean isExpandTransitionSupported();
+    method public boolean isInExpandTransition();
+    method public boolean isSubActionsExpanded();
     method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
     method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
     method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
@@ -1095,14 +1142,19 @@
     method public int onProvideItemLayoutId();
     method public int onProvideItemLayoutId(int);
     method public int onProvideLayoutId();
+    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
     method public void setAsButtonActions();
     method public void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public void setExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
     method protected void setupImeOptions(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
     field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
   }
 
-  public static class GuidedActionsStylist.ViewHolder {
+  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
     ctor public GuidedActionsStylist.ViewHolder(android.view.View);
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View, boolean);
+    method public android.support.v17.leanback.widget.GuidedAction getAction();
     method public android.widget.ImageView getCheckmarkView();
     method public android.widget.ImageView getChevronView();
     method public android.view.View getContentView();
@@ -1114,7 +1166,7 @@
     method public android.widget.TextView getTitleView();
     method public boolean isInEditing();
     method public boolean isInEditingDescription();
-    field public final android.view.View view;
+    method public boolean isSubAction();
   }
 
   public class HeaderItem {
@@ -1316,7 +1368,19 @@
     ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
     method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
     method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
     method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+    method public int getSelectedPosition();
+  }
+
+  public class ListRowPresenterSelectItemViewHolderTask extends android.support.v17.leanback.widget.PresenterViewHolderTask {
+    ctor public ListRowPresenterSelectItemViewHolderTask(int);
+    method public int getItemPosition();
+    method public android.support.v17.leanback.widget.PresenterViewHolderTask getItemTask();
+    method public boolean isSmooth();
+    method public void setItemPosition(int);
+    method public void setItemTask(android.support.v17.leanback.widget.PresenterViewHolderTask);
+    method public void setSmooth(boolean);
   }
 
   public final class ListRowView extends android.widget.LinearLayout {
@@ -1548,6 +1612,11 @@
     method public void unselect();
   }
 
+  public abstract class PresenterViewHolderTask {
+    ctor public PresenterViewHolderTask();
+    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
   public class Row {
     ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
     ctor public Row(android.support.v17.leanback.widget.HeaderItem);
@@ -1873,5 +1942,74 @@
     method public void setNumColumns(int);
   }
 
+  public abstract interface ViewHolderTask {
+    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
+package android.support.v17.leanback.widget.picker {
+
+  public class DatePicker extends android.support.v17.leanback.widget.picker.Picker {
+    ctor public DatePicker(android.content.Context, android.util.AttributeSet, int);
+    method public java.util.Calendar getMaxDate();
+    method public java.util.Calendar getMinDate();
+    method public void setMaxDate(long);
+    method public void setMinDate(long);
+    method public void updateDate(int, int, int, boolean);
+  }
+
+  public class Picker extends android.widget.FrameLayout {
+    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
+    method public void addPickerValueListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public int getActiveColumn();
+    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
+    method public int getColumnsCount();
+    method protected int getPickerId();
+    method protected int getPickerItemHeightPixels();
+    method protected int getPickerItemLayoutId();
+    method protected int getPickerItemTextViewId();
+    method protected int getPickerSeparatorLayoutId();
+    method protected int getRootLayoutId();
+    method protected java.lang.String getSeparator();
+    method public float getVisiblePickerItems();
+    method public float getVisiblePickerItemsInExpand();
+    method public boolean isExpanded();
+    method public boolean isToggleExpandOnClick();
+    method public void onColumnValueChange(int, int);
+    method public void removePickerValueListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public void setActiveColumn(int);
+    method public void setColumns(java.util.ArrayList<android.support.v17.leanback.widget.picker.PickerColumn>);
+    method public void setExpanded(boolean);
+    method public void setToggleExpandOnClick(boolean);
+    method public void setVisiblePickerItems(float);
+    method public void setVisiblePickerItemsInExpand(float);
+    method public void updateAdapter(int);
+    method public void updateValue(int, int, boolean);
+  }
+
+  public static abstract interface Picker.PickerValueListener {
+    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
+  }
+
+  public class PickerColumn implements android.os.Parcelable {
+    ctor public PickerColumn();
+    ctor public PickerColumn(android.os.Parcel);
+    method public int describeContents();
+    method public int getCurrentValue();
+    method public int getItemsCount();
+    method public int getMaxValue();
+    method public int getMinValue();
+    method public java.lang.String getValueLabelAt(int);
+    method public java.lang.String getValueLabelFormat();
+    method public boolean setCurrentValue(int);
+    method public boolean setMaxValue(int);
+    method public boolean setMinValue(int);
+    method public void setValueLabelFormat(java.lang.String);
+    method public void setValueStaticLabels(java.lang.String[]);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static android.os.Parcelable.Creator<android.support.v17.leanback.widget.picker.PickerColumn> CREATOR;
+  }
+
 }
 
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
index 1762c15..e9f8505 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
@@ -18,6 +18,7 @@
 import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.animation.TimeInterpolator;
+import android.graphics.Rect;
 import android.transition.Fade;
 import android.transition.Transition;
 import android.transition.TransitionValues;
@@ -38,54 +39,101 @@
     private static final String PROPNAME_SCREEN_POSITION =
             "android:fadeAndShortSlideTransition:screenPosition";
 
-    private CalculateSlide mSlideCalculator = sCalculateEnd;
+    private CalculateSlide mSlideCalculator;
     private Visibility mFade = new Fade();
+    private float mDistance = -1;
 
-    private interface CalculateSlide {
+    private static abstract class CalculateSlide {
 
-        /** Returns the translation value for view when it goes out of the scene */
-        float getGoneX(ViewGroup sceneRoot, View view, int[] position);
+        /** Returns the translation X value for view when it goes out of the scene */
+        float getGoneX(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
+            return view.getTranslationX();
+        }
+
+        /** Returns the translation Y value for view when it goes out of the scene */
+        float getGoneY(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
+            return view.getTranslationY();
+        }
     }
 
-    private static final CalculateSlide sCalculateStart = new CalculateSlide() {
+    float getHorizontalDistance(ViewGroup sceneRoot) {
+        return mDistance >= 0 ? mDistance : (sceneRoot.getWidth() / 4);
+    }
+
+    float getVerticalDistance(ViewGroup sceneRoot) {
+        return mDistance >= 0 ? mDistance : (sceneRoot.getHeight() / 4);
+    }
+
+    final static CalculateSlide sCalculateStart = new CalculateSlide() {
         @Override
-        public float getGoneX(ViewGroup sceneRoot, View view, int[] position) {
+        public float getGoneX(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
             final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
             final float x;
             if (isRtl) {
-                x = view.getTranslationX() + sceneRoot.getWidth() / 4;
+                x = view.getTranslationX() + t.getHorizontalDistance(sceneRoot);
             } else {
-                x = view.getTranslationX() - sceneRoot.getWidth() / 4;
+                x = view.getTranslationX() - t.getHorizontalDistance(sceneRoot);
             }
             return x;
         }
     };
 
-    private static final CalculateSlide sCalculateEnd = new CalculateSlide() {
+    final static CalculateSlide sCalculateEnd = new CalculateSlide() {
         @Override
-        public float getGoneX(ViewGroup sceneRoot, View view, int[] position) {
+        public float getGoneX(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
             final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
             final float x;
             if (isRtl) {
-                x = view.getTranslationX() - sceneRoot.getWidth() / 4;
+                x = view.getTranslationX() - t.getHorizontalDistance(sceneRoot);
             } else {
-                x = view.getTranslationX() + sceneRoot.getWidth() / 4;
+                x = view.getTranslationX() + t.getHorizontalDistance(sceneRoot);
             }
             return x;
         }
     };
 
-    private static final CalculateSlide sCalculateBoth = new CalculateSlide() {
-
+    final static CalculateSlide sCalculateStartEnd = new CalculateSlide() {
         @Override
-        public float getGoneX(ViewGroup sceneRoot, View view, int[] position) {
+        public float getGoneX(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
             final int viewCenter = position[0] + view.getWidth() / 2;
             sceneRoot.getLocationOnScreen(position);
-            final int sceneRootCenter = position[0] + sceneRoot.getWidth() / 2;
+            Rect center = t.getEpicenter();
+            final int sceneRootCenter = center == null ? (position[0] + sceneRoot.getWidth() / 2)
+                    : center.centerX();
             if (viewCenter < sceneRootCenter) {
-                return view.getTranslationX() - sceneRoot.getWidth() / 2;
+                return view.getTranslationX() - t.getHorizontalDistance(sceneRoot);
             } else {
-                return view.getTranslationX() + sceneRoot.getWidth() / 2;
+                return view.getTranslationX() + t.getHorizontalDistance(sceneRoot);
+            }
+        }
+    };
+
+    final static CalculateSlide sCalculateBottom = new CalculateSlide() {
+        @Override
+        public float getGoneY(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
+            return view.getTranslationY() + t.getVerticalDistance(sceneRoot);
+        }
+    };
+
+    final static CalculateSlide sCalculateTop = new CalculateSlide() {
+        @Override
+        public float getGoneY(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
+            return view.getTranslationY() - t.getVerticalDistance(sceneRoot);
+        }
+    };
+
+    final CalculateSlide sCalculateTopBottom = new CalculateSlide() {
+        @Override
+        public float getGoneY(FadeAndShortSlide t, ViewGroup sceneRoot, View view, int[] position) {
+            final int viewCenter = position[1] + view.getHeight() / 2;
+            sceneRoot.getLocationOnScreen(position);
+            Rect center = getEpicenter();
+            final int sceneRootCenter = center == null ? (position[1] + sceneRoot.getHeight() / 2)
+                    : center.centerY();
+            if (viewCenter < sceneRootCenter) {
+                return view.getTranslationY() - t.getVerticalDistance(sceneRoot);
+            } else {
+                return view.getTranslationY() + t.getVerticalDistance(sceneRoot);
             }
         }
     };
@@ -134,7 +182,16 @@
                 mSlideCalculator = sCalculateEnd;
                 break;
             case Gravity.START | Gravity.END:
-                mSlideCalculator = sCalculateBoth;
+                mSlideCalculator = sCalculateStartEnd;
+                break;
+            case Gravity.TOP:
+                mSlideCalculator = sCalculateTop;
+                break;
+            case Gravity.BOTTOM:
+                mSlideCalculator = sCalculateBottom;
+                break;
+            case Gravity.TOP | Gravity.BOTTOM:
+                mSlideCalculator = sCalculateTopBottom;
                 break;
             default:
                 throw new IllegalArgumentException("Invalid slide direction");
@@ -156,12 +213,21 @@
         }
         int[] position = (int[]) endValues.values.get(PROPNAME_SCREEN_POSITION);
         int left = position[0];
+        int top = position[1];
         float endX = view.getTranslationX();
-        float startX = mSlideCalculator.getGoneX(sceneRoot, view, position);
+        float startX = mSlideCalculator.getGoneX(this, sceneRoot, view, position);
+        float endY = view.getTranslationY();
+        float startY = mSlideCalculator.getGoneY(this, sceneRoot, view, position);
         final Animator slideAnimator = TranslationAnimationCreator.createAnimation(view, endValues,
-                left, startX, endX, sDecelerate, this);
+                left, top, startX, startY, endX, endY, sDecelerate, this);
+        final Animator fadeAnimator = mFade.onAppear(sceneRoot, view, startValues, endValues);
+        if (slideAnimator == null) {
+            return fadeAnimator;
+        } else if (fadeAnimator == null) {
+            return slideAnimator;
+        }
         final AnimatorSet set = new AnimatorSet();
-        set.play(slideAnimator).with(mFade.onAppear(sceneRoot, view, startValues, endValues));
+        set.play(slideAnimator).with(fadeAnimator);
 
         return set;
     }
@@ -178,12 +244,22 @@
         }
         int[] position = (int[]) startValues.values.get(PROPNAME_SCREEN_POSITION);
         int left = position[0];
+        int top = position[1];
         float startX = view.getTranslationX();
-        float endX = mSlideCalculator.getGoneX(sceneRoot, view, position);
+        float endX = mSlideCalculator.getGoneX(this, sceneRoot, view, position);
+        float startY = view.getTranslationY();
+        float endY = mSlideCalculator.getGoneY(this, sceneRoot, view, position);
         final Animator slideAnimator = TranslationAnimationCreator.createAnimation(view,
-                startValues, left, startX, endX, sDecelerate /* sAccelerate */, this);
+                startValues, left, top, startX, startY, endX, endY, sDecelerate /* sAccelerate */,
+                this);
+        final Animator fadeAnimator = mFade.onDisappear(sceneRoot, view, startValues, endValues);
+        if (slideAnimator == null) {
+            return fadeAnimator;
+        } else if (fadeAnimator == null) {
+            return slideAnimator;
+        }
         final AnimatorSet set = new AnimatorSet();
-        set.play(slideAnimator).with(mFade.onDisappear(sceneRoot, view, startValues, endValues));
+        set.play(slideAnimator).with(fadeAnimator);
 
         return set;
     }
@@ -200,6 +276,23 @@
         return super.removeListener(listener);
     }
 
+    /**
+     * Returns distance to slide.  When negative value is returned, it will use 1/4 of
+     * sceneRoot dimension.
+     */
+    public float getDistance() {
+        return mDistance;
+    }
+
+    /**
+     * Set distance to slide, default value is -1.  when negative value is set, it will use 1/4 of
+     * sceneRoot dimension.
+     * @param distance Pixels to slide.
+     */
+    public void setDistance(float distance) {
+        mDistance = distance;
+    }
+
     @Override
     public Transition clone() {
         FadeAndShortSlide clone = null;
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
index c5a33cb..1206ea8 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.transition.ChangeTransform;
 import android.transition.Transition;
+import android.transition.TransitionManager;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
@@ -86,10 +87,25 @@
         return AnimationUtils.loadInterpolator(context, R.interpolator.fast_out_linear_in);
     }
 
+    public static Object createChangeTransform() {
+        return new ChangeTransform();
+    }
+
     public static Object createFadeAndShortSlide(int edge) {
         return new FadeAndShortSlide(edge);
     }
 
+    public static Object createFadeAndShortSlide(int edge, float distance) {
+        FadeAndShortSlide slide = new FadeAndShortSlide(edge);
+        slide.setDistance(distance);
+        return slide;
+    }
+
+    public static void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject) {
+        Transition transition = (Transition) transitionObject;
+        TransitionManager.beginDelayedTransition(sceneRoot, transition);
+    }
+
     public static void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
         viewGroup.setTransitionGroup(transitionGroup);
     }
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
index 2cc3545..46068da 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
@@ -9,54 +9,60 @@
 import android.graphics.Path;
 import android.transition.Transition;
 import android.transition.TransitionValues;
+import android.transition.Transition.TransitionListener;
 import android.view.View;
 
 /**
- * This class is used by Slide and Explode to create an animator that goes from the start position
- * to the end position. It takes into account the canceled position so that it will not blink out or
- * shift suddenly when the transition is interrupted.
+ * This class is used by Slide and Explode to create an animator that goes from the start
+ * position to the end position. It takes into account the canceled position so that it
+ * will not blink out or shift suddenly when the transition is interrupted.
  * @hide
  */
 class TranslationAnimationCreator {
 
     /**
-     * Creates an animator that can be used for x and/or y translations. When interrupted, it sets a
-     * tag to keep track of the position so that it may be continued from position.
+     * Creates an animator that can be used for x and/or y translations. When interrupted,
+     * it sets a tag to keep track of the position so that it may be continued from position.
      *
      * @param view The view being moved. This may be in the overlay for onDisappear.
      * @param values The values containing the view in the view hierarchy.
      * @param viewPosX The x screen coordinate of view
+     * @param viewPosY The y screen coordinate of view
      * @param startX The start translation x of view
+     * @param startY The start translation y of view
      * @param endX The end translation x of view
+     * @param endY The end translation y of view
      * @param interpolator The interpolator to use with this animator.
-     * @return An animator that moves from (startX, startY) to (endX, endY) unless there was a
-     *         previous interruption, in which case it moves from the current position to (endX,
-     *         endY).
+     * @return An animator that moves from (startX, startY) to (endX, endY) unless there was
+     * a previous interruption, in which case it moves from the current position to (endX, endY).
      */
-    static Animator createAnimation(View view, TransitionValues values, int viewPosX, float startX,
-            float endX, TimeInterpolator interpolator, Transition transition) {
+    static Animator createAnimation(View view, TransitionValues values, int viewPosX, int viewPosY,
+            float startX, float startY, float endX, float endY, TimeInterpolator interpolator,
+            Transition transition) {
         float terminalX = view.getTranslationX();
-        Integer startPosition = (Integer) values.view.getTag(R.id.transitionPosition);
+        float terminalY = view.getTranslationY();
+        int[] startPosition = (int[]) values.view.getTag(R.id.transitionPosition);
         if (startPosition != null) {
-            startX = startPosition - viewPosX + terminalX;
+            startX = startPosition[0] - viewPosX + terminalX;
+            startY = startPosition[1] - viewPosY + terminalY;
         }
-        // Initial position is at translation startX, startY, so position is offset by that
-        // amount
+        // Initial position is at translation startX, startY, so position is offset by that amount
         int startPosX = viewPosX + Math.round(startX - terminalX);
+        int startPosY = viewPosY + Math.round(startY - terminalY);
 
         view.setTranslationX(startX);
-        if (startX == endX) {
+        view.setTranslationY(startY);
+        if (startX == endX && startY == endY) {
             return null;
         }
-        float y = view.getTranslationY();
         Path path = new Path();
-        path.moveTo(startX, y);
-        path.lineTo(endX, y);
-        ObjectAnimator anim =
-                ObjectAnimator.ofFloat(view, View.TRANSLATION_X, View.TRANSLATION_Y, path);
+        path.moveTo(startX, startY);
+        path.lineTo(endX, endY);
+        ObjectAnimator anim = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, View.TRANSLATION_Y,
+                path);
 
-        TransitionPositionListener listener =
-                new TransitionPositionListener(view, values.view, startPosX, terminalX);
+        TransitionPositionListener listener = new TransitionPositionListener(view, values.view,
+                startPosX, startPosY, terminalX, terminalY);
         transition.addListener(listener);
         anim.addListener(listener);
         anim.addPauseListener(listener);
@@ -64,23 +70,28 @@
         return anim;
     }
 
-    private static class TransitionPositionListener extends AnimatorListenerAdapter
-            implements Transition.TransitionListener {
+    private static class TransitionPositionListener extends AnimatorListenerAdapter implements
+            TransitionListener {
 
         private final View mViewInHierarchy;
         private final View mMovingView;
         private final int mStartX;
-        private Integer mTransitionPosition;
+        private final int mStartY;
+        private int[] mTransitionPosition;
         private float mPausedX;
+        private float mPausedY;
         private final float mTerminalX;
+        private final float mTerminalY;
 
-        private TransitionPositionListener(View movingView, View viewInHierarchy, int startX,
-                float terminalX) {
+        private TransitionPositionListener(View movingView, View viewInHierarchy,
+                int startX, int startY, float terminalX, float terminalY) {
             mMovingView = movingView;
             mViewInHierarchy = viewInHierarchy;
             mStartX = startX - Math.round(mMovingView.getTranslationX());
+            mStartY = startY - Math.round(mMovingView.getTranslationY());
             mTerminalX = terminalX;
-            mTransitionPosition = (Integer) mViewInHierarchy.getTag(R.id.transitionPosition);
+            mTerminalY = terminalY;
+            mTransitionPosition = (int[]) mViewInHierarchy.getTag(R.id.transitionPosition);
             if (mTransitionPosition != null) {
                 mViewInHierarchy.setTag(R.id.transitionPosition, null);
             }
@@ -88,41 +99,53 @@
 
         @Override
         public void onAnimationCancel(Animator animation) {
-            mTransitionPosition = Math.round(mStartX + mMovingView.getTranslationX());
+            if (mTransitionPosition == null) {
+                mTransitionPosition = new int[2];
+            }
+            mTransitionPosition[0] = Math.round(mStartX + mMovingView.getTranslationX());
+            mTransitionPosition[1] = Math.round(mStartY + mMovingView.getTranslationY());
             mViewInHierarchy.setTag(R.id.transitionPosition, mTransitionPosition);
         }
 
         @Override
-        public void onAnimationEnd(Animator animator) {}
+        public void onAnimationEnd(Animator animator) {
+        }
 
         @Override
         public void onAnimationPause(Animator animator) {
             mPausedX = mMovingView.getTranslationX();
+            mPausedY = mMovingView.getTranslationY();
             mMovingView.setTranslationX(mTerminalX);
+            mMovingView.setTranslationY(mTerminalY);
         }
 
         @Override
         public void onAnimationResume(Animator animator) {
             mMovingView.setTranslationX(mPausedX);
+            mMovingView.setTranslationY(mPausedY);
         }
 
         @Override
-        public void onTransitionStart(Transition transition) {}
+        public void onTransitionStart(Transition transition) {
+        }
 
         @Override
         public void onTransitionEnd(Transition transition) {
             mMovingView.setTranslationX(mTerminalX);
+            mMovingView.setTranslationY(mTerminalY);
         }
 
         @Override
-        public void onTransitionCancel(Transition transition) {}
+        public void onTransitionCancel(Transition transition) {
+        }
 
         @Override
-        public void onTransitionPause(Transition transition) {}
+        public void onTransitionPause(Transition transition) {
+        }
 
         @Override
-        public void onTransitionResume(Transition transition) {}
+        public void onTransitionResume(Transition transition) {
+        }
     }
 
 }
-
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_show.xml b/v17/leanback/res/animator/lb_guidedactions_selector_show.xml
deleted file mode 100644
index fcfd9fa..0000000
--- a/v17/leanback/res/animator/lb_guidedactions_selector_show.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together">
-
-    <objectAnimator
-        android:duration="@integer/lb_guidedactions_animation_duration"
-        android:propertyName="alpha"
-        android:valueTo="1.0"
-        android:interpolator="@animator/lb_decelerator_2"
-        android:valueType="floatType" />
-
-    <objectAnimator
-        android:duration="@integer/lb_guidedactions_animation_duration"
-        android:propertyName="scaleY"
-        android:interpolator="@animator/lb_decelerator_2"
-        android:valueType="floatType" />
-</set>
diff --git a/v17/leanback/res/drawable-hdpi/lb_action_bg_focused.9.png b/v17/leanback/res/drawable-hdpi/lb_action_bg_focused.9.png
index 3058076..071ec4d 100644
--- a/v17/leanback/res/drawable-hdpi/lb_action_bg_focused.9.png
+++ b/v17/leanback/res/drawable-hdpi/lb_action_bg_focused.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_actions_right_arrow.png b/v17/leanback/res/drawable-hdpi/lb_ic_actions_right_arrow.png
index b4c0abe..332abad 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_actions_right_arrow.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_actions_right_arrow.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_guidedactions_item_chevron.png b/v17/leanback/res/drawable-hdpi/lb_ic_guidedactions_item_chevron.png
index f06c02d..733cb3a 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_guidedactions_item_chevron.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_guidedactions_item_chevron.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_in_app_search.png b/v17/leanback/res/drawable-hdpi/lb_ic_in_app_search.png
index 283b4d8..38d221c 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_in_app_search.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_in_app_search.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_sad_cloud.png b/v17/leanback/res/drawable-hdpi/lb_ic_sad_cloud.png
index f45f1fd..d3d128e 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_sad_cloud.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_sad_cloud.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_search_mic.png b/v17/leanback/res/drawable-hdpi/lb_ic_search_mic.png
index 25617f5..53d3b00 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_search_mic.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_search_mic.png
Binary files differ
diff --git a/v17/leanback/res/drawable-hdpi/lb_ic_search_mic_out.png b/v17/leanback/res/drawable-hdpi/lb_ic_search_mic_out.png
index 2eaecbd..fad401e 100644
--- a/v17/leanback/res/drawable-hdpi/lb_ic_search_mic_out.png
+++ b/v17/leanback/res/drawable-hdpi/lb_ic_search_mic_out.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_action_bg_focused.9.png b/v17/leanback/res/drawable-mdpi/lb_action_bg_focused.9.png
index 823c69c..3726a55 100644
--- a/v17/leanback/res/drawable-mdpi/lb_action_bg_focused.9.png
+++ b/v17/leanback/res/drawable-mdpi/lb_action_bg_focused.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_ic_actions_right_arrow.png b/v17/leanback/res/drawable-mdpi/lb_ic_actions_right_arrow.png
index 8c2c3b9..596be5e 100644
--- a/v17/leanback/res/drawable-mdpi/lb_ic_actions_right_arrow.png
+++ b/v17/leanback/res/drawable-mdpi/lb_ic_actions_right_arrow.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_ic_guidedactions_item_chevron.png b/v17/leanback/res/drawable-mdpi/lb_ic_guidedactions_item_chevron.png
index 149e214..b191f52 100644
--- a/v17/leanback/res/drawable-mdpi/lb_ic_guidedactions_item_chevron.png
+++ b/v17/leanback/res/drawable-mdpi/lb_ic_guidedactions_item_chevron.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_ic_sad_cloud.png b/v17/leanback/res/drawable-mdpi/lb_ic_sad_cloud.png
index b0bed22..1bd71b8 100644
--- a/v17/leanback/res/drawable-mdpi/lb_ic_sad_cloud.png
+++ b/v17/leanback/res/drawable-mdpi/lb_ic_sad_cloud.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_ic_search_mic.png b/v17/leanback/res/drawable-mdpi/lb_ic_search_mic.png
index 75eb962..60b63ad 100644
--- a/v17/leanback/res/drawable-mdpi/lb_ic_search_mic.png
+++ b/v17/leanback/res/drawable-mdpi/lb_ic_search_mic.png
Binary files differ
diff --git a/v17/leanback/res/drawable-mdpi/lb_ic_search_mic_out.png b/v17/leanback/res/drawable-mdpi/lb_ic_search_mic_out.png
index 1682a46..eae8331 100644
--- a/v17/leanback/res/drawable-mdpi/lb_ic_search_mic_out.png
+++ b/v17/leanback/res/drawable-mdpi/lb_ic_search_mic_out.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_card_shadow_focused.9.png b/v17/leanback/res/drawable-xhdpi/lb_card_shadow_focused.9.png
index a63d6b1..6b63574 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_card_shadow_focused.9.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_card_shadow_focused.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_card_shadow_normal.9.png b/v17/leanback/res/drawable-xhdpi/lb_card_shadow_normal.9.png
index 0080b8e..86187e8 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_card_shadow_normal.9.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_card_shadow_normal.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_actions_right_arrow.png b/v17/leanback/res/drawable-xhdpi/lb_ic_actions_right_arrow.png
index d0ca2e2..d6d6f48 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_actions_right_arrow.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_actions_right_arrow.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png b/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png
index d4616cf..fa09957 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png
index 0dfefcc..7cbce5b 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png
index 09e8a3b..5ef4976 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_guidedactions_item_chevron.png b/v17/leanback/res/drawable-xhdpi/lb_ic_guidedactions_item_chevron.png
index 6a65ccf..f7a2ba2 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_guidedactions_item_chevron.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_guidedactions_item_chevron.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png b/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png
index 5aefe6d..dc2b818 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_in_app_search.png b/v17/leanback/res/drawable-xhdpi/lb_ic_in_app_search.png
index 8ef325b..2a665cf 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_in_app_search.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_in_app_search.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_loop_one.png b/v17/leanback/res/drawable-xhdpi/lb_ic_loop_one.png
index e10f5d3..ca1ec77 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_loop_one.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_loop_one.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_more.png b/v17/leanback/res/drawable-xhdpi/lb_ic_more.png
index 662e03c..a9b5e2d 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_more.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_more.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png b/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png
index e55f78d..d3af0a0 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_play.png b/v17/leanback/res/drawable-xhdpi/lb_ic_play.png
index fbd792b..270187b 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_play.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_play.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png b/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png
index c5a0294..4c9f629 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic.png b/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic.png
index 0785c8b..1abb1bb 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic_out.png b/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic_out.png
index 7bbfa23..1733d26 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic_out.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_search_mic_out.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png b/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png
index 5aa850b..a77ebee 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png
index 7349a07..fa29b30 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png b/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png
index 586c4bd..1fdc0d8 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png
index 6e9d472..db5958b 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png
index 6000fa3..3c36132 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png
index 54b9ad4..b5175c3 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png
index 7a9706e..49a4aa9 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_in_app_search_shadow_normal.9.png b/v17/leanback/res/drawable-xhdpi/lb_in_app_search_shadow_normal.9.png
index 5204234..baa6b3d 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_in_app_search_shadow_normal.9.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_in_app_search_shadow_normal.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_text_dot_two_small.png b/v17/leanback/res/drawable-xhdpi/lb_text_dot_two_small.png
index 65f522c..b1644ed 100644
--- a/v17/leanback/res/drawable-xhdpi/lb_text_dot_two_small.png
+++ b/v17/leanback/res/drawable-xhdpi/lb_text_dot_two_small.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_action_bg_focused.9.png b/v17/leanback/res/drawable-xxhdpi/lb_action_bg_focused.9.png
index 1bef6f2..845435f 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_action_bg_focused.9.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_action_bg_focused.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_ic_actions_right_arrow.png b/v17/leanback/res/drawable-xxhdpi/lb_ic_actions_right_arrow.png
index 42b7c77..c95d7d7 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_ic_actions_right_arrow.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_ic_actions_right_arrow.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_ic_in_app_search.png b/v17/leanback/res/drawable-xxhdpi/lb_ic_in_app_search.png
index b45deb6..3497133 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_ic_in_app_search.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_ic_in_app_search.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic.png b/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic.png
index a36a912..d093e0b 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic_out.png b/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic_out.png
index 8c251e1..640ed3f 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic_out.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_ic_search_mic_out.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_bg.9.png b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_bg.9.png
index fef8b07..d16d2d1 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_bg.9.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_bg.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_focused.9.png b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_focused.9.png
index ceb6a40..3be90bc 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_focused.9.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_focused.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_normal.9.png b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_normal.9.png
index 18d2fcb..f71df89 100644
--- a/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_normal.9.png
+++ b/v17/leanback/res/drawable-xxhdpi/lb_in_app_search_shadow_normal.9.png
Binary files differ
diff --git a/v17/leanback/res/drawable/lb_headers_right_fading.xml b/v17/leanback/res/drawable/lb_headers_right_fading.xml
index b20c4e8..8aea204 100644
--- a/v17/leanback/res/drawable/lb_headers_right_fading.xml
+++ b/v17/leanback/res/drawable/lb_headers_right_fading.xml
@@ -20,6 +20,6 @@
     <gradient
         android:angle="0"
         android:startColor="#00000000"
-        android:endColor="?attr/defaultBrandColor"
+        android:endColor="#00000000"
         />
 </shape>
diff --git a/v17/leanback/res/layout/lb_guidedactions.xml b/v17/leanback/res/layout/lb_guidedactions.xml
index f2926d3..2ba9075 100644
--- a/v17/leanback/res/layout/lb_guidedactions.xml
+++ b/v17/leanback/res/layout/lb_guidedactions.xml
@@ -41,11 +41,13 @@
             android:transitionGroup="true"
             android:id="@+id/guidedactions_list"
             style="?attr/guidedActionsListStyle" />
+        <android.support.v17.leanback.widget.VerticalGridView
+            android:transitionGroup="true"
+            android:id="@+id/guidedactions_sub_list"
+            style="?attr/guidedSubActionsListStyle"
+            android:visibility="invisible"
+            android:background="?attr/guidedActionsBackgroundDark" />
 
-        <android.support.v17.leanback.widget.NonOverlappingView
-            android:id="@+id/guidedactions_selector"
-            android:transitionName="guidedactions_selector"
-            style="?attr/guidedActionsSelectorStyle" />
     </android.support.v17.leanback.widget.NonOverlappingFrameLayout>
 
 </RelativeLayout>
diff --git a/v17/leanback/res/layout/lb_guidedactions_item.xml b/v17/leanback/res/layout/lb_guidedactions_item.xml
index 831c355..30f0384 100644
--- a/v17/leanback/res/layout/lb_guidedactions_item.xml
+++ b/v17/leanback/res/layout/lb_guidedactions_item.xml
@@ -15,7 +15,7 @@
      limitations under the License.
 -->
 <!-- Layout for an action item displayed in the 2 pane actions fragment. -->
-<android.support.v17.leanback.widget.NonOverlappingLinearLayout
+<android.support.v17.leanback.widget.NonOverlappingLinearLayoutWithForeground
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     style="?attr/guidedActionItemContainerStyle" >
@@ -49,4 +49,4 @@
         style="?attr/guidedActionItemChevronStyle"
         tools:ignore="ContentDescription" />
 
-</android.support.v17.leanback.widget.NonOverlappingLinearLayout>
+</android.support.v17.leanback.widget.NonOverlappingLinearLayoutWithForeground>
diff --git a/v17/leanback/res/layout/lb_guidedbuttonactions.xml b/v17/leanback/res/layout/lb_guidedbuttonactions.xml
new file mode 100644
index 0000000..7631c91
--- /dev/null
+++ b/v17/leanback/res/layout/lb_guidedbuttonactions.xml
@@ -0,0 +1,46 @@
+<?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.
+-->
+<!-- Layout for the settings list fragment -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/guidedactions_root2"
+    android:transitionName="guidedactions_root2"
+    android:transitionGroup="false"
+    android:layout_width="0dp"
+    android:layout_weight="1"
+    android:layout_height="match_parent">
+
+    <android.support.v17.leanback.widget.NonOverlappingView
+        android:id="@+id/guidedactions_list_background2"
+        android:transitionName="guidedactions_list_background2"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="?attr/guidedActionsBackgroundDark" />
+
+    <android.support.v17.leanback.widget.NonOverlappingFrameLayout
+        android:id="@+id/guidedactions_content2"
+        android:transitionName="guidedactions_content2"
+        android:transitionGroup="false"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <android.support.v17.leanback.widget.VerticalGridView
+            android:transitionGroup="true"
+            android:id="@+id/guidedactions_list2"
+            style="?attr/guidedButtonActionsListStyle" />
+
+    </android.support.v17.leanback.widget.NonOverlappingFrameLayout>
+
+</RelativeLayout>
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v17/leanback/res/layout/lb_picker.xml
similarity index 68%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v17/leanback/res/layout/lb_picker.xml
index e5dafb0..b11c051 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v17/leanback/res/layout/lb_picker.xml
@@ -14,9 +14,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/picker"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:layout_gravity="center"
+    android:gravity="center_vertical"
+    android:orientation="horizontal" />
diff --git a/v17/leanback/res/layout/lb_picker_column.xml b/v17/leanback/res/layout/lb_picker_column.xml
new file mode 100644
index 0000000..14b5af2
--- /dev/null
+++ b/v17/leanback/res/layout/lb_picker_column.xml
@@ -0,0 +1,25 @@
+<?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.
+-->
+<android.support.v17.leanback.widget.VerticalGridView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:lb="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/column"
+    android:layout_width="wrap_content"
+    android:layout_height="@dimen/picker_item_height"
+    lb:columnWidth="wrap_content"
+    android:clipToPadding="false"
+    android:paddingStart="@dimen/picker_column_horizontal_padding"
+    android:paddingEnd="@dimen/picker_column_horizontal_padding" />
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v17/leanback/res/layout/lb_picker_item.xml
similarity index 69%
rename from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
rename to v17/leanback/res/layout/lb_picker_item.xml
index e5dafb0..55fd5df 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v17/leanback/res/layout/lb_picker_item.xml
@@ -14,9 +14,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/list_item"
+    android:layout_width="wrap_content"
+    android:layout_height="@dimen/picker_item_height"
+    android:layout_centerHorizontal="true"
+    android:gravity="center" />
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v17/leanback/res/layout/lb_picker_separator.xml
similarity index 65%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v17/leanback/res/layout/lb_picker_separator.xml
index e5dafb0..4c239a3 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v17/leanback/res/layout/lb_picker_separator.xml
@@ -14,9 +14,10 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/separator"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:focusable="false"
+    android:paddingStart="@dimen/picker_separator_horizontal_padding"
+    android:paddingEnd="@dimen/picker_separator_horizontal_padding" />
diff --git a/v17/leanback/res/layout/lb_search_bar.xml b/v17/leanback/res/layout/lb_search_bar.xml
index 6123ea7..37cdfb3 100644
--- a/v17/leanback/res/layout/lb_search_bar.xml
+++ b/v17/leanback/res/layout/lb_search_bar.xml
@@ -67,6 +67,7 @@
                     android:imeOptions="normal|flagNoExtractUi|actionSearch"
                     android:inputType="text|textAutoComplete"
                     android:singleLine="true"
+                    android:textAlignment="viewStart"
                     android:textColor="@color/lb_search_bar_text"
                     android:textColorHint="@color/lb_search_bar_hint"
                     android:textCursorDrawable="@null"
diff --git a/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
index 5ee74ee..d92890d 100644
--- a/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
+++ b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
@@ -43,11 +43,10 @@
             <target android:targetId="@id/guidedactions_list_background" />
             <target android:targetId="@id/guidedactions_content" />
             <target android:targetId="@id/guidedactions_list" />
-            <target android:targetId="@id/guidedactions_selector" />
+            <target android:targetId="@id/guidedactions_sub_list" />
             <target android:targetId="@id/guidedactions_list_background2" />
             <target android:targetId="@id/guidedactions_content2" />
             <target android:targetId="@id/guidedactions_list2" />
-            <target android:targetId="@id/guidedactions_selector2" />
         </targets>
   </slide>
 </transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/values-af/strings.xml b/v17/leanback/res/values-af/strings.xml
index c7109bb..1dcec93 100644
--- a/v17/leanback/res/values-af/strings.xml
+++ b/v17/leanback/res/values-af/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiveer hoë gehalte"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktiveer onderskrifte"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiveer onderskrifte"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooi"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Gaan voort"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-am/strings.xml b/v17/leanback/res/values-am/strings.xml
index d5bf0f5..c72e669 100644
--- a/v17/leanback/res/values-am/strings.xml
+++ b/v17/leanback/res/values-am/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ከፍተኛ ጥራትን አሰናክል"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ዝግ የምስል ስር ጽሑፍ አጻጻፍን አንቃ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ዝግ የምስል ስር ጽሑፍ አጻጻፍን አሰናክል"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ጨርስ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ቀጥል"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ar/strings.xml b/v17/leanback/res/values-ar/strings.xml
index 31f4d1a..ee2b477 100644
--- a/v17/leanback/res/values-ar/strings.xml
+++ b/v17/leanback/res/values-ar/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"تعطيل الجودة العالية"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"تمكين الترجمة المصاحبة"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"تعطيل الترجمة المصاحبة"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"إنهاء"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"متابعة"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-az-rAZ/strings.xml b/v17/leanback/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..fb4a7ad
--- /dev/null
+++ b/v17/leanback/res/values-az-rAZ/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+Copyright (C) 2014 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="orb_search_action" msgid="5651268540267663887">"Axtarış Fəaliyyəti"</string>
+    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Axtarış"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Axtarış üçün danışın"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Axtarış: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Axtarış üçün danışın: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="731953341987346903">"Oyun"</string>
+    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"Pauza"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"İrəli Ötürmə"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"İrəli sarı %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Geri ötürmə"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Geri sarı %1$dX"</string>
+    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Növbətini atlayın"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Öncəkini atlayın"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Digər fəaliyyətlər"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Bəyənməkdən imtina edin"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Bəyənin"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Bəyənməməkdən imtina edin"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2936020280629424365">"Bəyənməyin"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="87476947476529036">"Təkrarlanmasın"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="6730354406289599000">"Hamısını təkrarlayın"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="3285202316452203619">"Biri təkrarlansın"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="1099874107835264529">"Qarışdırma aktiv edilsin"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8388150597335115226">"Qarışdırma deaktiv edilsin"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="202415780019335254">"Yüksək keyfiyyəti aktiv edin"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yüksək keyfiyyəti deaktiv edin"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Qapalı çəkilişi aktiv edin"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Qapalı çəkilişi deaktiv edin"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Bitir"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davam edin"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+</resources>
diff --git a/v17/leanback/res/values-bg/strings.xml b/v17/leanback/res/values-bg/strings.xml
index de0b6f8..d3f29e7 100644
--- a/v17/leanback/res/values-bg/strings.xml
+++ b/v17/leanback/res/values-bg/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Търсете"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Говорете, за да търсите"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Търсете в/ъв <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Говорете, за да търсите в/ъв <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Говорете, за да търсите във: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Пускане"</string>
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Деактивиране на високото качество"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Активиране на субтитрите"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Деактивиране на субтитрите"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Край"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Напред"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-bn-rBD/strings.xml b/v17/leanback/res/values-bn-rBD/strings.xml
index 4f0526c..5c3747b 100644
--- a/v17/leanback/res/values-bn-rBD/strings.xml
+++ b/v17/leanback/res/values-bn-rBD/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"উচ্চ গুণমান অক্ষম করুন"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"সাবটাইটেল সক্ষম করুন"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"সাবটাইটেল অক্ষম করুন"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"শেষ করুন"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"চালিয়ে যান"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ca/strings.xml b/v17/leanback/res/values-ca/strings.xml
index 187f5af..1b9dace 100644
--- a/v17/leanback/res/values-ca/strings.xml
+++ b/v17/leanback/res/values-ca/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Cerca."</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Parla per fer una cerca."</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Cerca a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>."</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Parla per cercar a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>."</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Parla per cercar a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reprodueix"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactiva l\'alta qualitat"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activa els subtítols tancats"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactiva els subtítols tancats"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalitza"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-cs/strings.xml b/v17/leanback/res/values-cs/strings.xml
index 1a60828..82ed1f1 100644
--- a/v17/leanback/res/values-cs/strings.xml
+++ b/v17/leanback/res/values-cs/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Vyhledávání"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Vyhledávejte hlasem"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Hledat <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Vyhledávejte v kategorii „<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>“ hlasem"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Vyhledávejte v kategorii „<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>“ hlasem"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d×"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d×"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Přehrát"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Vypnout vysokou kvalitu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnout titulky"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnout titulky"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončit"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovat"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-da/strings.xml b/v17/leanback/res/values-da/strings.xml
index e3e0f9f..aff0bcc 100644
--- a/v17/leanback/res/values-da/strings.xml
+++ b/v17/leanback/res/values-da/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Søg"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tal for at søge"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Søg efter <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tal for at søge efter <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Sig noget for at søge i <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Afspil"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høj kvalitet"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér undertekster"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver undertekster"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Afslut"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsæt"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-de/strings.xml b/v17/leanback/res/values-de/strings.xml
index d729f7c..34b27c0 100644
--- a/v17/leanback/res/values-de/strings.xml
+++ b/v17/leanback/res/values-de/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Suchen"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Zum Suchen sprechen"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"In <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> suchen"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Zum Suchen in der Kategorie \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\" sprechen"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Sprechen, um in \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\" zu suchen"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dx"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dx"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Wiedergabe"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hohe Qualität deaktivieren"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Untertitel aktivieren"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Untertitel deaktivieren"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fertigstellen"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Weiter"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-el/strings.xml b/v17/leanback/res/values-el/strings.xml
index 9b93dcf..bd4145f 100644
--- a/v17/leanback/res/values-el/strings.xml
+++ b/v17/leanback/res/values-el/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Αναζήτηση"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Μιλήστε για να κάνετε αναζήτηση"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Αναζήτηση <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Μιλήστε για αναζήτηση <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Μιλήστε για αναζήτηση: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Αναπαραγωγή"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Απενεργοποίηση Υψηλής ποιότητας"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ενεργοποίηση υποτίτλων"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Απενεργοποίηση υποτίτλων"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Τέλος"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Συνέχεια"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-en-rAU/strings.xml b/v17/leanback/res/values-en-rAU/strings.xml
index ed22ccd..7be00fa 100644
--- a/v17/leanback/res/values-en-rAU/strings.xml
+++ b/v17/leanback/res/values-en-rAU/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-en-rGB/strings.xml b/v17/leanback/res/values-en-rGB/strings.xml
index ed22ccd..7be00fa 100644
--- a/v17/leanback/res/values-en-rGB/strings.xml
+++ b/v17/leanback/res/values-en-rGB/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-en-rIN/strings.xml b/v17/leanback/res/values-en-rIN/strings.xml
index ed22ccd..7be00fa 100644
--- a/v17/leanback/res/values-en-rIN/strings.xml
+++ b/v17/leanback/res/values-en-rIN/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-es-rUS/strings.xml b/v17/leanback/res/values-es-rUS/strings.xml
index ab05f83..b4ee5bc 100644
--- a/v17/leanback/res/values-es-rUS/strings.xml
+++ b/v17/leanback/res/values-es-rUS/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inhabilitar calidad alta"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Habilitar subtítulos"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inhabilitar subtítulos"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-es/strings.xml b/v17/leanback/res/values-es/strings.xml
index 0cff1c9..3cf9813 100644
--- a/v17/leanback/res/values-es/strings.xml
+++ b/v17/leanback/res/values-es/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Buscar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Habla para buscar"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Buscar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Habla para buscar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Habla para buscar en <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproducir"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inhabilitar alta calidad"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Habilitar subtítulos"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inhabilitar subtítulos"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-et-rEE/strings.xml b/v17/leanback/res/values-et-rEE/strings.xml
index 32fff96..033a529 100644
--- a/v17/leanback/res/values-et-rEE/strings.xml
+++ b/v17/leanback/res/values-et-rEE/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Otsing"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Öelge otsimiseks"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Otsige teenusest <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Kõnelge teenusest <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> otsimiseks"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Häälotsing: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Esita"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Keela kõrgkvaliteetne taasesitus"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Luba subtiitrid"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Keela subtiitrid"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Lõpeta"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jätka"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-eu-rES/strings.xml b/v17/leanback/res/values-eu-rES/strings.xml
index d9f9bf7..d42e6a4 100644
--- a/v17/leanback/res/values-eu-rES/strings.xml
+++ b/v17/leanback/res/values-eu-rES/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desgaitu kalitate handiko erreprodukzioa"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Gaitu azpitituluak"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desgaitu azpitituluak"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Amaitu"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jarraitu"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-fa/strings.xml b/v17/leanback/res/values-fa/strings.xml
index bb615fc..99a8ee9 100644
--- a/v17/leanback/res/values-fa/strings.xml
+++ b/v17/leanback/res/values-fa/strings.xml
@@ -25,7 +25,7 @@
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"پخش"</string>
-    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"توقف موقت"</string>
+    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"مکث"</string>
     <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"جلو بردن سریع"</string>
     <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"‏بازارسال سریع %1$dX"</string>
     <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"عقب بردن"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"غیرفعال کردن کیفیت بالا"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"فعال کردن زیرنویس"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"غیرفعال کردن زیرنویس"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"پایان"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ادامه"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-fi/strings.xml b/v17/leanback/res/values-fi/strings.xml
index 9d38d3c..22bc3e9 100644
--- a/v17/leanback/res/values-fi/strings.xml
+++ b/v17/leanback/res/values-fi/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Haku"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tee haku puhumalla"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Haku: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Puhehaku: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Hae <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> puhehaulla"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Toista"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Poista korkea laatu käytöstä"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ota tekstitys käyttöön"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Poista tekstitys käytöstä"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Valmis"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jatka"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-fr-rCA/strings.xml b/v17/leanback/res/values-fr-rCA/strings.xml
index bbd3eea..2bb1d16 100644
--- a/v17/leanback/res/values-fr-rCA/strings.xml
+++ b/v17/leanback/res/values-fr-rCA/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la lecture haute qualité"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer le sous-titrage"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver le sous-titrage"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-fr/strings.xml b/v17/leanback/res/values-fr/strings.xml
index e9c051c..97fff8c 100644
--- a/v17/leanback/res/values-fr/strings.xml
+++ b/v17/leanback/res/values-fr/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Rechercher"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Énoncer la recherche"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Rechercher \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Énoncer la recherche \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Énoncez votre recherche sur \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Lecture"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la haute qualité"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer les sous-titres"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver les sous-titres"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-gl-rES/strings.xml b/v17/leanback/res/values-gl-rES/strings.xml
index 717b994..1e8b62e 100644
--- a/v17/leanback/res/values-gl-rES/strings.xml
+++ b/v17/leanback/res/values-gl-rES/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactivar alta calidade"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activar subtítulos"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactivar subtítulos"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-gu-rIN/strings.xml b/v17/leanback/res/values-gu-rIN/strings.xml
index 2e4f30f..d295a2f 100644
--- a/v17/leanback/res/values-gu-rIN/strings.xml
+++ b/v17/leanback/res/values-gu-rIN/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ઉચ્ચ ગુણવત્તા અક્ષમ કરો"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ઉપશીર્ષક સક્ષમ કરો"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"વિગતવાર ઉપશીર્ષકોને અક્ષમ કરો"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"સમાપ્ત કરો"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ચાલુ રાખો"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-hi/strings.xml b/v17/leanback/res/values-hi/strings.xml
index a926396..f4764e8 100644
--- a/v17/leanback/res/values-hi/strings.xml
+++ b/v17/leanback/res/values-hi/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणवत्ता अक्षम करें"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षक सक्षम करें"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षक अक्षम करें"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त करें"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी रखें"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-hr/strings.xml b/v17/leanback/res/values-hr/strings.xml
index 166369f..c4e7a5e 100644
--- a/v17/leanback/res/values-hr/strings.xml
+++ b/v17/leanback/res/values-hr/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pretražite"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite upit za pretraživanje"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit za pretraživanje <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit da pretražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduciraj"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Onemogući visoku kvalitetu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogući titlove"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogući titlove"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završi"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-hu/strings.xml b/v17/leanback/res/values-hu/strings.xml
index 427f1cd..c8efddb 100644
--- a/v17/leanback/res/values-hu/strings.xml
+++ b/v17/leanback/res/values-hu/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Jó minőségű lejátszás letiltása"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Feliratok engedélyezése"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Feliratok letiltása"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Befejezés"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Folytatás"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-hy-rAM/strings.xml b/v17/leanback/res/values-hy-rAM/strings.xml
index 7e8112e..818f95b 100644
--- a/v17/leanback/res/values-hy-rAM/strings.xml
+++ b/v17/leanback/res/values-hy-rAM/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Անջատել բարձր որակը"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Միացնել խորագրերը"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Անջատել խորագրերը"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Վերջ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Շարունակել"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-in/strings.xml b/v17/leanback/res/values-in/strings.xml
index 2dca7d3..75e8aba 100644
--- a/v17/leanback/res/values-in/strings.xml
+++ b/v17/leanback/res/values-in/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Nonaktifkan Kualitas Tinggi"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktifkan Pembuatan Teks"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Nonaktifkan Pembuatan Teks"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Lanjutkan"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
 </resources>
diff --git a/v17/leanback/res/values-is-rIS/strings.xml b/v17/leanback/res/values-is-rIS/strings.xml
index c84a4c6..dc685ce 100644
--- a/v17/leanback/res/values-is-rIS/strings.xml
+++ b/v17/leanback/res/values-is-rIS/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Slökkva á miklum gæðum"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Kveikja á skjátextum"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Slökkva á skjátextum"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Ljúka"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Halda áfram"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-it/strings.xml b/v17/leanback/res/values-it/strings.xml
index 1b58e0c..99141e8 100644
--- a/v17/leanback/res/values-it/strings.xml
+++ b/v17/leanback/res/values-it/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disattiva alta qualità"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Attiva sottotitoli"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disattiva sottotitoli"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fine"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-iw/strings.xml b/v17/leanback/res/values-iw/strings.xml
index f102498..53b3ec9 100644
--- a/v17/leanback/res/values-iw/strings.xml
+++ b/v17/leanback/res/values-iw/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"השבת איכות גבוהה"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"הפעל כתוביות"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"השבת כתוביות"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"סיום"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"המשך"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-ja/strings.xml b/v17/leanback/res/values-ja/strings.xml
index 802631c..67acfb6 100644
--- a/v17/leanback/res/values-ja/strings.xml
+++ b/v17/leanback/res/values-ja/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"高品質を無効にする"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"字幕を有効にする"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"字幕を無効にする"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完了"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"続行"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ka-rGE/strings.xml b/v17/leanback/res/values-ka-rGE/strings.xml
index 70aeada..b2dae4c 100644
--- a/v17/leanback/res/values-ka-rGE/strings.xml
+++ b/v17/leanback/res/values-ka-rGE/strings.xml
@@ -50,4 +50,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"მაღალი ხარისხის გამორთვა"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"დახურული წარწერების ჩართვა"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"დახურული წარწერების გაუქმება"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"დასრულება"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"გაგრძელება"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-kk-rKZ/strings.xml b/v17/leanback/res/values-kk-rKZ/strings.xml
index 9ed6ce2..f3f3d14 100644
--- a/v17/leanback/res/values-kk-rKZ/strings.xml
+++ b/v17/leanback/res/values-kk-rKZ/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Жоғары сапаны өшіру"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жасырын титрлерді қосу"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жасырын титрлерді өшіру"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Аяқтау"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Жалғастыру"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-km-rKH/strings.xml b/v17/leanback/res/values-km-rKH/strings.xml
index 7874af2..f6bfb42 100644
--- a/v17/leanback/res/values-km-rKH/strings.xml
+++ b/v17/leanback/res/values-km-rKH/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"បិទ​គុណភាព​ខ្ពស់"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"បើក​ការ​ដាក់​ចំណង​ដែល​បាន​បិទ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"បិទ​ការ​ដាក់​ចំណង​ដែល​បាន​បិទ"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"បញ្ចប់"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"បន្ត"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"៖"</string>
 </resources>
diff --git a/v17/leanback/res/values-kn-rIN/strings.xml b/v17/leanback/res/values-kn-rIN/strings.xml
index 196b154..3baed40 100644
--- a/v17/leanback/res/values-kn-rIN/strings.xml
+++ b/v17/leanback/res/values-kn-rIN/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ಹೆಚ್ಚು ಗುಣಮಟ್ಟವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ಪೂರ್ಣಗೊಳಿಸು"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ಮುಂದುವರಿಸು"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ko/strings.xml b/v17/leanback/res/values-ko/strings.xml
index c244dbf..e6ef7c3 100644
--- a/v17/leanback/res/values-ko/strings.xml
+++ b/v17/leanback/res/values-ko/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"고화질 사용 중지"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"자막 사용 설정"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"자막 사용 중지"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"완료"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"계속"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ky-rKG/strings.xml b/v17/leanback/res/values-ky-rKG/strings.xml
index 4ddb284..11174f8 100644
--- a/v17/leanback/res/values-ky-rKG/strings.xml
+++ b/v17/leanback/res/values-ky-rKG/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Жогорку сапатты өчүрүү"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жабык субтитрлерди иштетүү"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жабык субтитрлерди өчүрүү"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Бүтүрүү"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Улантуу"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-lo-rLA/strings.xml b/v17/leanback/res/values-lo-rLA/strings.xml
index 35f519b..a50f048 100644
--- a/v17/leanback/res/values-lo-rLA/strings.xml
+++ b/v17/leanback/res/values-lo-rLA/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"​ປິດ​ນຳ​ໃຊ້​ການຫຼິ້ນ​ດ້ວຍຄຸນ​ນະ​ພາບ​ສູງ"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"​ເປີດ​ນຳ​ໃຊ້​​ຄຳ​ບັນ​ຍາຍ​ແບບ​ປິດ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"​ປິດ​ນຳ​ໃຊ້​ຄຳ​ບັນ​ຍາຍ​ແບບ​ປິດ"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ສໍາເລັດ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"​ສືບ​ຕໍ່"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-lt/strings.xml b/v17/leanback/res/values-lt/strings.xml
index 6ca2bab..3b0bd19 100644
--- a/v17/leanback/res/values-lt/strings.xml
+++ b/v17/leanback/res/values-lt/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Išjungti aukštą kokybę"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Įgalinti subtitrus"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Išjungti subtitrus"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Baigti"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tęsti"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-lv/strings.xml b/v17/leanback/res/values-lv/strings.xml
index 7d3bc2b..471dbf9 100644
--- a/v17/leanback/res/values-lv/strings.xml
+++ b/v17/leanback/res/values-lv/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Atspējot augstas kvalitātes vienumu atskaņošanu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Iespējot slēgtos parakstus"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Atspējot slēgtos parakstus"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Pabeigt"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Turpināt"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-mk-rMK/strings.xml b/v17/leanback/res/values-mk-rMK/strings.xml
index 75666e0..6adf09a 100644
--- a/v17/leanback/res/values-mk-rMK/strings.xml
+++ b/v17/leanback/res/values-mk-rMK/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Оневозможи висок квалитет"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Овозможи затворено објаснување"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Оневозможи затворено објаснување"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Заврши"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продолжи"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ml-rIN/strings.xml b/v17/leanback/res/values-ml-rIN/strings.xml
index b900f09..d24a3d2 100644
--- a/v17/leanback/res/values-ml-rIN/strings.xml
+++ b/v17/leanback/res/values-ml-rIN/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ഉയർന്ന നിലവാരം പ്രവർത്തനരഹിതമാക്കുക"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനക്ഷമമാക്കുക"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനരഹിതമാക്കുക"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"പൂര്‍ത്തിയാക്കുക"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"തുടരുക"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-mn-rMN/strings.xml b/v17/leanback/res/values-mn-rMN/strings.xml
index e4a8fcd..1363577 100644
--- a/v17/leanback/res/values-mn-rMN/strings.xml
+++ b/v17/leanback/res/values-mn-rMN/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Өндөр чанарыг идэвхгүйжүүлэх"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Текст тайлбарыг идэвхжүүлэх"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Текст тайлбарыг идэвхгүйжүүлэх"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Дуусгах"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Үргэлжлүүлэх"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-mr-rIN/strings.xml b/v17/leanback/res/values-mr-rIN/strings.xml
index 11748ec..83b583a 100644
--- a/v17/leanback/res/values-mr-rIN/strings.xml
+++ b/v17/leanback/res/values-mr-rIN/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणवत्ता अक्षम करा"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षके सक्षम करा"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षके अक्षम करा"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"सुरू ठेवा"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-ms-rMY/strings.xml b/v17/leanback/res/values-ms-rMY/strings.xml
index c073e43..f62e086 100644
--- a/v17/leanback/res/values-ms-rMY/strings.xml
+++ b/v17/leanback/res/values-ms-rMY/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Lumpuhkan Kualiti Tinggi"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Dayakan Kapsyen Tertutup"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Lumpuhkan Kapsyen Tertutup"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Teruskan"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-my-rMM/strings.xml b/v17/leanback/res/values-my-rMM/strings.xml
index 2efaf7f..6e0e577 100644
--- a/v17/leanback/res/values-my-rMM/strings.xml
+++ b/v17/leanback/res/values-my-rMM/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"အရည်အသွေးကောင်းအား ပိတ်ထားရန်"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"စာတမ်းထိုး ဖွင့်ရန်"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"စာတမ်းထိုးအား ပိတ်ထားရန်"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ပြီးပြီ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ဆက်လုပ်ရန်"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"−"</string>
 </resources>
diff --git a/v17/leanback/res/values-nb/strings.xml b/v17/leanback/res/values-nb/strings.xml
index f5ab2e1..826283a 100644
--- a/v17/leanback/res/values-nb/strings.xml
+++ b/v17/leanback/res/values-nb/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høy kvalitet"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér teksting"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver teksting"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fullfør"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsett"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ne-rNP/strings.xml b/v17/leanback/res/values-ne-rNP/strings.xml
index c399985..4e7a473 100644
--- a/v17/leanback/res/values-ne-rNP/strings.xml
+++ b/v17/leanback/res/values-ne-rNP/strings.xml
@@ -48,4 +48,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणस्तर असक्षम"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"बन्द क्याप्सनहरु सक्षम"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"बन्द क्याप्सनहरु असक्षम"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त गर्नुहोस्"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी राख्नुहोस्"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-nl/strings.xml b/v17/leanback/res/values-nl/strings.xml
index fe73141..a4bc09b 100644
--- a/v17/leanback/res/values-nl/strings.xml
+++ b/v17/leanback/res/values-nl/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Zoeken"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Spreek om te zoeken"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> zoeken"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Spreek om <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> te zoeken"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Spreek om in <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> te zoeken"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Afspelen"</string>
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hoge kwaliteit uitschakelen"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ondertiteling inschakelen"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Ondertiteling uitschakelen"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooien"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Doorgaan"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"-"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-pa-rIN/strings.xml b/v17/leanback/res/values-pa-rIN/strings.xml
index f9c7c4b..35fb889 100644
--- a/v17/leanback/res/values-pa-rIN/strings.xml
+++ b/v17/leanback/res/values-pa-rIN/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ਉੱਚ ਗੁਣਵੱਤਾ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਸਮਰੱਥ ਬਣਾਓ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ਖ਼ਤਮ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ਜਾਰੀ ਰੱਖੋ"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-pl/strings.xml b/v17/leanback/res/values-pl/strings.xml
index f6280a3..94ae108 100644
--- a/v17/leanback/res/values-pl/strings.xml
+++ b/v17/leanback/res/values-pl/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Szukaj"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Powiedz, aby wyszukać"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Szukaj <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, by wyszukać w aplikacji <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, by wyszukać <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Odtwórz"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Wyłącz wysoką jakość"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Włącz napisy"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Wyłącz napisy"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Zakończ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Dalej"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-pt-rBR/strings.xml b/v17/leanback/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..b4ac5ce
--- /dev/null
+++ b/v17/leanback/res/values-pt-rBR/strings.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+Copyright (C) 2014 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="orb_search_action" msgid="5651268540267663887">"Ação de pesquisa"</string>
+    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
+    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"Pausar"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Avançar"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"Avançar %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Retroceder"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Retroceder %1$dX"</string>
+    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Pular próxima"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Pular anterior"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Mais ações"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Desmarcar gostei"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Marcar gostei"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Desmarcar não gostei"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2936020280629424365">"Marcar não gostei"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="87476947476529036">"Não repetir"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="6730354406289599000">"Repetir tudo"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="3285202316452203619">"Repetir uma"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="1099874107835264529">"Ativar reprodução aleatória"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8388150597335115226">"Desativar reprodução aleatória"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="202415780019335254">"Ativar alta qualidade"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar closed captioning"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar closed captioning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
+</resources>
diff --git a/v17/leanback/res/values-pt-rPT/strings.xml b/v17/leanback/res/values-pt-rPT/strings.xml
index f3bf4aa..8a21baa 100644
--- a/v17/leanback/res/values-pt-rPT/strings.xml
+++ b/v17/leanback/res/values-pt-rPT/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no(a) <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar legendas"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar legendas"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-pt/strings.xml b/v17/leanback/res/values-pt/strings.xml
index 13d01a5..b4ac5ce 100644
--- a/v17/leanback/res/values-pt/strings.xml
+++ b/v17/leanback/res/values-pt/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar closed captioning"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar closed captioning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ro/strings.xml b/v17/leanback/res/values-ro/strings.xml
index cb6aa4a..bb0da77 100644
--- a/v17/leanback/res/values-ro/strings.xml
+++ b/v17/leanback/res/values-ro/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Dezactivează calitatea înaltă"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activează subtitrările"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Dezactivează subtitrările"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizați"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuați"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ru/strings.xml b/v17/leanback/res/values-ru/strings.xml
index fb03f9d..311f05a 100644
--- a/v17/leanback/res/values-ru/strings.xml
+++ b/v17/leanback/res/values-ru/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Поиск"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Произнесите запрос"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Поиск здесь: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Произнесите запрос, чтобы найти <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Скажите, что вы хотите найти – <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Воспроизвести."</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Отключить высокое качество."</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Включить субтитры."</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Отключить субтитры."</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Готово"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далее"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-si-rLK/strings.xml b/v17/leanback/res/values-si-rLK/strings.xml
index e5c0cf4..519aaa4 100644
--- a/v17/leanback/res/values-si-rLK/strings.xml
+++ b/v17/leanback/res/values-si-rLK/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"උපරිම ගුණත්වය අබල කරන ලදි"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"වැසුණු ශිර්ෂ කිරීම සබල කරන ලදි"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"වැසුණු ශිර්ෂ කිරීම අබල කරන ලදි"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"අවසානය"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"දිගටම කර ගෙන යන්න"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-sk/strings.xml b/v17/leanback/res/values-sk/strings.xml
index 74a9044..fb4e24b 100644
--- a/v17/leanback/res/values-sk/strings.xml
+++ b/v17/leanback/res/values-sk/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zakázať médiá vo vysokej kvalite"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnúť skryté titulky"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnúť skryté titulky"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončiť"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovať"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-sl/strings.xml b/v17/leanback/res/values-sl/strings.xml
index 1af639b..e3250a9 100644
--- a/v17/leanback/res/values-sl/strings.xml
+++ b/v17/leanback/res/values-sl/strings.xml
@@ -19,9 +19,9 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="orb_search_action" msgid="5651268540267663887">"Dejanje iskanja"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Iskanje"</string>
-    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite, če želite iskati"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite iskalno poizvedbo"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Iskanje: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Govorite, če želite iskati: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite poizvedbo za iskanje v <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d-kratno"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d-kratno"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Predvajaj"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Onemogoči visoko kakovost"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogoči podnapise"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogoči podnapise"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončaj"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Naprej"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-sq-rAL/strings.xml b/v17/leanback/res/values-sq-rAL/strings.xml
index 28c313f..92d6b20 100644
--- a/v17/leanback/res/values-sq-rAL/strings.xml
+++ b/v17/leanback/res/values-sq-rAL/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Çaktivizo \"Cilësinë e lartë\""</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivizo titrat"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Çaktivizo titrat me sekuencë kohore"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Përfundo"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Vazhdo"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-sr/strings.xml b/v17/leanback/res/values-sr/strings.xml
index bb5c32d..af2e162 100644
--- a/v17/leanback/res/values-sr/strings.xml
+++ b/v17/leanback/res/values-sr/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Онемогући висок квалитет"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Омогући титлове"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Онемогући титлове"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Доврши"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Настави"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-sv/strings.xml b/v17/leanback/res/values-sv/strings.xml
index 1a8e757..3bcd4ae 100644
--- a/v17/leanback/res/values-sv/strings.xml
+++ b/v17/leanback/res/values-sv/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inaktivera hög kvalitet"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivera textning"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inaktivera textning"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Slutför"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsätt"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-sw/strings.xml b/v17/leanback/res/values-sw/strings.xml
index 17c7480..cdd4972 100644
--- a/v17/leanback/res/values-sw/strings.xml
+++ b/v17/leanback/res/values-sw/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Utafutaji"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tamka ili utafute"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tafuta <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tamka ili utafute <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tamka ili utafute kwenye <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Google Play"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zima Ubora wa Juu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Washa manukuu"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Zima manukuu"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Kamilisha"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Endelea"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-ta-rIN/strings.xml b/v17/leanback/res/values-ta-rIN/strings.xml
index 9472522..5402062 100644
--- a/v17/leanback/res/values-ta-rIN/strings.xml
+++ b/v17/leanback/res/values-ta-rIN/strings.xml
@@ -20,7 +20,7 @@
     <string name="orb_search_action" msgid="5651268540267663887">"செயலைத் தேடுக"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"தேடு"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"தேட, பேசவும்"</string>
-    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ஐத் தேடுக"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> இல் தேடுக"</string>
     <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ஐத் தேட, பேசவும்"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"உயர் தரத்தை முடக்கு"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"விரிவான வசனங்களை இயக்கு"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"விரிவான வசனங்களை முடக்கு"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"முடி"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"தொடர்க"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-te-rIN/strings.xml b/v17/leanback/res/values-te-rIN/strings.xml
index f71e8cb..064d3cf 100644
--- a/v17/leanback/res/values-te-rIN/strings.xml
+++ b/v17/leanback/res/values-te-rIN/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"అధిక నాణ్యతను నిలిపివేయి"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"సంవృత శీర్షికలను ప్రారంభించు"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"సంవృత శీర్షికలను నిలిపివేయి"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ముగించు"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"కొనసాగించు"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-th/strings.xml b/v17/leanback/res/values-th/strings.xml
index 581bac0..abe8f48 100644
--- a/v17/leanback/res/values-th/strings.xml
+++ b/v17/leanback/res/values-th/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ค้นหา"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"พูดเพื่อค้นหา"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"ค้นหา <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"พูดเพื่อค้นหา <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"พูดเพื่อทำการค้นหาใน <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"เล่น"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ปิดใช้คุณภาพสูง"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"เปิดใช้คำบรรยาย"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ปิดใช้คำบรรยาย"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"เสร็จสิ้น"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ต่อไป"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-tl/strings.xml b/v17/leanback/res/values-tl/strings.xml
index c4e15ec..8c1b251 100644
--- a/v17/leanback/res/values-tl/strings.xml
+++ b/v17/leanback/res/values-tl/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Maghanap"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Magsalita upang maghanap"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Hanapin ang <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Magsalita upang hanapin ang <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Magsalita upang maghanap sa <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"I-play"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"I-disable ang Mataas na Kalidad"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"I-enable ang Paglalagay ng Subtitle"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"I-disable ang Paglalagay ng Subtitle"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tapusin"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Magpatuloy"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-tr/strings.xml b/v17/leanback/res/values-tr/strings.xml
index 4671058..2ad8e34 100644
--- a/v17/leanback/res/values-tr/strings.xml
+++ b/v17/leanback/res/values-tr/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Ara"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Arama yapmak için konuşun"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Ara: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Aramak için konuşun: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Konuşarak <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> araması yapın"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Oynat"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yüksek Kalitede Oynatmayı Devre Dışı Bırak"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Altyazıları Etkinleştir"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Altyazıları Devre Dışı Bırak"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Son"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Devam"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-uk/strings.xml b/v17/leanback/res/values-uk/strings.xml
index 79b2782..20a4127 100644
--- a/v17/leanback/res/values-uk/strings.xml
+++ b/v17/leanback/res/values-uk/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Вимкнути високу якість"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Увімкнути субтитри"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Вимкнути субтитри"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Закінчити"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продовжити"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-ur-rPK/strings.xml b/v17/leanback/res/values-ur-rPK/strings.xml
index b670251..238bcd5 100644
--- a/v17/leanback/res/values-ur-rPK/strings.xml
+++ b/v17/leanback/res/values-ur-rPK/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"اعلی معیار کو غیر فعال کریں"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"سب ٹائٹلز کو فعال کریں"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"سب ٹائٹلز کو غیر فعال کریں"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"مکمل کریں"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"جاری رکھیں"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-uz-rUZ/strings.xml b/v17/leanback/res/values-uz-rUZ/strings.xml
index 235d88f..9242fe5 100644
--- a/v17/leanback/res/values-uz-rUZ/strings.xml
+++ b/v17/leanback/res/values-uz-rUZ/strings.xml
@@ -28,7 +28,7 @@
     <string name="lb_playback_controls_pause" msgid="6189521112079849518">"To‘xtatib turish"</string>
     <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Oldinga o‘tkazish"</string>
     <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"%1$dX tezlikda oldinga o‘tkazish"</string>
-    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Orqaga qaytarish"</string>
+    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Orqaga o‘tkazish"</string>
     <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"%1$dX tezlikda orqaga qaytarish"</string>
     <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Keyingisiga o‘tish"</string>
     <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Avvalgisiga qaytish"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yuqori sifatni o‘chirib qo‘yish"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Taglavhalarni yoqish"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Taglavhalarni o‘chirib qo‘yish"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tugatish"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davom etish"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-vi/strings.xml b/v17/leanback/res/values-vi/strings.xml
index 201d137..c84965e 100644
--- a/v17/leanback/res/values-vi/strings.xml
+++ b/v17/leanback/res/values-vi/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Tìm kiếm"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Nói để tìm kiếm"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tìm kiếm <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Nói để tìm kiếm <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Nói để tìm kiếm trên <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Phát"</string>
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Tắt chế độ chất lượng cao"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Bật phụ đề"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Tắt phụ đề"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Hoàn tất"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tiếp tục"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rCN/strings.xml b/v17/leanback/res/values-zh-rCN/strings.xml
index 276e7bb..27adabc 100644
--- a/v17/leanback/res/values-zh-rCN/strings.xml
+++ b/v17/leanback/res/values-zh-rCN/strings.xml
@@ -21,7 +21,7 @@
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"搜索"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"说话即可开始搜索"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"搜索<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"说话即可在<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>中搜索"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"说出搜索条件,在<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>中进行搜索"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d 倍速"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d 倍速"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"播放"</string>
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"关闭高画质模式"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"开启字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"关闭字幕"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"继续"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-zh-rHK/strings.xml b/v17/leanback/res/values-zh-rHK/strings.xml
index 5e87989..953064f 100644
--- a/v17/leanback/res/values-zh-rHK/strings.xml
+++ b/v17/leanback/res/values-zh-rHK/strings.xml
@@ -46,4 +46,8 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"停用高畫質"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rTW/strings.xml b/v17/leanback/res/values-zh-rTW/strings.xml
index 67efc40..8135d03 100644
--- a/v17/leanback/res/values-zh-rTW/strings.xml
+++ b/v17/leanback/res/values-zh-rTW/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"停用高品質播放"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values-zu/strings.xml b/v17/leanback/res/values-zu/strings.xml
index f17455d..67e664c 100644
--- a/v17/leanback/res/values-zu/strings.xml
+++ b/v17/leanback/res/values-zu/strings.xml
@@ -46,4 +46,10 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Khubaza ikhwalithi ephezulu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Nika amandla imibhalo engezansi"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Khubaza imihbalo engezansi"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Qeda"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Qhubeka"</string>
+    <!-- no translation found for lb_date_separator (2440386660906697298) -->
+    <skip />
+    <!-- no translation found for lb_time_separator (2763247350845477227) -->
+    <skip />
 </resources>
diff --git a/v17/leanback/res/values/attrs.xml b/v17/leanback/res/values/attrs.xml
index 90f010a..b2f846d 100644
--- a/v17/leanback/res/values/attrs.xml
+++ b/v17/leanback/res/values/attrs.xml
@@ -22,6 +22,12 @@
         <attr name="focusOutFront" format="boolean" />
         <!-- Allow DPAD key to navigate out at the end of the view, default is false -->
         <attr name="focusOutEnd" format="boolean" />
+        <!-- Allow DPAD key to navigate out of first row, for HorizontalGridView, it's the
+             top edge, for VerticalGridView it's the "start" edge.  Default value is true.  -->
+        <attr name="focusOutSideStart" format="boolean" />
+        <!-- Allow DPAD key to navigate out of last row, for HorizontalGridView, it's the
+             bottom edge, for VerticalGridView it's the "end" edge.  Default value is true.  -->
+        <attr name="focusOutSideEnd" format="boolean" />
         <!-- Defining margin between two items horizontally -->
         <attr name="horizontalMargin" format="dimension" />
         <!-- Defining margin between two items vertically -->
@@ -346,17 +352,9 @@
              {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidanceIconStyle}. -->
         <attr name="guidanceIconStyle" format="reference" />
 
-        <!-- Theme attribute for the animation used in a GuidedActionsPresenter when the action
-             selector is animated in at activity start. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedactions_selector_show}. -->
-        <attr name="guidedActionsSelectorShowAnimation" format="reference" />
-        <!-- Theme attribute for the animation used in a GuidedActionsPresenter when the action
-             selector is animated in at activity start. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedactions_selector_hide}. -->
-        <attr name="guidedActionsSelectorHideAnimation" format="reference" />
         <!-- Theme attribute for the style of the item selector in a GuidedActionsPresenter. Default is
-             {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionsSelectorStyle}. -->
-        <attr name="guidedActionsSelectorStyle" format="reference" />
+             ?android:attr/selectableItemBackground. -->
+        <attr name="guidedActionsSelectorDrawable" format="reference" />
 
         <!-- Theme attribute for the shadow elevation of GuidedActions. Default is
              {@link android.support.v17.leanback.R.dimen#lb_guidedactions_elevation}.-->
@@ -374,6 +372,14 @@
              {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionsListStyle}.-->
         <attr name="guidedActionsListStyle" format="reference" />
 
+        <!-- Theme attribute for the style of the sub actions list in a GuidedActionsPresenter. Default is
+             {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedSubActionsListStyle}.-->
+        <attr name="guidedSubActionsListStyle" format="reference" />
+
+        <!-- Theme attribute for the style of the list in a GuidedActionsPresenter. Default is
+             {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedButtonActionsListStyle}.-->
+        <attr name="guidedButtonActionsListStyle" format="reference" />
+
         <!-- Theme attribute for the style of the container of a single action in a
              GuidedActionsPresenter. Default is {@link
              android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionItemContainerStyle}. -->
@@ -442,6 +448,42 @@
              android.support.v17.leanback.R.dimen#lb_guidedactions_vertical_padding}. -->
         <attr name="guidedActionVerticalPadding" format="reference" />
 
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionsContainerStyle" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionsSelectorStyle" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedStepEntryAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedStepExitAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedStepReentryAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedStepReturnAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidanceEntryAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionsEntryAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionsSelectorShowAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionsSelectorHideAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionCheckedAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionUncheckedAnimation" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionContentWidth" format="reference" />
+        <!-- Deprecated theme attribute, do not use -->
+        <attr name="guidedActionContentWidthNoIcon" format="reference" />
+
+    </declare-styleable>
+
+    <declare-styleable name="lbDatePicker">
+        <attr name="android:minDate" />
+        <attr name="android:maxDate" />
+        <!-- e.g. "MDY", "MY" -->
+        <attr name="datePickerFormat" format="string"/>
     </declare-styleable>
 
 </resources>
\ No newline at end of file
diff --git a/v17/leanback/res/values/colors.xml b/v17/leanback/res/values/colors.xml
index 858ace5..aae6563 100644
--- a/v17/leanback/res/values/colors.xml
+++ b/v17/leanback/res/values/colors.xml
@@ -73,7 +73,6 @@
     <!-- refactor naming here -->
     <color name="lb_guidedactions_background">#FF111111</color>
     <color name="lb_guidedactions_background_dark">#FF080808</color>
-    <color name="lb_guidedactions_selector_color">#26FFFFFF</color>
     <color name="lb_guidedactions_item_unselected_text_color">#FFF1F1F1</color>
     <!-- end refactor naming -->
 
diff --git a/v17/leanback/res/values/dimens.xml b/v17/leanback/res/values/dimens.xml
index 053c7e0..87b3549 100644
--- a/v17/leanback/res/values/dimens.xml
+++ b/v17/leanback/res/values/dimens.xml
@@ -235,7 +235,6 @@
     <item name="lb_guidedactions_width_weight_two_panels" format="float" type="string">1</item>
     <dimen name="lb_guidedactions_section_shadow_width">16dp</dimen>
     <dimen name="lb_guidedactions_elevation">12dp</dimen>
-    <dimen name="lb_guidedactions_selector_min_height">8dp</dimen>
     <dimen name="lb_guidedactions_vertical_padding">12dp</dimen>
 
     <item name="lb_guidedactions_item_disabled_text_alpha" format="float" type="string">0.25</item>
@@ -256,6 +255,7 @@
     <dimen name="lb_guidedactions_item_icon_height">32dp</dimen>
     <dimen name="lb_guidedactions_item_title_font_size">18sp</dimen>
     <dimen name="lb_guidedactions_item_description_font_size">12sp</dimen>
+    <dimen name="lb_guidedactions_sublist_bottom_margin">28dp</dimen>
 
     <integer name="lb_guidedstep_entry_animation_delay">550</integer>
     <integer name="lb_guidedstep_entry_animation_duration">250</integer>
@@ -267,4 +267,11 @@
     <integer name="lb_guidedactions_item_description_min_lines">2</integer>
     <!-- end GuidedStepFragment -->
 
+    <!-- height for picker item. -->
+    <dimen name="picker_item_height">64dp</dimen>
+    <!-- picker column horizontal padding-->
+    <dimen name="picker_column_horizontal_padding">8dp</dimen>
+    <!-- picker separator horizontal padding -->
+    <dimen name="picker_separator_horizontal_padding">4dp</dimen>
+
 </resources>
diff --git a/v17/leanback/res/values/ids.xml b/v17/leanback/res/values/ids.xml
index ca84efc..98ac1fd 100644
--- a/v17/leanback/res/values/ids.xml
+++ b/v17/leanback/res/values/ids.xml
@@ -35,10 +35,4 @@
      <item type="id" name="lb_control_high_quality" />
      <item type="id" name="lb_control_closed_captioning" />
 
-      <item type="id" name="guidedactions_root2" />
-      <item type="id" name="guidedactions_list_background2" />
-      <item type="id" name="guidedactions_list2" />
-      <item type="id" name="guidedactions_selector2" />
-      <item type="id" name="guidedactions_content2" />
-
 </resources>
diff --git a/v17/leanback/res/values/strings.xml b/v17/leanback/res/values/strings.xml
index 3d93db2..7ae7a00 100644
--- a/v17/leanback/res/values/strings.xml
+++ b/v17/leanback/res/values/strings.xml
@@ -79,4 +79,10 @@
     <string name="lb_guidedaction_finish_title">Finish</string>
     <!-- Title of standard Continue action for GuidedStepFragment -->
     <string name="lb_guidedaction_continue_title">Continue</string>
+
+    <!-- Separator for date picker [CHAR LIMIT=2] -->
+    <string name="lb_date_separator">/</string>
+    <!-- Separator for time picker [CHAR LIMIT=2] -->
+    <string name="lb_time_separator">:</string>
+
 </resources>
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index 3904467..fb8c0b1 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -144,6 +144,7 @@
         <item name="android:fontFamily">sans-serif-condensed</item>
         <item name="android:textColor">@color/lb_basic_card_title_text_color</item>
         <item name="android:textSize">@dimen/lb_basic_card_title_text_size</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:ellipsize">end</item>
     </style>
 
@@ -158,6 +159,7 @@
         <item name="android:fontFamily">sans-serif-condensed</item>
         <item name="android:textColor">@color/lb_basic_card_content_text_color</item>
         <item name="android:textSize">@dimen/lb_basic_card_content_text_size</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:ellipsize">none</item>
     </style>
 
@@ -175,6 +177,7 @@
         <item name="android:singleLine">true</item>
         <item name="android:gravity">end</item>
         <item name="android:ellipsize">end</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.Title</item>
     </style>
 
@@ -208,6 +211,7 @@
         <item name="android:minHeight">@dimen/lb_browse_header_height</item>
         <item name="android:minWidth">1dp</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.Header</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:singleLine">true</item>
         <item name="android:ellipsize">none</item>
     </style>
@@ -262,6 +266,7 @@
     </style>
 
     <style name="Widget.Leanback.Row.HoverCardTitle" >
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.Row.HoverCardTitle</item>
         <item name="android:maxWidth">@dimen/lb_browse_row_hovercard_max_width</item>
         <item name="android:singleLine">true</item>
@@ -269,6 +274,7 @@
     </style>
 
     <style name="Widget.Leanback.Row.HoverCardDescription" >
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.Row.HoverCardDescription</item>
         <item name="android:maxWidth">@dimen/lb_browse_row_hovercard_max_width</item>
         <item name="android:ellipsize">end</item>
@@ -276,6 +282,7 @@
     </style>
 
     <style name="Widget.Leanback.DetailsDescriptionTitleStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.DetailsDescriptionTitle</item>
         <item name="android:maxLines">@integer/lb_details_description_title_max_lines</item>
         <item name="android:includeFontPadding">false</item>
@@ -287,6 +294,7 @@
     </style>
 
     <style name="Widget.Leanback.DetailsDescriptionSubtitleStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.DetailsDescriptionSubtitle</item>
         <item name="android:maxLines">@integer/lb_details_description_subtitle_max_lines</item>
         <item name="android:includeFontPadding">false</item>
@@ -294,6 +302,7 @@
     </style>
 
     <style name="Widget.Leanback.DetailsDescriptionBodyStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.DetailsDescriptionBody</item>
         <item name="android:includeFontPadding">false</item>
         <item name="android:ellipsize">end</item>
@@ -303,6 +312,7 @@
     </style>
 
     <style name="Widget.Leanback.DetailsActionButtonStyle" parent="Widget.Leanback.DetailsActionButtonStyleBase">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.DetailsActionButton</item>
         <item name="android:includeFontPadding">false</item>
         <item name="android:drawablePadding">@dimen/lb_action_icon_margin</item>
@@ -318,14 +328,17 @@
     </style>
 
     <style name="Widget.Leanback.PlaybackControlLabelStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.PlaybackControlLabel</item>
     </style>
 
     <style name="Widget.Leanback.PlaybackControlsTimeStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.PlaybackControlsTime</item>
     </style>
 
     <style name="Widget.Leanback.ErrorMessageStyle">
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@style/TextAppearance.Leanback.ErrorMessage</item>
         <item name="android:includeFontPadding">false</item>
         <item name="android:maxLines">@integer/lb_error_message_max_lines</item>
@@ -380,6 +393,7 @@
         <item name="android:paddingTop">2dp</item>
         <item name="android:textColor">#FFF1F1F1</item>
         <item name="android:textSize">36sp</item>
+        <item name="android:textAlignment">viewEnd</item>
     </style>
 
     <!-- Style for the description view in a GuidanceStylist's default layout. -->
@@ -396,6 +410,7 @@
         <item name="android:textColor">#88F1F1F1</item>
         <item name="android:textSize">14sp</item>
         <item name="android:lineSpacingExtra">3dp</item>
+        <item name="android:textAlignment">viewEnd</item>
     </style>
 
     <!-- Style for the breadcrumb view in a GuidanceStylist's default layout. -->
@@ -410,6 +425,8 @@
         <item name="android:singleLine">true</item>
         <item name="android:textColor">#88F1F1F1</item>
         <item name="android:textSize">18sp</item>
+        <item name="android:gravity">end</item>
+        <item name="android:textAlignment">viewEnd</item>
     </style>
 
     <!-- Style for the icon view in a GuidanceStylist's default layout. -->
@@ -423,27 +440,40 @@
         <item name="android:scaleType">fitCenter</item>
     </style>
 
-    <!-- Style for the selector view in a GuidedActionsStylist's default layout. -->
-    <style name="Widget.Leanback.GuidedActionsSelectorStyle">
-        <item name="android:layout_width">match_parent</item>
-        <item name="android:layout_height">@dimen/lb_guidedactions_selector_min_height</item>
-        <item name="android:layout_centerVertical">true</item>
-        <item name="android:background">@color/lb_guidedactions_selector_color</item>
-    </style>
-
     <!-- Style for the vertical grid of actions in a GuidedActionsStylist's default layout. -->
     <style name="Widget.Leanback.GuidedActionsListStyle">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">match_parent</item>
         <item name="android:focusable">true</item>
+        <item name="android:focusableInTouchMode">true</item>
+        <item name="focusOutEnd">true</item>
+        <item name="focusOutFront">false</item>
+        <item name="focusOutSideStart">false</item>
+        <item name="focusOutSideEnd">true</item>
     </style>
 
+    <!-- Style for the vertical grid of sub actions in a GuidedActionsStylist's default layout. -->
+    <style name="Widget.Leanback.GuidedSubActionsListStyle" parent="Widget.Leanback.GuidedActionsListStyle">
+        <item name="focusOutEnd">false</item>
+        <item name="focusOutFront">true</item>
+        <item name="focusOutSideStart">false</item>
+        <item name="focusOutSideEnd">false</item>
+        <item name="android:layout_marginBottom">@dimen/lb_guidedactions_sublist_bottom_margin</item>
+    </style>
+
+    <!-- Style for the vertical grid of button actions in a GuidedActionsStylist's default layout. -->
+    <style name="Widget.Leanback.GuidedButtonActionsListStyle" parent="Widget.Leanback.GuidedActionsListStyle">
+        <item name="focusOutSideStart">true</item>
+        <item name="focusOutSideEnd">false</item>
+    </style>
 
     <!-- Style for an action's container in a GuidedActionsStylist's default item layout. -->
     <style name="Widget.Leanback.GuidedActionItemContainerStyle">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
+        <item name="android:foreground">?attr/guidedActionsSelectorDrawable</item>
         <item name="android:focusable">true</item>
+        <item name="android:focusableInTouchMode">true</item>
         <item name="android:minHeight">@dimen/lb_guidedactions_item_min_height</item>
         <item name="android:paddingBottom">@dimen/lb_guidedactions_vertical_padding</item>
         <item name="android:paddingStart">@dimen/lb_guidedactions_item_start_padding</item>
@@ -490,6 +520,7 @@
         <item name="android:maxLines">@integer/lb_guidedactions_item_title_min_lines</item>
         <item name="android:textColor">@color/lb_guidedactions_item_unselected_text_color</item>
         <item name="android:textSize">@dimen/lb_guidedactions_item_title_font_size</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:background">@null</item>
     </style>
 
@@ -503,6 +534,7 @@
         <item name="android:maxLines">@integer/lb_guidedactions_item_description_min_lines</item>
         <item name="android:textColor">@color/lb_guidedactions_item_unselected_text_color</item>
         <item name="android:textSize">@dimen/lb_guidedactions_item_description_font_size</item>
+        <item name="android:textAlignment">viewStart</item>
         <item name="android:visibility">gone</item>
         <item name="android:background">@null</item>
     </style>
@@ -518,4 +550,9 @@
         <item name="android:visibility">gone</item>
     </style>
 
+    <!-- deprecated style, do not use -->
+    <style name="Widget.Leanback.GuidedActionsContainerStyle"></style>
+    <!-- deprecated style, do not use -->
+    <style name="Widget.Leanback.GuidedActionsSelectorStyle"></style>
+
 </resources>
diff --git a/v17/leanback/res/values/themes.xml b/v17/leanback/res/values/themes.xml
index 36362dd..50835a3 100644
--- a/v17/leanback/res/values/themes.xml
+++ b/v17/leanback/res/values/themes.xml
@@ -139,10 +139,10 @@
         <item name="guidedActionsElevation">@dimen/lb_guidedactions_elevation</item>
         <item name="guidedActionsBackground">@color/lb_guidedactions_background</item>
         <item name="guidedActionsBackgroundDark">@color/lb_guidedactions_background_dark</item>
-        <item name="guidedActionsSelectorStyle">@style/Widget.Leanback.GuidedActionsSelectorStyle</item>
+        <item name="guidedActionsSelectorDrawable">?android:attr/selectableItemBackground</item>
         <item name="guidedActionsListStyle">@style/Widget.Leanback.GuidedActionsListStyle</item>
-        <item name="guidedActionsSelectorShowAnimation">@animator/lb_guidedactions_selector_show</item>
-        <item name="guidedActionsSelectorHideAnimation">@animator/lb_guidedactions_selector_hide</item>
+        <item name="guidedSubActionsListStyle">@style/Widget.Leanback.GuidedSubActionsListStyle</item>
+        <item name="guidedButtonActionsListStyle">@style/Widget.Leanback.GuidedButtonActionsListStyle</item>
 
         <item name="guidedActionItemContainerStyle">@style/Widget.Leanback.GuidedActionItemContainerStyle</item>
         <item name="guidedActionItemCheckmarkStyle">@style/Widget.Leanback.GuidedActionItemCheckmarkStyle</item>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
index a84f7e7..afc523b 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
@@ -131,6 +131,14 @@
     }
 
     /**
+     * Gets position of currently selected row.
+     * @return Position of currently selected row.
+     */
+    public int getSelectedPosition() {
+        return mSelectedPosition;
+    }
+
+    /**
      * Sets the selected row position.
      */
     public void setSelectedPosition(int position, boolean smooth) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
index 753a01c..8df16ff 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
@@ -133,6 +133,14 @@
     }
 
     /**
+     * Gets position of currently selected row.
+     * @return Position of currently selected row.
+     */
+    public int getSelectedPosition() {
+        return mSelectedPosition;
+    }
+
+    /**
      * Sets the selected row position.
      */
     public void setSelectedPosition(int position, boolean smooth) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
index 8c417a4..07eeccd 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
@@ -25,6 +25,7 @@
 import android.support.v17.leanback.widget.OnItemViewSelectedListener;
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.PresenterViewHolderTask;
 import android.support.v17.leanback.widget.RowHeaderPresenter;
 import android.support.v17.leanback.widget.RowPresenter;
 import android.support.v17.leanback.widget.TitleView;
@@ -335,6 +336,22 @@
     }
 
     /**
+     * Get currently bound RowsFragment or null if BrowseFragment has not been created yet.
+     * @return Currently bound RowsFragment or null if BrowseFragment has not been created yet.
+     */
+    public RowsFragment getRowsFragment() {
+        return mRowsFragment;
+    }
+
+    /**
+     * Get currently bound HeadersFragment or null if HeadersFragment has not been created yet.
+     * @return Currently bound HeadersFragment or null if HeadersFragment has not been created yet.
+     */
+    public HeadersFragment getHeadersFragment() {
+        return mHeadersFragment;
+    }
+
+    /**
      * Sets an item clicked listener on the fragment.
      * OnItemViewClickedListener will override {@link View.OnClickListener} that
      * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
@@ -444,7 +461,7 @@
         });
     }
 
-    private boolean isVerticalScrolling() {
+    boolean isVerticalScrolling() {
         // don't run transition
         return mHeadersFragment.getVerticalGridView().getScrollState()
                 != HorizontalGridView.SCROLL_STATE_IDLE
@@ -779,6 +796,25 @@
     }
 
     /**
+     * Gets position of currently selected row.
+     * @return Position of currently selected row.
+     */
+    public int getSelectedPosition() {
+        return mSelectedPosition;
+    }
+
+    /**
+     * Gets currently selected row ViewHolder.
+     * @return Currently selected row ViewHolder.
+     */
+    public RowPresenter.ViewHolder getSelectedRowViewHolder() {
+        if (mRowsFragment == null) {
+            return null;
+        }
+        return mRowsFragment.getSelectedRowViewHolder();
+    }
+
+    /**
      * Sets the selected row position.
      */
     public void setSelectedPosition(int position, boolean smooth) {
@@ -786,6 +822,29 @@
                 position, SetSelectionRunnable.TYPE_USER_REQUEST, smooth);
     }
 
+    /**
+     * Selects a Row and perform an optional task on the Row. For example
+     * <code>setSelectedPosition(10, true, new ListRowPresenterSelectItemViewHolderTask(5))</code>
+     * scrolls to 11th row and selects 6th item on that row.  The method will be ignored if
+     * RowsFragment has not been created (i.e. before {@link #onCreateView(LayoutInflater,
+     * ViewGroup, Bundle)}).
+     *
+     * @param rowPosition Which row to select.
+     * @param smooth True to scroll to the row, false for no animation.
+     * @param rowHolderTask Optional task to perform on the Row.  When the task is not null, headers
+     * fragment will be collapsed.
+     */
+    public void setSelectedPosition(int rowPosition, boolean smooth,
+            final PresenterViewHolderTask rowHolderTask) {
+        if (mRowsFragment == null) {
+            return;
+        }
+        if (rowHolderTask != null) {
+            startHeadersTransition(false);
+        }
+        mRowsFragment.setSelectedPosition(rowPosition, smooth, rowHolderTask);
+    }
+
     @Override
     public void onStart() {
         super.onStart();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
index fa7f61e..9b88685 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
@@ -27,6 +27,7 @@
 import android.support.v17.leanback.widget.OnItemViewSelectedListener;
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.PresenterViewHolderTask;
 import android.support.v17.leanback.widget.RowHeaderPresenter;
 import android.support.v17.leanback.widget.RowPresenter;
 import android.support.v17.leanback.widget.TitleView;
@@ -337,6 +338,22 @@
     }
 
     /**
+     * Get currently bound RowsSupportFragment or null if BrowseSupportFragment has not been created yet.
+     * @return Currently bound RowsSupportFragment or null if BrowseSupportFragment has not been created yet.
+     */
+    public RowsSupportFragment getRowsSupportFragment() {
+        return mRowsSupportFragment;
+    }
+
+    /**
+     * Get currently bound HeadersSupportFragment or null if HeadersSupportFragment has not been created yet.
+     * @return Currently bound HeadersSupportFragment or null if HeadersSupportFragment has not been created yet.
+     */
+    public HeadersSupportFragment getHeadersSupportFragment() {
+        return mHeadersSupportFragment;
+    }
+
+    /**
      * Sets an item clicked listener on the fragment.
      * OnItemViewClickedListener will override {@link View.OnClickListener} that
      * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
@@ -446,7 +463,7 @@
         });
     }
 
-    private boolean isVerticalScrolling() {
+    boolean isVerticalScrolling() {
         // don't run transition
         return mHeadersSupportFragment.getVerticalGridView().getScrollState()
                 != HorizontalGridView.SCROLL_STATE_IDLE
@@ -781,6 +798,25 @@
     }
 
     /**
+     * Gets position of currently selected row.
+     * @return Position of currently selected row.
+     */
+    public int getSelectedPosition() {
+        return mSelectedPosition;
+    }
+
+    /**
+     * Gets currently selected row ViewHolder.
+     * @return Currently selected row ViewHolder.
+     */
+    public RowPresenter.ViewHolder getSelectedRowViewHolder() {
+        if (mRowsSupportFragment == null) {
+            return null;
+        }
+        return mRowsSupportFragment.getSelectedRowViewHolder();
+    }
+
+    /**
      * Sets the selected row position.
      */
     public void setSelectedPosition(int position, boolean smooth) {
@@ -788,6 +824,29 @@
                 position, SetSelectionRunnable.TYPE_USER_REQUEST, smooth);
     }
 
+    /**
+     * Selects a Row and perform an optional task on the Row. For example
+     * <code>setSelectedPosition(10, true, new ListRowPresenterSelectItemViewHolderTask(5))</code>
+     * scrolls to 11th row and selects 6th item on that row.  The method will be ignored if
+     * RowsSupportFragment has not been created (i.e. before {@link #onCreateView(LayoutInflater,
+     * ViewGroup, Bundle)}).
+     *
+     * @param rowPosition Which row to select.
+     * @param smooth True to scroll to the row, false for no animation.
+     * @param rowHolderTask Optional task to perform on the Row.  When the task is not null, headers
+     * fragment will be collapsed.
+     */
+    public void setSelectedPosition(int rowPosition, boolean smooth,
+            final PresenterViewHolderTask rowHolderTask) {
+        if (mRowsSupportFragment == null) {
+            return;
+        }
+        if (rowHolderTask != null) {
+            startHeadersTransition(false);
+        }
+        mRowsSupportFragment.setSelectedPosition(rowPosition, smooth, rowHolderTask);
+    }
+
     @Override
     public void onStart() {
         super.onStart();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
index ddafd5f..2a1c88c 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -81,6 +81,9 @@
 
         @Override
         public void run() {
+            if (mRowsFragment == null) {
+                return;
+            }
             mRowsFragment.setSelectedPosition(mPosition, mSmooth);
         }
     }
@@ -273,7 +276,12 @@
         return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView();
     }
 
-    RowsFragment getRowsFragment() {
+    /**
+     * Gets embedded RowsFragment showing multiple rows for DetailsFragment.  If view of
+     * DetailsFragment is not created, the method returns null.
+     * @return Embedded RowsFragment showing multiple rows for DetailsFragment.
+     */
+    public RowsFragment getRowsFragment() {
         return mRowsFragment;
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
index 7532d79..3dce62c 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
@@ -83,6 +83,9 @@
 
         @Override
         public void run() {
+            if (mRowsSupportFragment == null) {
+                return;
+            }
             mRowsSupportFragment.setSelectedPosition(mPosition, mSmooth);
         }
     }
@@ -275,7 +278,12 @@
         return mRowsSupportFragment == null ? null : mRowsSupportFragment.getVerticalGridView();
     }
 
-    RowsSupportFragment getRowsSupportFragment() {
+    /**
+     * Gets embedded RowsSupportFragment showing multiple rows for DetailsSupportFragment.  If view of
+     * DetailsSupportFragment is not created, the method returns null.
+     * @return Embedded RowsSupportFragment showing multiple rows for DetailsSupportFragment.
+     */
+    public RowsSupportFragment getRowsSupportFragment() {
         return mRowsSupportFragment;
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
index 8be8f24..8bb8634 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -30,8 +30,11 @@
 import android.support.v17.leanback.widget.GuidanceStylist;
 import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
 import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionAdapter;
+import android.support.v17.leanback.widget.GuidedActionAdapterGroup;
 import android.support.v17.leanback.widget.GuidedActionsStylist;
 import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v17.leanback.widget.ViewHolderTask;
 import android.support.v4.app.ActivityCompat;
 import android.support.v7.widget.RecyclerView;
 import android.util.AttributeSet;
@@ -49,6 +52,7 @@
 import android.widget.TextView;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -138,8 +142,7 @@
  * @see GuidedAction
  * @see GuidedActionsStylist
  */
-public class GuidedStepFragment extends Fragment implements GuidedActionAdapter.ClickListener,
-        GuidedActionAdapter.FocusListener {
+public class GuidedStepFragment extends Fragment implements GuidedActionAdapter.FocusListener {
 
     private static final String TAG_LEAN_BACK_ACTIONS_FRAGMENT = "leanBackGuidedStepFragment";
     private static final String EXTRA_ACTION_SELECTED_INDEX = "selectedIndex";
@@ -148,6 +151,8 @@
 
     private static final String ENTRY_NAME_ENTRANCE = "GuidedStepEntrance";
 
+    private static final boolean IS_FRAMEWORK_FRAGMENT = true;
+
     /**
      * Fragment argument name for UI style.  The argument value is persisted in fragment state.
      * The value is initially {@link #UI_STYLE_ENTRANCE} and might be changed in one of the three
@@ -206,12 +211,26 @@
     private static final String TAG = "GuidedStepFragment";
     private static final boolean DEBUG = false;
 
+    /**
+     * @hide
+     */
+    public static class DummyFragment extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            final View v = new View(inflater.getContext());
+            v.setVisibility(View.GONE);
+            return v;
+        }
+    }
+
     private int mTheme;
     private ContextThemeWrapper mThemeWrapper;
     private GuidanceStylist mGuidanceStylist;
     private GuidedActionsStylist mActionsStylist;
     private GuidedActionsStylist mButtonActionsStylist;
     private GuidedActionAdapter mAdapter;
+    private GuidedActionAdapter mSubAdapter;
     private GuidedActionAdapter mButtonAdapter;
     private GuidedActionAdapterGroup mAdapterGroup;
     private List<GuidedAction> mActions = new ArrayList<GuidedAction>();
@@ -253,7 +272,9 @@
      * @return The GuidedActionsStylist used in this fragment.
      */
     public GuidedActionsStylist onCreateButtonActionsStylist() {
-        return new GuidedActionsStylist();
+        GuidedActionsStylist stylist = new GuidedActionsStylist();
+        stylist.setAsButtonActions();
+        return stylist;
     }
 
     /**
@@ -302,11 +323,56 @@
      * order to act on the user's decisions.
      * @param action The chosen action.
      */
-    @Override
     public void onGuidedActionClicked(GuidedAction action) {
     }
 
     /**
+     * Callback invoked when an action in sub actions is taken by the user. Subclasses should
+     * override in order to act on the user's decisions.  Default return value is true to close
+     * the sub actions list.
+     * @param action The chosen action.
+     * @return true to collapse the sub actions list, false to keep it expanded.
+     */
+    public boolean onSubGuidedActionClicked(GuidedAction action) {
+        return true;
+    }
+
+    /**
+     * @return True if the sub actions list is expanded, false otherwise.
+     */
+    public boolean isSubActionsExpanded() {
+        return mActionsStylist.isSubActionsExpanded();
+    }
+
+    /**
+     * Expand a given action's sub actions list.
+     * @param action GuidedAction to expand.
+     * @see GuidedAction#getSubActions()
+     */
+    public void expandSubActions(GuidedAction action) {
+        final int actionPosition = mActions.indexOf(action);
+        if (actionPosition < 0) {
+            return;
+        }
+        mActionsStylist.getActionsGridView().setSelectedPositionSmooth(actionPosition,
+                new ViewHolderTask() {
+            @Override
+            public void run(RecyclerView.ViewHolder vh) {
+                GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder) vh;
+                mActionsStylist.setExpandedViewHolder(avh);
+            }
+        });
+    }
+
+    /**
+     * Collapse sub actions list.
+     * @see GuidedAction#getSubActions()
+     */
+    public void collapseSubActions() {
+        mActionsStylist.setExpandedViewHolder(null);
+    }
+
+    /**
      * Callback invoked when an action is focused (made to be the current selection) by the user.
      */
     @Override
@@ -373,6 +439,13 @@
     public static int add(FragmentManager fragmentManager, GuidedStepFragment fragment, int id) {
         GuidedStepFragment current = getCurrentGuidedStepFragment(fragmentManager);
         boolean inGuidedStep = current != null;
+        if (IS_FRAMEWORK_FRAGMENT && Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23
+                && !inGuidedStep) {
+            // workaround b/22631964 for framework fragment
+            fragmentManager.beginTransaction()
+                .replace(id, new DummyFragment(), TAG_LEAN_BACK_ACTIONS_FRAGMENT)
+                .commit();
+        }
         FragmentTransaction ft = fragmentManager.beginTransaction();
 
         fragment.setUiStyle(inGuidedStep ? UI_STYLE_REPLACE : UI_STYLE_ENTRANCE);
@@ -407,16 +480,12 @@
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_root), "guidedactions_root");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
-                R.id.guidedactions_selector), "guidedactions_selector");
-        TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_content), "guidedactions_content");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_list_background), "guidedactions_list_background");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_root2), "guidedactions_root2");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
-                R.id.guidedactions_selector2), "guidedactions_selector2");
-        TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_content2), "guidedactions_content2");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_list_background2), "guidedactions_list_background2");
@@ -871,6 +940,7 @@
         mActionsStylist.onDestroyView();
         mButtonActionsStylist.onDestroyView();
         mAdapter = null;
+        mSubAdapter =  null;
         mButtonAdapter = null;
         mAdapterGroup = null;
         super.onDestroyView();
@@ -900,7 +970,6 @@
         actionContainer.addView(actionsView);
 
         View buttonActionsView = mButtonActionsStylist.onCreateView(inflater, actionContainer);
-        mButtonActionsStylist.setAsButtonActions();
         actionContainer.addView(buttonActionsView);
 
         GuidedActionAdapter.EditListener editListener = new GuidedActionAdapter.EditListener() {
@@ -921,14 +990,44 @@
                 }
         };
 
-        mAdapter = new GuidedActionAdapter(mActions, this, this, mActionsStylist);
-        mButtonAdapter = new GuidedActionAdapter(mButtonActions, this, this, mButtonActionsStylist);
+        mAdapter = new GuidedActionAdapter(mActions, new GuidedActionAdapter.ClickListener() {
+            @Override
+            public void onGuidedActionClicked(GuidedAction action) {
+                GuidedStepFragment.this.onGuidedActionClicked(action);
+                if (isSubActionsExpanded()) {
+                    collapseSubActions();
+                } else if (action.hasSubActions()) {
+                    expandSubActions(action);
+                }
+            }
+        }, this, mActionsStylist, false);
+        mButtonAdapter =
+                new GuidedActionAdapter(mButtonActions, new GuidedActionAdapter.ClickListener() {
+                    @Override
+                    public void onGuidedActionClicked(GuidedAction action) {
+                        GuidedStepFragment.this.onGuidedActionClicked(action);
+                    }
+                }, this, mButtonActionsStylist, false);
+        mSubAdapter = new GuidedActionAdapter(null, new GuidedActionAdapter.ClickListener() {
+            @Override
+            public void onGuidedActionClicked(GuidedAction action) {
+                if (mActionsStylist.isInExpandTransition()) {
+                    return;
+                }
+                if (GuidedStepFragment.this.onSubGuidedActionClicked(action)) {
+                    collapseSubActions();
+                }
+            }
+        }, this, mActionsStylist, true);
         mAdapterGroup = new GuidedActionAdapterGroup();
-        mAdapterGroup.addAdpter(mAdapter);
-        mAdapterGroup.addAdpter(mButtonAdapter);
+        mAdapterGroup.addAdpter(mAdapter, mButtonAdapter);
+        mAdapterGroup.addAdpter(mSubAdapter, null);
         mAdapterGroup.setEditListener(editListener);
 
         mActionsStylist.getActionsGridView().setAdapter(mAdapter);
+        if (mActionsStylist.getSubActionsGridView() != null) {
+            mActionsStylist.getSubActionsGridView().setAdapter(mSubAdapter);
+        }
         mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
         if (mButtonActions.size() == 0) {
             // when there is no button actions, we dont need show the second panel, but keep
@@ -969,7 +1068,11 @@
     @Override
     public void onResume() {
         super.onResume();
-        mActionsStylist.getActionsGridView().requestFocus();
+        if (mActionsStylist.isSubActionsExpanded()) {
+            mActionsStylist.getSubActionsGridView().requestFocus();
+        } else {
+            mActionsStylist.getActionsGridView().requestFocus();
+        }
     }
 
     /**
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
index ad186ff..b378444 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
@@ -32,8 +32,11 @@
 import android.support.v17.leanback.widget.GuidanceStylist;
 import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
 import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionAdapter;
+import android.support.v17.leanback.widget.GuidedActionAdapterGroup;
 import android.support.v17.leanback.widget.GuidedActionsStylist;
 import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v17.leanback.widget.ViewHolderTask;
 import android.support.v4.app.ActivityCompat;
 import android.support.v7.widget.RecyclerView;
 import android.util.AttributeSet;
@@ -51,6 +54,7 @@
 import android.widget.TextView;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -140,8 +144,7 @@
  * @see GuidedAction
  * @see GuidedActionsStylist
  */
-public class GuidedStepSupportFragment extends Fragment implements GuidedActionAdapter.ClickListener,
-        GuidedActionAdapter.FocusListener {
+public class GuidedStepSupportFragment extends Fragment implements GuidedActionAdapter.FocusListener {
 
     private static final String TAG_LEAN_BACK_ACTIONS_FRAGMENT = "leanBackGuidedStepSupportFragment";
     private static final String EXTRA_ACTION_SELECTED_INDEX = "selectedIndex";
@@ -150,6 +153,8 @@
 
     private static final String ENTRY_NAME_ENTRANCE = "GuidedStepEntrance";
 
+    private static final boolean IS_FRAMEWORK_FRAGMENT = false;
+
     /**
      * Fragment argument name for UI style.  The argument value is persisted in fragment state.
      * The value is initially {@link #UI_STYLE_ENTRANCE} and might be changed in one of the three
@@ -208,12 +213,26 @@
     private static final String TAG = "GuidedStepSupportFragment";
     private static final boolean DEBUG = false;
 
+    /**
+     * @hide
+     */
+    public static class DummyFragment extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            final View v = new View(inflater.getContext());
+            v.setVisibility(View.GONE);
+            return v;
+        }
+    }
+
     private int mTheme;
     private ContextThemeWrapper mThemeWrapper;
     private GuidanceStylist mGuidanceStylist;
     private GuidedActionsStylist mActionsStylist;
     private GuidedActionsStylist mButtonActionsStylist;
     private GuidedActionAdapter mAdapter;
+    private GuidedActionAdapter mSubAdapter;
     private GuidedActionAdapter mButtonAdapter;
     private GuidedActionAdapterGroup mAdapterGroup;
     private List<GuidedAction> mActions = new ArrayList<GuidedAction>();
@@ -255,7 +274,9 @@
      * @return The GuidedActionsStylist used in this fragment.
      */
     public GuidedActionsStylist onCreateButtonActionsStylist() {
-        return new GuidedActionsStylist();
+        GuidedActionsStylist stylist = new GuidedActionsStylist();
+        stylist.setAsButtonActions();
+        return stylist;
     }
 
     /**
@@ -304,11 +325,56 @@
      * order to act on the user's decisions.
      * @param action The chosen action.
      */
-    @Override
     public void onGuidedActionClicked(GuidedAction action) {
     }
 
     /**
+     * Callback invoked when an action in sub actions is taken by the user. Subclasses should
+     * override in order to act on the user's decisions.  Default return value is true to close
+     * the sub actions list.
+     * @param action The chosen action.
+     * @return true to collapse the sub actions list, false to keep it expanded.
+     */
+    public boolean onSubGuidedActionClicked(GuidedAction action) {
+        return true;
+    }
+
+    /**
+     * @return True if the sub actions list is expanded, false otherwise.
+     */
+    public boolean isSubActionsExpanded() {
+        return mActionsStylist.isSubActionsExpanded();
+    }
+
+    /**
+     * Expand a given action's sub actions list.
+     * @param action GuidedAction to expand.
+     * @see GuidedAction#getSubActions()
+     */
+    public void expandSubActions(GuidedAction action) {
+        final int actionPosition = mActions.indexOf(action);
+        if (actionPosition < 0) {
+            return;
+        }
+        mActionsStylist.getActionsGridView().setSelectedPositionSmooth(actionPosition,
+                new ViewHolderTask() {
+            @Override
+            public void run(RecyclerView.ViewHolder vh) {
+                GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder) vh;
+                mActionsStylist.setExpandedViewHolder(avh);
+            }
+        });
+    }
+
+    /**
+     * Collapse sub actions list.
+     * @see GuidedAction#getSubActions()
+     */
+    public void collapseSubActions() {
+        mActionsStylist.setExpandedViewHolder(null);
+    }
+
+    /**
      * Callback invoked when an action is focused (made to be the current selection) by the user.
      */
     @Override
@@ -375,6 +441,13 @@
     public static int add(FragmentManager fragmentManager, GuidedStepSupportFragment fragment, int id) {
         GuidedStepSupportFragment current = getCurrentGuidedStepSupportFragment(fragmentManager);
         boolean inGuidedStep = current != null;
+        if (IS_FRAMEWORK_FRAGMENT && Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23
+                && !inGuidedStep) {
+            // workaround b/22631964 for framework fragment
+            fragmentManager.beginTransaction()
+                .replace(id, new DummyFragment(), TAG_LEAN_BACK_ACTIONS_FRAGMENT)
+                .commit();
+        }
         FragmentTransaction ft = fragmentManager.beginTransaction();
 
         fragment.setUiStyle(inGuidedStep ? UI_STYLE_REPLACE : UI_STYLE_ENTRANCE);
@@ -409,16 +482,12 @@
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_root), "guidedactions_root");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
-                R.id.guidedactions_selector), "guidedactions_selector");
-        TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_content), "guidedactions_content");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_list_background), "guidedactions_list_background");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_root2), "guidedactions_root2");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
-                R.id.guidedactions_selector2), "guidedactions_selector2");
-        TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_content2), "guidedactions_content2");
         TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
                 R.id.guidedactions_list_background2), "guidedactions_list_background2");
@@ -873,6 +942,7 @@
         mActionsStylist.onDestroyView();
         mButtonActionsStylist.onDestroyView();
         mAdapter = null;
+        mSubAdapter =  null;
         mButtonAdapter = null;
         mAdapterGroup = null;
         super.onDestroyView();
@@ -902,7 +972,6 @@
         actionContainer.addView(actionsView);
 
         View buttonActionsView = mButtonActionsStylist.onCreateView(inflater, actionContainer);
-        mButtonActionsStylist.setAsButtonActions();
         actionContainer.addView(buttonActionsView);
 
         GuidedActionAdapter.EditListener editListener = new GuidedActionAdapter.EditListener() {
@@ -923,14 +992,44 @@
                 }
         };
 
-        mAdapter = new GuidedActionAdapter(mActions, this, this, mActionsStylist);
-        mButtonAdapter = new GuidedActionAdapter(mButtonActions, this, this, mButtonActionsStylist);
+        mAdapter = new GuidedActionAdapter(mActions, new GuidedActionAdapter.ClickListener() {
+            @Override
+            public void onGuidedActionClicked(GuidedAction action) {
+                GuidedStepSupportFragment.this.onGuidedActionClicked(action);
+                if (isSubActionsExpanded()) {
+                    collapseSubActions();
+                } else if (action.hasSubActions()) {
+                    expandSubActions(action);
+                }
+            }
+        }, this, mActionsStylist, false);
+        mButtonAdapter =
+                new GuidedActionAdapter(mButtonActions, new GuidedActionAdapter.ClickListener() {
+                    @Override
+                    public void onGuidedActionClicked(GuidedAction action) {
+                        GuidedStepSupportFragment.this.onGuidedActionClicked(action);
+                    }
+                }, this, mButtonActionsStylist, false);
+        mSubAdapter = new GuidedActionAdapter(null, new GuidedActionAdapter.ClickListener() {
+            @Override
+            public void onGuidedActionClicked(GuidedAction action) {
+                if (mActionsStylist.isInExpandTransition()) {
+                    return;
+                }
+                if (GuidedStepSupportFragment.this.onSubGuidedActionClicked(action)) {
+                    collapseSubActions();
+                }
+            }
+        }, this, mActionsStylist, true);
         mAdapterGroup = new GuidedActionAdapterGroup();
-        mAdapterGroup.addAdpter(mAdapter);
-        mAdapterGroup.addAdpter(mButtonAdapter);
+        mAdapterGroup.addAdpter(mAdapter, mButtonAdapter);
+        mAdapterGroup.addAdpter(mSubAdapter, null);
         mAdapterGroup.setEditListener(editListener);
 
         mActionsStylist.getActionsGridView().setAdapter(mAdapter);
+        if (mActionsStylist.getSubActionsGridView() != null) {
+            mActionsStylist.getSubActionsGridView().setAdapter(mSubAdapter);
+        }
         mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
         if (mButtonActions.size() == 0) {
             // when there is no button actions, we dont need show the second panel, but keep
@@ -971,7 +1070,11 @@
     @Override
     public void onResume() {
         super.onResume();
-        mActionsStylist.getActionsGridView().requestFocus();
+        if (mActionsStylist.isSubActionsExpanded()) {
+            mActionsStylist.getSubActionsGridView().requestFocus();
+        } else {
+            mActionsStylist.getActionsGridView().requestFocus();
+        }
     }
 
     /**
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
index 219bb98..fda899f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
@@ -16,6 +16,7 @@
 
 import android.content.Context;
 import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
@@ -139,8 +140,13 @@
             FocusHighlightHelper.setupHeaderItemFocusHighlight(listView);
         }
         if (mBackgroundColorSet) {
-            view.setBackgroundColor(mBackgroundColor);
+            listView.setBackgroundColor(mBackgroundColor);
             updateFadingEdgeToBrandColor(mBackgroundColor);
+        } else {
+            Drawable d = listView.getBackground();
+            if (d instanceof ColorDrawable) {
+                updateFadingEdgeToBrandColor(((ColorDrawable) d).getColor());
+            }
         }
         updateListViewVisibility();
     }
@@ -214,8 +220,8 @@
         mBackgroundColor = color;
         mBackgroundColorSet = true;
 
-        if (getView() != null) {
-            getView().setBackgroundColor(mBackgroundColor);
+        if (getVerticalGridView() != null) {
+            getVerticalGridView().setBackgroundColor(mBackgroundColor);
             updateFadingEdgeToBrandColor(mBackgroundColor);
         }
     }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
index ecf04d8..d998495 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
@@ -141,8 +142,13 @@
             FocusHighlightHelper.setupHeaderItemFocusHighlight(listView);
         }
         if (mBackgroundColorSet) {
-            view.setBackgroundColor(mBackgroundColor);
+            listView.setBackgroundColor(mBackgroundColor);
             updateFadingEdgeToBrandColor(mBackgroundColor);
+        } else {
+            Drawable d = listView.getBackground();
+            if (d instanceof ColorDrawable) {
+                updateFadingEdgeToBrandColor(((ColorDrawable) d).getColor());
+            }
         }
         updateListViewVisibility();
     }
@@ -216,8 +222,8 @@
         mBackgroundColor = color;
         mBackgroundColorSet = true;
 
-        if (getView() != null) {
-            getView().setBackgroundColor(mBackgroundColor);
+        if (getVerticalGridView() != null) {
+            getVerticalGridView().setBackgroundColor(mBackgroundColor);
             updateFadingEdgeToBrandColor(mBackgroundColor);
         }
     }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
index a5a7ccd..b454feb 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
@@ -25,10 +25,12 @@
 import android.support.v17.leanback.widget.RowPresenter.ViewHolder;
 import android.support.v17.leanback.widget.ScaleFrameLayout;
 import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v17.leanback.widget.ViewHolderTask;
 import android.support.v17.leanback.widget.HorizontalGridView;
 import android.support.v17.leanback.widget.RowPresenter;
 import android.support.v17.leanback.widget.ListRowPresenter;
 import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterViewHolderTask;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -191,9 +193,7 @@
                 View view = listView.getChildAt(i);
                 ItemBridgeAdapter.ViewHolder ibvh = (ItemBridgeAdapter.ViewHolder)
                         listView.getChildViewHolder(view);
-                RowPresenter rowPresenter = (RowPresenter) ibvh.getPresenter();
-                RowPresenter.ViewHolder vh = rowPresenter.getRowViewHolder(ibvh.getViewHolder());
-                vh.setOnItemViewSelectedListener(mOnItemViewSelectedListener);
+                getRowViewHolder(ibvh).setOnItemViewSelectedListener(mOnItemViewSelectedListener);
             }
         }
     }
@@ -231,6 +231,29 @@
         }
     }
 
+    /**
+     * Get currently selected row ViewHolder.
+     * @return Currently selected row ViewHolder.
+     */
+    public RowPresenter.ViewHolder getSelectedRowViewHolder() {
+        return getRowViewHolder(mSelectedViewHolder);
+    }
+
+    /**
+     * Get row ViewHolder at adapter position.  Returns null if the row object is not in adapter or
+     * the row object has not been bound to a row view.
+     * @param position Position of row in adapter.
+     * @return Row ViewHolder at a given adapter position.
+     */
+    public RowPresenter.ViewHolder getRowViewHolder(int position) {
+        VerticalGridView verticalView = getVerticalGridView();
+        if (verticalView == null) {
+            return null;
+        }
+        return getRowViewHolder((ItemBridgeAdapter.ViewHolder)
+                verticalView.findViewHolderForAdapterPosition(position));
+    }
+
     @Override
     int getLayoutResourceId() {
         return R.layout.lb_rows_fragment;
@@ -547,4 +570,45 @@
             }
         }
     }
+
+    /**
+     * Selects a Row and perform an optional task on the Row. For example
+     * <code>setSelectedPosition(10, true, new ListRowPresenterSelectItemViewHolderTask(5))</code>
+     * Scroll to 11th row and selects 6th item on that row.  The method will be ignored if
+     * RowsFragment has not been created (i.e. before {@link #onCreateView(LayoutInflater,
+     * ViewGroup, Bundle)}).
+     *
+     * @param rowPosition Which row to select.
+     * @param smooth True to scroll to the row, false for no animation.
+     * @param rowHolderTask Task to perform on the Row.
+     */
+    public void setSelectedPosition(int rowPosition, boolean smooth,
+            final PresenterViewHolderTask rowHolderTask) {
+        VerticalGridView verticalView = getVerticalGridView();
+        if (verticalView == null) {
+            return;
+        }
+        ViewHolderTask task = null;
+        if (rowHolderTask != null) {
+            task = new ViewHolderTask() {
+                @Override
+                public void run(RecyclerView.ViewHolder rvh) {
+                    rowHolderTask.run(getRowViewHolder((ItemBridgeAdapter.ViewHolder) rvh));
+                }
+            };
+        }
+        if (smooth) {
+            verticalView.setSelectedPositionSmooth(rowPosition, task);
+        } else {
+            verticalView.setSelectedPosition(rowPosition, task);
+        }
+    }
+
+    static RowPresenter.ViewHolder getRowViewHolder(ItemBridgeAdapter.ViewHolder ibvh) {
+        if (ibvh == null) {
+            return null;
+        }
+        RowPresenter rowPresenter = (RowPresenter) ibvh.getPresenter();
+        return rowPresenter.getRowViewHolder(ibvh.getViewHolder());
+    }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
index 7390acf..1969780 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
@@ -27,10 +27,12 @@
 import android.support.v17.leanback.widget.RowPresenter.ViewHolder;
 import android.support.v17.leanback.widget.ScaleFrameLayout;
 import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v17.leanback.widget.ViewHolderTask;
 import android.support.v17.leanback.widget.HorizontalGridView;
 import android.support.v17.leanback.widget.RowPresenter;
 import android.support.v17.leanback.widget.ListRowPresenter;
 import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterViewHolderTask;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -193,9 +195,7 @@
                 View view = listView.getChildAt(i);
                 ItemBridgeAdapter.ViewHolder ibvh = (ItemBridgeAdapter.ViewHolder)
                         listView.getChildViewHolder(view);
-                RowPresenter rowPresenter = (RowPresenter) ibvh.getPresenter();
-                RowPresenter.ViewHolder vh = rowPresenter.getRowViewHolder(ibvh.getViewHolder());
-                vh.setOnItemViewSelectedListener(mOnItemViewSelectedListener);
+                getRowViewHolder(ibvh).setOnItemViewSelectedListener(mOnItemViewSelectedListener);
             }
         }
     }
@@ -233,6 +233,29 @@
         }
     }
 
+    /**
+     * Get currently selected row ViewHolder.
+     * @return Currently selected row ViewHolder.
+     */
+    public RowPresenter.ViewHolder getSelectedRowViewHolder() {
+        return getRowViewHolder(mSelectedViewHolder);
+    }
+
+    /**
+     * Get row ViewHolder at adapter position.  Returns null if the row object is not in adapter or
+     * the row object has not been bound to a row view.
+     * @param position Position of row in adapter.
+     * @return Row ViewHolder at a given adapter position.
+     */
+    public RowPresenter.ViewHolder getRowViewHolder(int position) {
+        VerticalGridView verticalView = getVerticalGridView();
+        if (verticalView == null) {
+            return null;
+        }
+        return getRowViewHolder((ItemBridgeAdapter.ViewHolder)
+                verticalView.findViewHolderForAdapterPosition(position));
+    }
+
     @Override
     int getLayoutResourceId() {
         return R.layout.lb_rows_fragment;
@@ -549,4 +572,45 @@
             }
         }
     }
+
+    /**
+     * Selects a Row and perform an optional task on the Row. For example
+     * <code>setSelectedPosition(10, true, new ListRowPresenterSelectItemViewHolderTask(5))</code>
+     * Scroll to 11th row and selects 6th item on that row.  The method will be ignored if
+     * RowsSupportFragment has not been created (i.e. before {@link #onCreateView(LayoutInflater,
+     * ViewGroup, Bundle)}).
+     *
+     * @param rowPosition Which row to select.
+     * @param smooth True to scroll to the row, false for no animation.
+     * @param rowHolderTask Task to perform on the Row.
+     */
+    public void setSelectedPosition(int rowPosition, boolean smooth,
+            final PresenterViewHolderTask rowHolderTask) {
+        VerticalGridView verticalView = getVerticalGridView();
+        if (verticalView == null) {
+            return;
+        }
+        ViewHolderTask task = null;
+        if (rowHolderTask != null) {
+            task = new ViewHolderTask() {
+                @Override
+                public void run(RecyclerView.ViewHolder rvh) {
+                    rowHolderTask.run(getRowViewHolder((ItemBridgeAdapter.ViewHolder) rvh));
+                }
+            };
+        }
+        if (smooth) {
+            verticalView.setSelectedPositionSmooth(rowPosition, task);
+        } else {
+            verticalView.setSelectedPosition(rowPosition, task);
+        }
+    }
+
+    static RowPresenter.ViewHolder getRowViewHolder(ItemBridgeAdapter.ViewHolder ibvh) {
+        if (ibvh == null) {
+            return null;
+        }
+        RowPresenter rowPresenter = (RowPresenter) ibvh.getPresenter();
+        return rowPresenter.getRowViewHolder(ibvh.getViewHolder());
+    }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
index 9420154..198c914 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
@@ -99,10 +99,14 @@
 
         public Object createFadeTransition(int fadingMode);
 
+        public Object createChangeTransform();
+
         public Object createChangeBounds(boolean reparent);
 
         public Object createFadeAndShortSlide(int edge);
 
+        public Object createFadeAndShortSlide(int edge, float distance);
+
         public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay);
 
         public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay);
@@ -146,6 +150,8 @@
 
         public Object loadTransition(Context context, int resId);
 
+        public void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject);
+
         public void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup);
     }
 
@@ -233,11 +239,21 @@
         }
 
         @Override
+        public Object createChangeTransform() {
+            return new TransitionStub();
+        }
+
+        @Override
         public Object createFadeAndShortSlide(int edge) {
             return new TransitionStub();
         }
 
         @Override
+        public Object createFadeAndShortSlide(int edge, float distance) {
+            return new TransitionStub();
+        }
+
+        @Override
         public Object createSlide(int slideEdge) {
             return new TransitionStub();
         }
@@ -360,6 +376,10 @@
         }
 
         @Override
+        public void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject) {
+        }
+
+        @Override
         public void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
         }
     }
@@ -552,6 +572,16 @@
         }
 
         @Override
+        public Object createFadeAndShortSlide(int edge, float distance) {
+            return TransitionHelperApi21.createFadeAndShortSlide(edge, distance);
+        }
+
+        @Override
+        public void beginDelayedTransition(ViewGroup sceneRoot, Object transition) {
+            TransitionHelperApi21.beginDelayedTransition(sceneRoot, transition);
+        }
+
+        @Override
         public Object getEnterTransition(Window window) {
             return TransitionHelperApi21.getEnterTransition(window);
         }
@@ -585,6 +615,12 @@
         public void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
             TransitionHelperApi21.setTransitionGroup(viewGroup, transitionGroup);
         }
+
+        @Override
+        public Object createChangeTransform() {
+            return TransitionHelperApi21.createChangeTransform();
+        }
+
     }
 
     static {
@@ -637,6 +673,10 @@
         return sImpl.createChangeBounds(reparent);
     }
 
+    public static Object createChangeTransform() {
+        return sImpl.createChangeTransform();
+    }
+
     public static void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
         sImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay);
     }
@@ -780,7 +820,31 @@
         return sImpl.createFadeAndShortSlide(edge);
     }
 
+    public static Object createFadeAndShortSlide(int edge, float distance) {
+        return sImpl.createFadeAndShortSlide(edge, distance);
+    }
+
+    public static void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject) {
+        sImpl.beginDelayedTransition(sceneRoot, transitionObject);
+    }
+
     public static void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
         sImpl.setTransitionGroup(viewGroup, transitionGroup);
     }
+
+    /**
+     * @deprecated Use static calls.
+     */
+    @Deprecated
+    public static TransitionHelper getInstance() {
+        return new TransitionHelper();
+    }
+
+    /**
+     * @deprecated Use {@link #addTransitionListener(Object, TransitionListener)}
+     */
+    @Deprecated
+    public static void setTransitionListener(Object transition, TransitionListener listener) {
+        sImpl.addTransitionListener(transition, listener);
+    }
 }
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 73e5b40..83ee60b 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
@@ -219,6 +219,9 @@
         boolean throughFront = a.getBoolean(R.styleable.lbBaseGridView_focusOutFront, false);
         boolean throughEnd = a.getBoolean(R.styleable.lbBaseGridView_focusOutEnd, false);
         mLayoutManager.setFocusOutAllowed(throughFront, throughEnd);
+        boolean throughSideStart = a.getBoolean(R.styleable.lbBaseGridView_focusOutSideStart, true);
+        boolean throughSideEnd = a.getBoolean(R.styleable.lbBaseGridView_focusOutSideEnd, true);
+        mLayoutManager.setFocusOutSideAllowed(throughSideStart, throughSideEnd);
         mLayoutManager.setVerticalMargin(
                 a.getDimensionPixelSize(R.styleable.lbBaseGridView_verticalMargin, 0));
         mLayoutManager.setHorizontalMargin(
@@ -487,6 +490,8 @@
      * been selected.  Note that the listener may be invoked when there is a
      * layout pending on the view, affording the listener an opportunity to
      * adjust the upcoming layout based on the selection state.
+     * This method will clear all existing listeners added by
+     * {@link #addOnChildViewHolderSelectedListener}.
      *
      * @param listener The listener to be invoked.
      */
@@ -495,6 +500,28 @@
     }
 
     /**
+     * Registers a callback to be invoked when an item in BaseGridView has
+     * been selected.  Note that the listener may be invoked when there is a
+     * layout pending on the view, affording the listener an opportunity to
+     * adjust the upcoming layout based on the selection state.
+     *
+     * @param listener The listener to be invoked.
+     */
+    public void addOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener) {
+        mLayoutManager.addOnChildViewHolderSelectedListener(listener);
+    }
+
+    /**
+     * Remove the callback invoked when an item in BaseGridView has been selected.
+     *
+     * @param listener The listener to be removed.
+     */
+    public void removeOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener)
+            {
+        mLayoutManager.removeOnChildViewHolderSelectedListener(listener);
+    }
+
+    /**
      * Changes the selected item immediately without animation.
      */
     public void setSelectedPosition(int position) {
@@ -543,6 +570,56 @@
     }
 
     /**
+     * Perform a task on ViewHolder at given position after smooth scrolling to it.
+     * @param position Position of item in adapter.
+     * @param task Task to executed on the ViewHolder at a given position.
+     */
+    public void setSelectedPositionSmooth(final int position, final ViewHolderTask task) {
+        if (task != null) {
+            RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
+            if (vh == null) {
+                addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
+                    public void onChildViewHolderSelected(RecyclerView parent,
+                            RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
+                        if (selectedPosition == position) {
+                            removeOnChildViewHolderSelectedListener(this);
+                            task.run(child);
+                        }
+                    }
+                });
+            } else {
+                task.run(vh);
+            }
+        }
+        setSelectedPositionSmooth(position);
+    }
+
+    /**
+     * Perform a task on ViewHolder at given position after scroll to it.
+     * @param position Position of item in adapter.
+     * @param task Task to executed on the ViewHolder at a given position.
+     */
+    public void setSelectedPosition(final int position, final ViewHolderTask task) {
+        if (task != null) {
+            RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
+            if (vh == null) {
+                addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
+                    public void onChildViewHolderSelected(RecyclerView parent,
+                            RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
+                        if (selectedPosition == position) {
+                            removeOnChildViewHolderSelectedListener(this);
+                            task.run(child);
+                        }
+                    }
+                });
+            } else {
+                task.run(vh);
+            }
+        }
+        setSelectedPosition(position);
+    }
+
+    /**
      * Returns the selected item position.
      */
     public int getSelectedPosition() {
@@ -865,4 +942,5 @@
     public int getExtraLayoutSpace() {
         return mLayoutManager.getExtraLayoutSpace();
     }
+
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
index bbb21fd..a9e0d7a 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
@@ -13,6 +13,11 @@
  * Presenter that responsible to create a ImageView and bind to DetailsOverviewRow. The default
  * implementation uses {@link DetailsOverviewRow#getImageDrawable()} and binds to {@link ImageView}.
  * <p>
+ * Default implementation assumes no scaleType on ImageView and uses intrinsic width and height of
+ * {@link DetailsOverviewRow#getImageDrawable()} to initialize ImageView's layout params.  To
+ * specify a fixed size and/or specify a scapeType, subclass should change ImageView's layout params
+ * and scaleType in {@link #onCreateView(ViewGroup)}.
+ * <p>
  * Subclass may override and has its own image view. Subclass may also download image from URL
  * instead of using {@link DetailsOverviewRow#getImageDrawable()}. It's subclass's responsibility to
  * call {@link FullWidthDetailsOverviewRowPresenter#notifyOnBindLogo(FullWidthDetailsOverviewRowPresenter.ViewHolder)}
@@ -21,22 +26,79 @@
  */
 public class DetailsOverviewLogoPresenter extends Presenter {
 
+    /**
+     * ViewHolder for Logo view of DetailsOverviewRow.
+     */
     public static class ViewHolder extends Presenter.ViewHolder {
 
         protected FullWidthDetailsOverviewRowPresenter mParentPresenter;
         protected FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
+        private boolean mSizeFromDrawableIntrinsic;
 
         public ViewHolder(View view) {
             super(view);
         }
+
+        public FullWidthDetailsOverviewRowPresenter getParentPresenter() {
+            return mParentPresenter;
+        }
+
+        public FullWidthDetailsOverviewRowPresenter.ViewHolder getParentViewHolder() {
+            return mParentViewHolder;
+        }
+
+        /**
+         * @return True if layout size of ImageView should be changed to intrinsic size of Drawable,
+         *         false otherwise. Used by
+         *         {@link DetailsOverviewLogoPresenter#onBindViewHolder(Presenter.ViewHolder, Object)}
+         *         .
+         *
+         * @see DetailsOverviewLogoPresenter#onCreateView(ViewGroup)
+         * @see DetailsOverviewLogoPresenter#onBindViewHolder(Presenter.ViewHolder, Object)
+         */
+        public boolean isSizeFromDrawableIntrinsic() {
+            return mSizeFromDrawableIntrinsic;
+        }
+
+        /**
+         * Change if the ImageView layout size should be synchronized to Drawable intrinsic size.
+         * Used by
+         * {@link DetailsOverviewLogoPresenter#onBindViewHolder(Presenter.ViewHolder, Object)}.
+         *
+         * @param sizeFromDrawableIntrinsic True if layout size of ImageView should be changed to
+         *        intrinsic size of Drawable, false otherwise.
+         *
+         * @see DetailsOverviewLogoPresenter#onCreateView(ViewGroup)
+         * @see DetailsOverviewLogoPresenter#onBindViewHolder(Presenter.ViewHolder, Object)
+         */
+        public void setSizeFromDrawableIntrinsic(boolean sizeFromDrawableIntrinsic) {
+            mSizeFromDrawableIntrinsic = sizeFromDrawableIntrinsic;
+        }
+    }
+
+    /**
+     * Create a View for the Logo, default implementation loads from
+     * {@link R.layout#lb_fullwidth_details_overview_logo}. Subclass may override this method to use
+     * a fixed layout size and change ImageView scaleType. If the layout params is WRAP_CONTENT for
+     * both width and size, the ViewHolder would be using intrinsic size of Drawable in
+     * {@link #onBindViewHolder(Presenter.ViewHolder, Object)}.
+     *
+     * @param parent Parent view.
+     * @return View created for the logo.
+     */
+    public View onCreateView(ViewGroup parent) {
+        return LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.lb_fullwidth_details_overview_logo, parent, false);
     }
 
     @Override
     public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
-        View view = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.lb_fullwidth_details_overview_logo, parent, false);
-        view.setLayoutParams(new ViewGroup.MarginLayoutParams(0, 0));
-        return new ViewHolder(view);
+        View view = onCreateView(parent);
+        ViewHolder vh = new ViewHolder(view);
+        ViewGroup.LayoutParams lp = view.getLayoutParams();
+        vh.setSizeFromDrawableIntrinsic(lp.width == ViewGroup.LayoutParams.WRAP_CONTENT &&
+                lp.width == ViewGroup.LayoutParams.WRAP_CONTENT);
+        return vh;
     }
 
     /**
@@ -65,17 +127,43 @@
         return row != null && row.getImageDrawable() != null;
     }
 
+    /**
+     * Bind logo View to drawble of DetailsOverviewRow and call notifyOnBindLogo().  The
+     * default implementation assumes the Logo View is an ImageView and change layout size to
+     * intrinsic size of ImageDrawable if {@link ViewHolder#isSizeFromDrawableIntrinsic()} is true.
+     * @param viewHolder ViewHolder to bind.
+     * @param item DetailsOverviewRow object to bind.
+     */
     @Override
     public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
         DetailsOverviewRow row = (DetailsOverviewRow) item;
         ImageView imageView = ((ImageView) viewHolder.view);
         imageView.setImageDrawable(row.getImageDrawable());
         if (isBoundToImage((ViewHolder) viewHolder, row)) {
-            ViewGroup.LayoutParams lp = imageView.getLayoutParams();
-            lp.width = row.getImageDrawable().getIntrinsicWidth();
-            lp.height = row.getImageDrawable().getIntrinsicHeight();
-            imageView.setLayoutParams(lp);
             ViewHolder vh = (ViewHolder) viewHolder;
+            if (vh.isSizeFromDrawableIntrinsic()) {
+                ViewGroup.LayoutParams lp = imageView.getLayoutParams();
+                lp.width = row.getImageDrawable().getIntrinsicWidth();
+                lp.height = row.getImageDrawable().getIntrinsicHeight();
+                if (imageView.getMaxWidth() > 0 || imageView.getMaxHeight() > 0) {
+                    float maxScaleWidth = 1f;
+                    if (imageView.getMaxWidth() > 0) {
+                        if (lp.width > imageView.getMaxWidth()) {
+                            maxScaleWidth = imageView.getMaxWidth() / (float) lp.width;
+                        }
+                    }
+                    float maxScaleHeight = 1f;
+                    if (imageView.getMaxHeight() > 0) {
+                        if (lp.height > imageView.getMaxHeight()) {
+                            maxScaleHeight = imageView.getMaxHeight() / (float) lp.height;
+                        }
+                    }
+                    float scale = Math.min(maxScaleWidth, maxScaleHeight);
+                    lp.width = (int) (lp.width * scale);
+                    lp.height = (int) (lp.height * scale);
+                }
+                imageView.setLayoutParams(lp);
+            }
             vh.mParentPresenter.notifyOnBindLogo(vh.mParentViewHolder);
         }
     }
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 20d54e2..535dbc9 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -246,6 +246,19 @@
         }
 
         @Override
+        protected int calculateTimeForScrolling(int dx) {
+            int ms = super.calculateTimeForScrolling(dx);
+            if (mWindowAlignment.mainAxis().getSize() > 0) {
+                float minMs = (float) MIN_MS_SMOOTH_SCROLL_MAIN_SCREEN /
+                        mWindowAlignment.mainAxis().getSize() * dx;
+                if (ms < minMs) {
+                    ms = (int) minMs;
+                }
+            }
+            return ms;
+        }
+
+        @Override
         protected void onTargetFound(View targetView,
                 RecyclerView.State state, Action action) {
             if (getScrollPosition(targetView, null, sTwoInts)) {
@@ -387,6 +400,9 @@
 
     // maximum pending movement in one direction.
     private final static int MAX_PENDING_MOVES = 10;
+    // minimal milliseconds to scroll window size in major direction,  we put a cap to prevent the
+    // effect smooth scrolling too over to bind an item view then drag the item view back.
+    private final static int MIN_MS_SMOOTH_SCROLL_MAIN_SCREEN = 30;
 
     private String getTag() {
         return TAG + ":" + mBaseGridView.getId();
@@ -440,7 +456,7 @@
 
     private OnChildSelectedListener mChildSelectedListener = null;
 
-    private OnChildViewHolderSelectedListener mChildViewHolderSelectedListener = null;
+    private ArrayList<OnChildViewHolderSelectedListener> mChildViewHolderSelectedListeners = null;
 
     private OnChildLaidOutListener mChildLaidOutListener = null;
 
@@ -596,6 +612,17 @@
     private boolean mFocusOutEnd;
 
     /**
+     *  Allow DPAD key to navigate out of second axis.
+     *  default is true.
+     */
+    private boolean mFocusOutSideStart = true;
+
+    /**
+     * Allow DPAD key to navigate out of second axis.
+     */
+    private boolean mFocusOutSideEnd = true;
+
+    /**
      * True if focus search is disabled.
      */
     private boolean mFocusSearchDisabled;
@@ -737,6 +764,11 @@
         mFocusOutEnd = throughEnd;
     }
 
+    public void setFocusOutSideAllowed(boolean throughStart, boolean throughEnd) {
+        mFocusOutSideStart = throughStart;
+        mFocusOutSideEnd = throughEnd;
+    }
+
     public void setNumRows(int numRows) {
         if (numRows < 0) throw new IllegalArgumentException();
         mNumRowsRequested = numRows;
@@ -795,7 +827,46 @@
     }
 
     public void setOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener) {
-        mChildViewHolderSelectedListener = listener;
+        if (listener == null) {
+            mChildViewHolderSelectedListeners = null;
+            return;
+        }
+        if (mChildViewHolderSelectedListeners == null) {
+            mChildViewHolderSelectedListeners = new ArrayList<OnChildViewHolderSelectedListener>();
+        } else {
+            mChildViewHolderSelectedListeners.clear();
+        }
+        mChildViewHolderSelectedListeners.add(listener);
+    }
+
+    public void addOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener) {
+        if (mChildViewHolderSelectedListeners == null) {
+            mChildViewHolderSelectedListeners = new ArrayList<OnChildViewHolderSelectedListener>();
+        }
+        mChildViewHolderSelectedListeners.add(listener);
+    }
+
+    public void removeOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener
+            listener) {
+        if (mChildViewHolderSelectedListeners != null) {
+            mChildViewHolderSelectedListeners.remove(listener);
+        }
+    }
+
+    boolean hasOnChildViewHolderSelectedListener() {
+        return mChildViewHolderSelectedListeners != null &&
+                mChildViewHolderSelectedListeners.size() > 0;
+    }
+
+    void fireOnChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child,
+            int position, int subposition) {
+        if (mChildViewHolderSelectedListeners == null) {
+            return;
+        }
+        for (int i = mChildViewHolderSelectedListeners.size() - 1; i >= 0 ; i--) {
+            mChildViewHolderSelectedListeners.get(i).onChildViewHolderSelected(parent, child,
+                    position, subposition);
+        }
     }
 
     void setOnChildLaidOutListener(OnChildLaidOutListener listener) {
@@ -844,7 +915,7 @@
     }
 
     private void dispatchChildSelected() {
-        if (mChildSelectedListener == null && mChildViewHolderSelectedListener == null) {
+        if (mChildSelectedListener == null && !hasOnChildViewHolderSelectedListener()) {
             return;
         }
 
@@ -856,18 +927,12 @@
                 mChildSelectedListener.onChildSelected(mBaseGridView, view, mFocusPosition,
                         vh == null? NO_ID: vh.getItemId());
             }
-            if (mChildViewHolderSelectedListener != null) {
-                mChildViewHolderSelectedListener.onChildViewHolderSelected(mBaseGridView, vh,
-                        mFocusPosition, mSubFocusPosition);
-            }
+            fireOnChildViewHolderSelected(mBaseGridView, vh, mFocusPosition, mSubFocusPosition);
         } else {
             if (mChildSelectedListener != null) {
                 mChildSelectedListener.onChildSelected(mBaseGridView, null, NO_POSITION, NO_ID);
             }
-            if (mChildViewHolderSelectedListener != null) {
-                mChildViewHolderSelectedListener.onChildViewHolderSelected(mBaseGridView, null,
-                        NO_POSITION, 0);
-            }
+            fireOnChildViewHolderSelected(mBaseGridView, null, NO_POSITION, 0);
         }
         if (TRACE) TraceHelper.endSection();
 
@@ -2810,6 +2875,14 @@
                 processPendingMovement(false);
                 view = focused;
             }
+        } else if (movement == NEXT_ROW) {
+            if (isScroll || !mFocusOutSideEnd) {
+                view = focused;
+            }
+        } else if (movement == PREV_ROW) {
+            if (isScroll || !mFocusOutSideStart) {
+                view = focused;
+            }
         }
         leaveContext();
         if (DEBUG) Log.v(getTag(), "onFocusSearchFailed returning view " + view);
@@ -2900,10 +2973,10 @@
          } else if (mOrientation == VERTICAL) {
              switch(direction) {
                  case View.FOCUS_LEFT:
-                     movement = (!mReverseFlowPrimary) ? PREV_ROW : NEXT_ROW;
+                     movement = (!mReverseFlowSecondary) ? PREV_ROW : NEXT_ROW;
                      break;
                  case View.FOCUS_RIGHT:
-                     movement = (!mReverseFlowPrimary) ? NEXT_ROW : PREV_ROW;
+                     movement = (!mReverseFlowSecondary) ? NEXT_ROW : PREV_ROW;
                      break;
                  case View.FOCUS_UP:
                      movement = PREV_ITEM;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
index 21986d5..c977a55 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
@@ -21,6 +21,8 @@
 import android.text.InputType;
 import android.util.Log;
 
+import java.util.List;
+
 /**
  * A data class which represents an action within a {@link
  * android.support.v17.leanback.app.GuidedStepFragment}. GuidedActions contain at minimum a title
@@ -32,6 +34,10 @@
  * <p>
  * GuidedActions may optionally be checked. They may also indicate that they will request further
  * user input on selection, in which case they will be displayed with a chevron indicator.
+ * <p>
+ * GuidedAction recommends to use {@link Builder}. When application subclass GuidedAction, it
+ * can subclass {@link BuilderBase}, implement {@link BuilderBase#build()} where it should
+ * call {@link BuilderBase#applyValues(GuidedAction)}.
  */
 public class GuidedAction extends Action {
 
@@ -90,10 +96,11 @@
     public static final long ACTION_ID_NO = -9;
 
     /**
-     * Builds a {@link GuidedAction} object.  When subclass GuidedAction, you may override this
-     * Builder class and call {@link #applyValues(GuidedAction)}.
+     * Base builder class to build a {@link GuidedAction} object.  When subclass GuidedAction, you
+     * can override this BuilderBase class, implements {@link #build()} and call
+     * {@link #applyValues(GuidedAction)}.  When using GuidedAction directly, use {@link Builder}.
      */
-    public static class Builder {
+    public abstract static class BuilderBase<T extends GuidedAction> {
         private long mId;
         private CharSequence mTitle;
         private CharSequence mEditTitle;
@@ -113,21 +120,18 @@
         private int mCheckSetId = NO_CHECK_SET;
         private boolean mEnabled = true;
         private boolean mFocusable = true;
+        private List<GuidedAction> mSubActions;
         private Intent mIntent;
 
         /**
          * Builds the GuidedAction corresponding to this Builder.
-         * @return the GuidedAction as configured through this Builder.
+         * @return the GuidedAction as configured through this BuilderBase.
          */
-        public final GuidedAction build() {
-            GuidedAction action = new GuidedAction();
-            applyValues(action);
-            return action;
-        }
+        public abstract T build();
 
         /**
-         * Subclass Builder may call this function to apply values.
-         * @param action GuidedAction to apply Builder values.
+         * Subclass of BuilderBase should call this function to apply values.
+         * @param action GuidedAction to apply BuilderBase values.
          */
         protected final void applyValues(GuidedAction action) {
             // Base Action values
@@ -153,14 +157,15 @@
             action.mInfoOnly = mInfoOnly;
             action.mEnabled = mEnabled;
             action.mFocusable = mFocusable;
+            action.mSubActions = mSubActions;
         }
 
         /**
          * Construct a standard "OK" action with {@link GuidedAction#ACTION_ID_OK}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructOK(Context context) {
+        public BuilderBase<T> constructOK(Context context) {
             mId = ACTION_ID_OK;
             mTitle = context.getString(android.R.string.ok);
             return this;
@@ -169,9 +174,9 @@
         /**
          * Construct a standard "Cancel" action with {@link GuidedAction#ACTION_ID_CANCEL}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructCancel(Context context) {
+        public BuilderBase<T> constructCancel(Context context) {
             mId = ACTION_ID_CANCEL;
             mTitle = context.getString(android.R.string.cancel);
             return this;
@@ -180,9 +185,9 @@
         /**
          * Construct a standard "Finish" action with {@link GuidedAction#ACTION_ID_FINISH}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructFinish(Context context) {
+        public BuilderBase<T> constructFinish(Context context) {
             mId = ACTION_ID_FINISH;
             mTitle = context.getString(R.string.lb_guidedaction_finish_title);
             return this;
@@ -191,9 +196,9 @@
         /**
          * Construct a standard "Continue" action with {@link GuidedAction#ACTION_ID_CONTINUE}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructContinue(Context context) {
+        public BuilderBase<T> constructContinue(Context context) {
             mId = ACTION_ID_CONTINUE;
             mHasNext = true;
             mTitle = context.getString(R.string.lb_guidedaction_continue_title);
@@ -203,9 +208,9 @@
         /**
          * Construct a standard "Yes" action with {@link GuidedAction#ACTION_ID_YES}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructYes(Context context) {
+        public BuilderBase<T> constructYes(Context context) {
             mId = ACTION_ID_YES;
             mTitle = context.getString(android.R.string.yes);
             return this;
@@ -214,9 +219,9 @@
         /**
          * Construct a standard "No" action with {@link GuidedAction#ACTION_ID_NO}.
          * @param context Context for loading action title.
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder constructNo(Context context) {
+        public BuilderBase<T> constructNo(Context context) {
             mId = ACTION_ID_NO;
             mTitle = context.getString(android.R.string.no);
             return this;
@@ -227,7 +232,7 @@
          * it is typically used to determine what to do when an action is clicked.
          * @param id The ID to associate with this action.
          */
-        public Builder id(long id) {
+        public BuilderBase<T> id(long id) {
             mId = id;
             return this;
         }
@@ -237,7 +242,7 @@
          * action to be taken on click, e.g. "Continue" or "Cancel".
          * @param title The title for this action.
          */
-        public Builder title(CharSequence title) {
+        public BuilderBase<T> title(CharSequence title) {
             mTitle = title;
             return this;
         }
@@ -246,7 +251,7 @@
          * Sets the optional title text to edit.  When TextView is activated, the edit title
          * replaces the string of title.
          */
-        public Builder editTitle(CharSequence editTitle) {
+        public BuilderBase<T> editTitle(CharSequence editTitle) {
             mEditTitle = editTitle;
             return this;
         }
@@ -256,7 +261,7 @@
          * providing extra information on what the action will do.
          * @param description The description for this action.
          */
-        public Builder description(CharSequence description) {
+        public BuilderBase<T> description(CharSequence description) {
             mDescription = description;
             return this;
         }
@@ -266,7 +271,7 @@
          * description replaces the string of description.
          * @param description The description to edit for this action.
          */
-        public Builder editDescription(CharSequence description) {
+        public BuilderBase<T> editDescription(CharSequence description) {
             mEditDescription = description;
             return this;
         }
@@ -276,7 +281,7 @@
          * directly when the action is clicked.
          * @param intent The intent associated with this action.
          */
-        public Builder intent(Intent intent) {
+        public BuilderBase<T> intent(Intent intent) {
             mIntent = intent;
             return this;
         }
@@ -285,7 +290,7 @@
          * Sets the action's icon drawable.
          * @param icon The drawable for the icon associated with this action.
          */
-        public Builder icon(Drawable icon) {
+        public BuilderBase<T> icon(Drawable icon) {
             mIcon = icon;
             return this;
         }
@@ -297,7 +302,7 @@
          * @param iconResourceId The resource ID for the icon associated with this action.
          * @param context The context whose resource ID should be retrieved.
          */
-        public Builder iconResourceId(int iconResourceId, Context context) {
+        public BuilderBase<T> iconResourceId(int iconResourceId, Context context) {
             return icon(context.getResources().getDrawable(iconResourceId));
         }
 
@@ -306,7 +311,7 @@
          * checked, or belong to a check set.
          * @param editable Whether this action is editable.
          */
-        public Builder editable(boolean editable) {
+        public BuilderBase<T> editable(boolean editable) {
             mEditable = editable;
             if (mChecked || mCheckSetId != NO_CHECK_SET) {
                 throw new IllegalArgumentException("Editable actions cannot also be checked");
@@ -318,7 +323,7 @@
          * Indicates whether this action's description is editable
          * @param editable Whether this action description is editable.
          */
-        public Builder descriptionEditable(boolean editable) {
+        public BuilderBase<T> descriptionEditable(boolean editable) {
             mDescriptionEditable = editable;
             if (mChecked || mCheckSetId != NO_CHECK_SET) {
                 throw new IllegalArgumentException("Editable actions cannot also be checked");
@@ -331,7 +336,7 @@
          *
          * @param inputType InputType for the action title not in editing.
          */
-        public Builder inputType(int inputType) {
+        public BuilderBase<T> inputType(int inputType) {
             mInputType = inputType;
             return this;
         }
@@ -341,7 +346,7 @@
          *
          * @param inputType InputType for the action description not in editing.
          */
-        public Builder descriptionInputType(int inputType) {
+        public BuilderBase<T> descriptionInputType(int inputType) {
             mDescriptionInputType = inputType;
             return this;
         }
@@ -352,7 +357,7 @@
          *
          * @param inputType InputType for the action title in editing.
          */
-        public Builder editInputType(int inputType) {
+        public BuilderBase<T> editInputType(int inputType) {
             mEditInputType = inputType;
             return this;
         }
@@ -362,7 +367,7 @@
          *
          * @param inputType InputType for the action description in editing.
          */
-        public Builder descriptionEditInputType(int inputType) {
+        public BuilderBase<T> descriptionEditInputType(int inputType) {
             mDescriptionEditInputType = inputType;
             return this;
         }
@@ -372,7 +377,7 @@
          * Indicates whether this action is initially checked.
          * @param checked Whether this action is checked.
          */
-        public Builder checked(boolean checked) {
+        public BuilderBase<T> checked(boolean checked) {
             mChecked = checked;
             if (mEditable || mDescriptionEditable) {
                 throw new IllegalArgumentException("Editable actions cannot also be checked");
@@ -387,7 +392,7 @@
          * @param checkSetId The check set ID, or {@link GuidedAction#NO_CHECK_SET} to indicate not
          * radio or checkbox, or {@link GuidedAction#CHECKBOX_CHECK_SET_ID} to indicate a checkbox.
          */
-        public Builder checkSetId(int checkSetId) {
+        public BuilderBase<T> checkSetId(int checkSetId) {
             mCheckSetId = checkSetId;
             if (mEditable || mDescriptionEditable) {
                 throw new IllegalArgumentException("Editable actions cannot also be in check sets");
@@ -400,7 +405,7 @@
          * appropriately.
          * @param multilineDescription Whether this action has a multiline description.
          */
-        public Builder multilineDescription(boolean multilineDescription) {
+        public BuilderBase<T> multilineDescription(boolean multilineDescription) {
             mMultilineDescription = multilineDescription;
             return this;
         }
@@ -409,7 +414,7 @@
          * Indicates whether this action has a next state and should display a chevron.
          * @param hasNext Whether this action has a next state.
          */
-        public Builder hasNext(boolean hasNext) {
+        public BuilderBase<T> hasNext(boolean hasNext) {
             mHasNext = hasNext;
             return this;
         }
@@ -418,7 +423,7 @@
          * Indicates whether this action is for information purposes only and cannot be clicked.
          * @param infoOnly Whether this action has a next state.
          */
-        public Builder infoOnly(boolean infoOnly) {
+        public BuilderBase<T> infoOnly(boolean infoOnly) {
             mInfoOnly = infoOnly;
             return this;
         }
@@ -427,7 +432,7 @@
          * Indicates whether this action is enabled.  If not enabled, an action cannot be clicked.
          * @param enabled Whether the action is enabled.
          */
-        public Builder enabled(boolean enabled) {
+        public BuilderBase<T> enabled(boolean enabled) {
             mEnabled = enabled;
             return this;
         }
@@ -435,12 +440,36 @@
         /**
          * Indicates whether this action can take focus.
          * @param focusable
-         * @return The same Builder object.
+         * @return The same BuilderBase object.
          */
-        public Builder focusable(boolean focusable) {
+        public BuilderBase<T> focusable(boolean focusable) {
             mFocusable = focusable;
             return this;
         }
+
+        /**
+         * Sets sub actions list.
+         * @param subActions
+         * @return The same BuilderBase object.
+         */
+        public BuilderBase<T> subActions(List<GuidedAction> subActions) {
+            mSubActions = subActions;
+            return this;
+        }
+    }
+
+    /**
+     * Builds a {@link GuidedAction} object.
+     */
+    public static class Builder extends BuilderBase<GuidedAction> {
+
+        @Override
+        public GuidedAction build() {
+            GuidedAction action = new GuidedAction();
+            applyValues(action);
+            return action;
+        }
+
     }
 
     private CharSequence mEditTitle;
@@ -458,6 +487,7 @@
     private int mCheckSetId;
     private boolean mEnabled;
     private boolean mFocusable;
+    private List<GuidedAction> mSubActions;
 
     private Intent mIntent;
 
@@ -688,4 +718,26 @@
         return mInfoOnly;
     }
 
+    /**
+     * Change sub actions list.
+     * @param actions Sub actions list to set on this action.  Sets null to disable sub actions.
+     */
+    public void setSubActions(List<GuidedAction> actions) {
+        mSubActions = actions;
+    }
+
+    /**
+     * @return List of sub actions or null if sub actions list is not enabled.
+     */
+    public List<GuidedAction> getSubActions() {
+        return mSubActions;
+    }
+
+    /**
+     * @return True if has sub actions list, even it's currently empty.
+     */
+    public boolean hasSubActions() {
+        return mSubActions != null;
+    }
+
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapter.java
similarity index 83%
rename from v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java
rename to v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapter.java
index 142e971..dccde67 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapter.java
@@ -11,15 +11,12 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package android.support.v17.leanback.app;
+package android.support.v17.leanback.widget;
 
 import android.content.Context;
 import android.database.DataSetObserver;
 import android.media.AudioManager;
 import android.support.v17.leanback.R;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.support.v17.leanback.widget.GuidedActionsStylist;
-import android.support.v17.leanback.widget.ImeKeyMonitor;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.util.Log;
@@ -44,8 +41,9 @@
  * Presentation (view creation and state animation) is delegated to a {@link
  * GuidedActionsStylist}, while clients are notified of interactions via
  * {@link GuidedActionAdapter.ClickListener} and {@link GuidedActionAdapter.FocusListener}.
+ * @hide
  */
-class GuidedActionAdapter extends RecyclerView.Adapter {
+public class GuidedActionAdapter extends RecyclerView.Adapter {
     private static final String TAG = "GuidedActionAdapter";
     private static final boolean DEBUG = false;
 
@@ -61,6 +59,7 @@
          * Called when the user clicks on an action.
          */
         public void onGuidedActionClicked(GuidedAction action);
+
     }
 
     /**
@@ -95,39 +94,7 @@
         public void onImeClose();
     }
 
-    /**
-     * View holder containing a {@link GuidedAction}.
-     */
-    static class ActionViewHolder extends ViewHolder {
-
-        final GuidedActionsStylist.ViewHolder mStylistViewHolder;
-        private GuidedAction mAction;
-
-        /**
-         * Constructs a view holder that can be associated with a GuidedAction.
-         */
-        public ActionViewHolder(View v, GuidedActionsStylist.ViewHolder subViewHolder) {
-            super(v);
-            mStylistViewHolder = subViewHolder;
-        }
-
-        /**
-         * Retrieves the action associated with this view holder.
-         * @return The GuidedAction associated with this view holder.
-         */
-        public GuidedAction getAction() {
-            return mAction;
-        }
-
-        /**
-         * Sets the action associated with this view holder.
-         * @param action The GuidedAction associated with this view holder.
-         */
-        public void setAction(GuidedAction action) {
-            mAction = action;
-        }
-    }
-
+    private final boolean mIsSubAdapter;
     private final ActionOnKeyListener mActionOnKeyListener;
     private final ActionOnFocusListener mActionOnFocusListener;
     private final ActionEditListener mActionEditListener;
@@ -138,7 +105,8 @@
         @Override
         public void onClick(View v) {
             if (v != null && v.getWindowToken() != null && getRecyclerView() != null) {
-                ActionViewHolder avh = (ActionViewHolder)getRecyclerView().getChildViewHolder(v);
+                GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder)
+                        getRecyclerView().getChildViewHolder(v);
                 GuidedAction action = avh.getAction();
                 if (action.isEditable() || action.isDescriptionEditable()) {
                     if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme by click");
@@ -162,14 +130,16 @@
      * @param presenter The presenter that will manage the display of items in this adapter.
      */
     public GuidedActionAdapter(List<GuidedAction> actions, ClickListener clickListener,
-            FocusListener focusListener, GuidedActionsStylist presenter) {
+            FocusListener focusListener, GuidedActionsStylist presenter, boolean isSubAdapter) {
         super();
-        mActions = new ArrayList<GuidedAction>(actions);
+        mActions = actions == null ? new ArrayList<GuidedAction>() :
+                new ArrayList<GuidedAction>(actions);
         mClickListener = clickListener;
         mStylist = presenter;
         mActionOnKeyListener = new ActionOnKeyListener();
         mActionOnFocusListener = new ActionOnFocusListener(focusListener);
         mActionEditListener = new ActionEditListener();
+        mIsSubAdapter = isSubAdapter;
     }
 
     /**
@@ -249,7 +219,7 @@
     }
 
     private RecyclerView getRecyclerView() {
-        return mStylist.getActionsGridView();
+        return mIsSubAdapter ? mStylist.getSubActionsGridView() : mStylist.getActionsGridView();
     }
 
     /**
@@ -258,7 +228,7 @@
     @Override
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         GuidedActionsStylist.ViewHolder vh = mStylist.onCreateViewHolder(parent, viewType);
-        View v = vh.view;
+        View v = vh.itemView;
         v.setOnKeyListener(mActionOnKeyListener);
         v.setOnClickListener(mOnClickListener);
         v.setOnFocusChangeListener(mActionOnFocusListener);
@@ -266,7 +236,7 @@
         setupListeners(vh.getEditableTitleView());
         setupListeners(vh.getEditableDescriptionView());
 
-        return new ActionViewHolder(v, vh);
+        return vh;
     }
 
     private void setupListeners(EditText edit) {
@@ -288,10 +258,9 @@
         if (position >= mActions.size()) {
             return;
         }
-        final ActionViewHolder avh = (ActionViewHolder)holder;
+        final GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder)holder;
         GuidedAction action = mActions.get(position);
-        avh.setAction(action);
-        mStylist.onBindViewHolder(avh.mStylistViewHolder, action);
+        mStylist.onBindViewHolder(avh, action);
     }
 
     /**
@@ -319,8 +288,8 @@
             if (mSelectedView != null && getRecyclerView() != null) {
                 ViewHolder vh = getRecyclerView().getChildViewHolder(mSelectedView);
                 if (vh != null) {
-                    ActionViewHolder avh = (ActionViewHolder)vh;
-                    mStylist.onAnimateItemFocused(avh.mStylistViewHolder, false);
+                    GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder)vh;
+                    mStylist.onAnimateItemFocused(avh, false);
                 } else {
                     Log.w(TAG, "RecyclerView returned null view holder",
                             new Throwable());
@@ -333,7 +302,8 @@
             if (getRecyclerView() == null) {
                 return;
             }
-            ActionViewHolder avh = (ActionViewHolder) getRecyclerView().getChildViewHolder(v);
+            GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder)
+                    getRecyclerView().getChildViewHolder(v);
             if (hasFocus) {
                 mSelectedView = v;
                 if (mFocusListener != null) {
@@ -343,32 +313,32 @@
                 }
             } else {
                 if (mSelectedView == v) {
-                    mStylist.onAnimateItemPressedCancelled(avh.mStylistViewHolder);
+                    mStylist.onAnimateItemPressedCancelled(avh);
                     mSelectedView = null;
                 }
             }
-            mStylist.onAnimateItemFocused(avh.mStylistViewHolder, hasFocus);
+            mStylist.onAnimateItemFocused(avh, hasFocus);
         }
     }
 
-    public ActionViewHolder findSubChildViewHolder(View v) {
+    public GuidedActionsStylist.ViewHolder findSubChildViewHolder(View v) {
         // Needed because RecyclerView.getChildViewHolder does not traverse the hierarchy
         if (getRecyclerView() == null) {
             return null;
         }
-        ActionViewHolder result = null;
+        GuidedActionsStylist.ViewHolder result = null;
         ViewParent parent = v.getParent();
         while (parent != getRecyclerView() && parent != null && v != null) {
             v = (View)parent;
             parent = parent.getParent();
         }
         if (parent != null && v != null) {
-            result = (ActionViewHolder)getRecyclerView().getChildViewHolder(v);
+            result = (GuidedActionsStylist.ViewHolder)getRecyclerView().getChildViewHolder(v);
         }
         return result;
     }
 
-    public void handleCheckedActions(ActionViewHolder avh) {
+    public void handleCheckedActions(GuidedActionsStylist.ViewHolder avh) {
         GuidedAction action = avh.getAction();
         int actionCheckSetId = action.getCheckSetId();
         if (getRecyclerView() != null && actionCheckSetId != GuidedAction.NO_CHECK_SET) {
@@ -379,11 +349,10 @@
                     GuidedAction a = mActions.get(i);
                     if (a != action && a.getCheckSetId() == actionCheckSetId && a.isChecked()) {
                         a.setChecked(false);
-                        ViewHolder vh = getRecyclerView().findViewHolderForPosition(i);
+                        GuidedActionsStylist.ViewHolder vh = (GuidedActionsStylist.ViewHolder)
+                                getRecyclerView().findViewHolderForPosition(i);
                         if (vh != null) {
-                            GuidedActionsStylist.ViewHolder subViewHolder =
-                                    ((ActionViewHolder)vh).mStylistViewHolder;
-                            mStylist.onAnimateItemChecked(subViewHolder, false);
+                            mStylist.onAnimateItemChecked(vh, false);
                         }
                     }
                 }
@@ -392,17 +361,17 @@
             // If we we'ren't already checked, fade our checkmark in.
             if (!action.isChecked()) {
                 action.setChecked(true);
-                mStylist.onAnimateItemChecked(avh.mStylistViewHolder, true);
+                mStylist.onAnimateItemChecked(avh, true);
             } else {
                 if (actionCheckSetId == GuidedAction.CHECKBOX_CHECK_SET_ID) {
                     action.setChecked(false);
-                    mStylist.onAnimateItemChecked(avh.mStylistViewHolder, false);
+                    mStylist.onAnimateItemChecked(avh, false);
                 }
             }
         }
     }
 
-    public void performOnActionClick(ActionViewHolder avh) {
+    public void performOnActionClick(GuidedActionsStylist.ViewHolder avh) {
         if (mClickListener != null) {
             mClickListener.onGuidedActionClicked(avh.getAction());
         }
@@ -436,8 +405,8 @@
                 case KeyEvent.KEYCODE_BUTTON_Y:
                 case KeyEvent.KEYCODE_ENTER:
 
-                    ActionViewHolder avh = (ActionViewHolder) getRecyclerView()
-                            .getChildViewHolder(v);
+                    GuidedActionsStylist.ViewHolder avh = (GuidedActionsStylist.ViewHolder)
+                            getRecyclerView().getChildViewHolder(v);
                     GuidedAction action = avh.getAction();
 
                     if (!action.isEnabled() || action.infoOnly()) {
@@ -456,8 +425,7 @@
                             if (!mKeyPressed) {
                                 mKeyPressed = true;
                                 playSound(v, AudioManager.FX_KEY_CLICK);
-                                mStylist.onAnimateItemPressed(avh.mStylistViewHolder,
-                                        mKeyPressed);
+                                mStylist.onAnimateItemPressed(avh, mKeyPressed);
                             }
                             break;
                         case KeyEvent.ACTION_UP:
@@ -468,7 +436,7 @@
                             // Escape in IME.
                             if (mKeyPressed) {
                                 mKeyPressed = false;
-                                mStylist.onAnimateItemPressed(avh.mStylistViewHolder, mKeyPressed);
+                                mStylist.onAnimateItemPressed(avh, mKeyPressed);
                             }
                             break;
                         default:
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapterGroup.java
similarity index 69%
rename from v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java
rename to v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapterGroup.java
index 8f8951c..9fafd33 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionAdapterGroup.java
@@ -11,15 +11,13 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package android.support.v17.leanback.app;
+package android.support.v17.leanback.widget;
 
 import android.content.Context;
-import android.support.v17.leanback.app.GuidedActionAdapter.ActionViewHolder;
-import android.support.v17.leanback.app.GuidedActionAdapter.ClickListener;
-import android.support.v17.leanback.app.GuidedActionAdapter.EditListener;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.support.v17.leanback.widget.ImeKeyMonitor;
+import android.support.v17.leanback.widget.GuidedActionAdapter.ClickListener;
+import android.support.v17.leanback.widget.GuidedActionAdapter.EditListener;
 import android.util.Log;
+import android.util.Pair;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewParent;
@@ -33,22 +31,36 @@
 /**
  * Internal implementation manages a group of GuidedActionAdapters, control the next action after
  * editing finished, maintain the Ime open/close status.
+ * @hide
  */
-class GuidedActionAdapterGroup {
+public class GuidedActionAdapterGroup {
 
     private static final String TAG_EDIT = "EditableAction";
     private static final boolean DEBUG_EDIT = false;
 
-    ArrayList<GuidedActionAdapter> mAdapters = new ArrayList<GuidedActionAdapter>();
+    ArrayList<Pair<GuidedActionAdapter, GuidedActionAdapter>> mAdapters =
+            new ArrayList<Pair<GuidedActionAdapter, GuidedActionAdapter>>();
     private boolean mImeOpened;
     private EditListener mEditListener;
 
-    GuidedActionAdapterGroup() {
+    public void addAdpter(GuidedActionAdapter adapter1, GuidedActionAdapter adapter2) {
+        mAdapters.add(new Pair<GuidedActionAdapter, GuidedActionAdapter>(adapter1, adapter2));
+        if (adapter1 != null) {
+            adapter1.mGroup = this;
+        }
+        if (adapter2 != null) {
+            adapter2.mGroup = this;
+        }
     }
 
-    public void addAdpter(GuidedActionAdapter adapter) {
-        mAdapters.add(adapter);
-        adapter.mGroup = this;
+    public GuidedActionAdapter getNextAdapter(GuidedActionAdapter adapter) {
+        for (int i = 0; i < mAdapters.size(); i++) {
+            Pair<GuidedActionAdapter, GuidedActionAdapter> pair = mAdapters.get(i);
+            if (pair.first == adapter) {
+                return pair.second;
+            }
+        }
+        return null;
     }
 
     public void setEditListener(EditListener listener) {
@@ -67,7 +79,6 @@
             index++;
         }
 
-        int adapterIndex = mAdapters.indexOf(adapter);
         do {
             int size = adapter.getCount();
             if (nextActionId == GuidedAction.ACTION_ID_NEXT) {
@@ -80,8 +91,9 @@
                 }
             }
             if (index < size) {
-                ActionViewHolder vh = (ActionViewHolder) adapter.getGuidedActionsStylist()
-                        .getActionsGridView().findViewHolderForPosition(index);
+                GuidedActionsStylist.ViewHolder vh =
+                        (GuidedActionsStylist.ViewHolder) adapter.getGuidedActionsStylist()
+                                .getActionsGridView().findViewHolderForPosition(index);
                 if (vh != null) {
                     if (vh.getAction().isEditable() || vh.getAction().isDescriptionEditable()) {
                         if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme of next Action");
@@ -90,28 +102,26 @@
                     } else {
                         if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme and focus to next Action");
                         // close IME and focus to next (not editable) action
-                        closeIme(vh.mStylistViewHolder.view);
-                        vh.mStylistViewHolder.view.requestFocus();
+                        closeIme(vh.itemView);
+                        vh.itemView.requestFocus();
                     }
                     return true;
                 }
                 return false;
             }
             // search from index 0 of next Adapter
-            adapterIndex++;
-            if (adapterIndex >= mAdapters.size()) {
+            adapter = getNextAdapter(adapter);
+            if (adapter == null) {
                 break;
             }
-            adapter = mAdapters.get(adapterIndex);
             index = 0;
         } while (true);
         return false;
     }
 
-    public void openIme(GuidedActionAdapter adapter, ActionViewHolder avh) {
-        adapter.getGuidedActionsStylist().setEditingMode(avh.mStylistViewHolder, avh.getAction(),
-                true);
-        View v = avh.mStylistViewHolder.getEditingView();
+    public void openIme(GuidedActionAdapter adapter, GuidedActionsStylist.ViewHolder avh) {
+        adapter.getGuidedActionsStylist().setEditingMode(avh, avh.getAction(), true);
+        View v = avh.getEditingView();
         if (v == null) {
             return;
         }
@@ -135,24 +145,23 @@
         }
     }
 
-    private long finishEditing(GuidedActionAdapter adapter, ActionViewHolder avh) {
+    private long finishEditing(GuidedActionAdapter adapter, GuidedActionsStylist.ViewHolder avh) {
         long nextActionId = mEditListener.onGuidedActionEdited(avh.getAction());
-        adapter.getGuidedActionsStylist().setEditingMode(avh.mStylistViewHolder, avh.getAction(),
-                false);
+        adapter.getGuidedActionsStylist().setEditingMode(avh, avh.getAction(), false);
         return nextActionId;
     }
 
     public void fillAndStay(GuidedActionAdapter adapter, TextView v) {
-        ActionViewHolder avh = adapter.findSubChildViewHolder(v);
+        GuidedActionsStylist.ViewHolder avh = adapter.findSubChildViewHolder(v);
         updateTextIntoAction(avh, v);
         finishEditing(adapter, avh);
         closeIme(v);
-        avh.mStylistViewHolder.view.requestFocus();
+        avh.itemView.requestFocus();
     }
 
     public void fillAndGoNext(GuidedActionAdapter adapter, TextView v) {
         boolean handled = false;
-        ActionViewHolder avh = adapter.findSubChildViewHolder(v);
+        GuidedActionsStylist.ViewHolder avh = adapter.findSubChildViewHolder(v);
         updateTextIntoAction(avh, v);
         adapter.performOnActionClick(avh);
         long nextActionId = finishEditing(adapter, avh);
@@ -164,19 +173,19 @@
             if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme no next action");
             handled = true;
             closeIme(v);
-            avh.mStylistViewHolder.view.requestFocus();
+            avh.itemView.requestFocus();
         }
     }
 
-    private void updateTextIntoAction(ActionViewHolder avh, TextView v) {
+    private void updateTextIntoAction(GuidedActionsStylist.ViewHolder avh, TextView v) {
         GuidedAction action = avh.getAction();
-        if (v == avh.mStylistViewHolder.getDescriptionView()) {
+        if (v == avh.getDescriptionView()) {
             if (action.getEditDescription() != null) {
                 action.setEditDescription(v.getText());
             } else {
                 action.setDescription(v.getText());
             }
-        } else if (v == avh.mStylistViewHolder.getTitleView()) {
+        } else if (v == avh.getTitleView()) {
             if (action.getEditTitle() != null) {
                 action.setEditTitle(v.getText());
             } else {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
index 6e5d506..6a7ffda 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
@@ -25,8 +25,11 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.Build.VERSION;
 import android.support.annotation.NonNull;
 import android.support.v17.leanback.R;
+import android.support.v17.leanback.transition.TransitionHelper;
+import android.support.v17.leanback.transition.TransitionListener;
 import android.support.v17.leanback.widget.VerticalGridView;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.view.ViewCompat;
@@ -37,6 +40,7 @@
 import android.util.TypedValue;
 import android.view.animation.DecelerateInterpolator;
 import android.view.inputmethod.EditorInfo;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -49,12 +53,16 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
  * GuidedActionsStylist is used within a {@link android.support.v17.leanback.app.GuidedStepFragment}
  * to supply the right-side panel where users can take actions. It consists of a container for the
  * list of actions, and a stationary selector view that indicates visually the location of focus.
+ * GuidedActionsStylist has two different layouts: default is for normal actions including text,
+ * radio, checkbox etc, the other when {@link #setAsButtonActions()} is called is recommended for
+ * button actions such as "yes", "no".
  * <p>
  * Many aspects of the base GuidedActionsStylist can be customized through theming; see the
  * theme attributes below. Note that these attributes are not set on individual elements in layout
@@ -69,7 +77,6 @@
  * <p>
  * Note: If an alternate list layout is provided, the following view IDs must be supplied:
  * <ul>
- * <li>{@link android.support.v17.leanback.R.id#guidedactions_selector}</li>
  * <li>{@link android.support.v17.leanback.R.id#guidedactions_list}</li>
  * </ul><p>
  * These view IDs must be present in order for the stylist to function. The list ID must correspond
@@ -94,10 +101,10 @@
  *
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeAppearingAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeDisappearingAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorShowAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorHideAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorStyle
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorDrawable
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsListStyle
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedSubActionsListStyle
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedButtonActionsListStyle
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemContainerStyle
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemCheckmarkStyle
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemIconStyle
@@ -133,10 +140,9 @@
      * GuidedActionsStylist} may also wish to subclass this in order to add fields.
      * @see GuidedAction
      */
-    public static class ViewHolder {
+    public static class ViewHolder extends RecyclerView.ViewHolder {
 
-        public final View view;
-
+        private GuidedAction mAction;
         private View mContentView;
         private TextView mTitleView;
         private TextView mDescriptionView;
@@ -145,12 +151,20 @@
         private ImageView mChevronView;
         private boolean mInEditing;
         private boolean mInEditingDescription;
+        private final boolean mIsSubAction;
 
         /**
          * Constructs an ViewHolder and caches the relevant subviews.
          */
         public ViewHolder(View v) {
-            view = v;
+            this(v, false);
+        }
+
+        /**
+         * Constructs an ViewHolder for sub action and caches the relevant subviews.
+         */
+        public ViewHolder(View v, boolean isSubAction) {
+            super(v);
 
             mContentView = v.findViewById(R.id.guidedactions_item_content);
             mTitleView = (TextView) v.findViewById(R.id.guidedactions_item_title);
@@ -158,6 +172,7 @@
             mIconView = (ImageView) v.findViewById(R.id.guidedactions_item_icon);
             mCheckmarkView = (ImageView) v.findViewById(R.id.guidedactions_item_checkmark);
             mChevronView = (ImageView) v.findViewById(R.id.guidedactions_item_chevron);
+            mIsSubAction = isSubAction;
         }
 
         /**
@@ -233,6 +248,9 @@
             return mInEditingDescription;
         }
 
+        /**
+         * @return Current editing title view or description view or null if not in editing.
+         */
         public View getEditingView() {
             if (mInEditing) {
                 return mInEditingDescription ?  mDescriptionView : mTitleView;
@@ -240,19 +258,32 @@
                 return null;
             }
         }
+
+        /**
+         * @return True if bound action is inside {@link GuidedAction#getSubActions()}, false
+         * otherwise.
+         */
+        public boolean isSubAction() {
+            return mIsSubAction;
+        }
+
+        /**
+         * @return Currently bound action.
+         */
+        public GuidedAction getAction() {
+            return mAction;
+        }
     }
 
     private static String TAG = "GuidedActionsStylist";
 
     private ViewGroup mMainView;
     private VerticalGridView mActionsGridView;
+    private VerticalGridView mSubActionsGridView;
     private View mBgView;
-    private View mSelectorView;
     private View mContentView;
     private boolean mButtonActions;
 
-    private Animator mSelectorAnimator;
-
     // Cached values from resources
     private float mEnabledTextAlpha;
     private float mDisabledTextAlpha;
@@ -266,6 +297,9 @@
     private int mVerticalPadding;
     private int mDisplayHeight;
 
+    private GuidedAction mExpandedAction = null;
+    private Object mExpandTransition;
+
     /**
      * Creates a view appropriate for displaying a list of GuidedActions, using the provided
      * inflater and container.
@@ -279,46 +313,27 @@
      */
     public View onCreateView(LayoutInflater inflater, ViewGroup container) {
         mMainView = (ViewGroup) inflater.inflate(onProvideLayoutId(), container, false);
-        mContentView = mMainView.findViewById(R.id.guidedactions_content);
-        mSelectorView = mMainView.findViewById(R.id.guidedactions_selector);
-        mSelectorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                updateSelectorView(false);
-            }
-        });
-        mBgView = mMainView.findViewById(R.id.guidedactions_list_background);
+        mContentView = mMainView.findViewById(mButtonActions ? R.id.guidedactions_content2 :
+                R.id.guidedactions_content);
+        mBgView = mMainView.findViewById(mButtonActions ? R.id.guidedactions_list_background2 :
+                R.id.guidedactions_list_background);
         if (mMainView instanceof VerticalGridView) {
             mActionsGridView = (VerticalGridView) mMainView;
         } else {
-            mActionsGridView = (VerticalGridView) mMainView.findViewById(R.id.guidedactions_list);
+            mActionsGridView = (VerticalGridView) mMainView.findViewById(mButtonActions ?
+                    R.id.guidedactions_list2 : R.id.guidedactions_list);
             if (mActionsGridView == null) {
                 throw new IllegalStateException("No ListView exists.");
             }
             mActionsGridView.setWindowAlignmentOffset(0);
             mActionsGridView.setWindowAlignmentOffsetPercent(50f);
             mActionsGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
-            if (mSelectorView != null) {
-                mActionsGridView.setOnScrollListener(new RecyclerView.OnScrollListener() {
-                    @Override
-                    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-                        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
-                            if (mSelectorView.getAlpha() != 1f) {
-                                updateSelectorView(true);
-                            }
-                        }
-                    }
-                });
+            if (!mButtonActions) {
+                mSubActionsGridView = (VerticalGridView) mMainView.findViewById(
+                        R.id.guidedactions_sub_list);
             }
         }
 
-        if (mSelectorView != null) {
-            // ALlow focus to move to other views
-            mActionsGridView.getViewTreeObserver().addOnGlobalFocusChangeListener(
-                    mGlobalFocusChangeListener);
-        }
-
         // Cache widths, chevron alpha values, max and min text lines, etc
         Context ctx = mMainView.getContext();
         TypedValue val = new TypedValue();
@@ -343,61 +358,32 @@
     }
 
     /**
-     * Default implementation turns on background for actions and applies different Ids to views so
-     * that GuidedStepFragment could run transitions against two action lists.  The method is called
-     * by GuidedStepFragment, app may override this function when replacing default layout file
-     * provided by {@link #onProvideLayoutId()}
+     * Choose the layout resource for button actions in {@link #onProvideLayoutId()}.
      */
     public void setAsButtonActions() {
+        if (mMainView != null) {
+            throw new IllegalStateException("setAsButtonActions() must be called before creating "
+                    + "views");
+        }
         mButtonActions = true;
-        mMainView.setId(R.id.guidedactions_root2);
-        ViewCompat.setTransitionName(mMainView, "guidedactions_root2");
-        if (mActionsGridView != null) {
-            mActionsGridView.setId(R.id.guidedactions_list2);
-        }
-        if (mSelectorView != null) {
-            mSelectorView.setId(R.id.guidedactions_selector2);
-            ViewCompat.setTransitionName(mSelectorView, "guidedactions_selector2");
-        }
-        if (mContentView != null) {
-            mContentView.setId(R.id.guidedactions_content2);
-            ViewCompat.setTransitionName(mContentView, "guidedactions_content2");
-        }
-        if (mBgView != null) {
-            mBgView.setId(R.id.guidedactions_list_background2);
-            ViewCompat.setTransitionName(mBgView, "guidedactions_list_background2");
-            mBgView.setVisibility(View.VISIBLE);
-        }
     }
 
     /**
-     * Returns true if {@link #setAsButtonActions()} was called, false otherwise.
-     * @return True if {@link #setAsButtonActions()} was called, false otherwise.
+     * Returns true if it is button actions list, false for normal actions list.
+     * @return True if it is button actions list, false for normal actions list.
      */
     public boolean isButtonActions() {
         return mButtonActions;
     }
 
-    final ViewTreeObserver.OnGlobalFocusChangeListener mGlobalFocusChangeListener =
-            new ViewTreeObserver.OnGlobalFocusChangeListener() {
-
-        @Override
-        public void onGlobalFocusChanged(View oldFocus, View newFocus) {
-            updateSelectorView(false);
-        }
-    };
-
     /**
      * Called when destroy the View created by GuidedActionsStylist.
      */
     public void onDestroyView() {
-        if (mSelectorView != null) {
-            mActionsGridView.getViewTreeObserver().removeOnGlobalFocusChangeListener(
-                    mGlobalFocusChangeListener);
-        }
-        endSelectorAnimator();
+        mExpandedAction = null;
+        mExpandTransition = null;
         mActionsGridView = null;
-        mSelectorView = null;
+        mSubActionsGridView = null;
         mContentView = null;
         mBgView = null;
         mMainView = null;
@@ -412,16 +398,27 @@
     }
 
     /**
+     * Returns the VerticalGridView that displays the sub actions list of an expanded action.
+     * @return The VerticalGridView that displays the sub actions list of an expanded action.
+     */
+    public VerticalGridView getSubActionsGridView() {
+        return mSubActionsGridView;
+    }
+
+    /**
      * Provides the resource ID of the layout defining the host view for the list of guided actions.
      * Subclasses may override to provide their own customized layouts. The base implementation
-     * returns {@link android.support.v17.leanback.R.layout#lb_guidedactions}. If overridden, the
-     * substituted layout should contain matching IDs for any views that should be managed by the
-     * base class; this can be achieved by starting with a copy of the base layout file.
-     * @return The resource ID of the layout to be inflated to define the host view for the list
-     * of GuidedActions.
+     * returns {@link android.support.v17.leanback.R.layout#lb_guidedactions} or
+     * {@link android.support.v17.leanback.R.layout#lb_guidedbuttonactions} if
+     * {@link #isButtonActions()} is true. If overridden, the substituted layout should contain
+     * matching IDs for any views that should be managed by the base class; this can be achieved by
+     * starting with a copy of the base layout file.
+     *
+     * @return The resource ID of the layout to be inflated to define the host view for the list of
+     *         GuidedActions.
      */
     public int onProvideLayoutId() {
-        return R.layout.lb_guidedactions;
+        return mButtonActions ? R.layout.lb_guidedbuttonactions : R.layout.lb_guidedactions;
     }
 
     /**
@@ -486,7 +483,7 @@
     public ViewHolder onCreateViewHolder(ViewGroup parent) {
         LayoutInflater inflater = LayoutInflater.from(parent.getContext());
         View v = inflater.inflate(onProvideItemLayoutId(), parent, false);
-        return new ViewHolder(v);
+        return new ViewHolder(v, parent == mSubActionsGridView);
     }
 
     /**
@@ -505,7 +502,7 @@
         }
         LayoutInflater inflater = LayoutInflater.from(parent.getContext());
         View v = inflater.inflate(onProvideItemLayoutId(viewType), parent, false);
-        return new ViewHolder(v);
+        return new ViewHolder(v, parent == mSubActionsGridView);
     }
 
     /**
@@ -516,6 +513,7 @@
      */
     public void onBindViewHolder(ViewHolder vh, GuidedAction action) {
 
+        vh.mAction = action;
         if (vh.mTitleView != null) {
             vh.mTitleView.setText(action.getTitle());
             vh.mTitleView.setAlpha(action.isEnabled() ? mEnabledTextAlpha : mDisabledTextAlpha);
@@ -534,16 +532,12 @@
             onBindCheckMarkView(vh, action);
         }
 
-        if (vh.mChevronView != null) {
-            onBindChevronView(vh, action);
-        }
-
         if (action.hasMultilineDescription()) {
             if (vh.mTitleView != null) {
                 vh.mTitleView.setMaxLines(mTitleMaxLines);
                 if (vh.mDescriptionView != null) {
-                    vh.mDescriptionView.setMaxHeight(getDescriptionMaxHeight(vh.view.getContext(),
-                            vh.mTitleView));
+                    vh.mDescriptionView.setMaxHeight(getDescriptionMaxHeight(
+                            vh.itemView.getContext(), vh.mTitleView));
                 }
             }
         } else {
@@ -556,17 +550,15 @@
         }
         setEditingMode(vh, action, false);
         if (action.isFocusable()) {
-            vh.view.setFocusable(true);
-            if (vh.view instanceof ViewGroup) {
-                ((ViewGroup) vh.view).setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
-            }
+            vh.itemView.setFocusable(true);
+            ((ViewGroup) vh.itemView).setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
         } else {
-            vh.view.setFocusable(false);
-            if (vh.view instanceof ViewGroup) {
-                ((ViewGroup) vh.view).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
-            }
+            vh.itemView.setFocusable(false);
+            ((ViewGroup) vh.itemView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
         }
         setupImeOptions(vh, action);
+
+        updateChevronAndVisibility(vh);
     }
 
     /**
@@ -594,6 +586,7 @@
     }
 
     protected void onEditingModeChange(ViewHolder vh, GuidedAction action, boolean editing) {
+        action = vh.getAction();
         TextView titleView = vh.getTitleView();
         TextView descriptionView = vh.getDescriptionView();
         if (editing) {
@@ -659,7 +652,7 @@
     public void onAnimateItemPressed(ViewHolder vh, boolean pressed) {
         int attr = pressed ? R.attr.guidedActionPressedAnimation :
                 R.attr.guidedActionUnpressedAnimation;
-        createAnimator(vh.view, attr).start();
+        createAnimator(vh.itemView, attr).start();
     }
 
     /**
@@ -667,7 +660,7 @@
      * @param vh The view holder associated with the relevant action.
      */
     public void onAnimateItemPressedCancelled(ViewHolder vh) {
-        createAnimator(vh.view, R.attr.guidedActionUnpressedAnimation).end();
+        createAnimator(vh.itemView, R.attr.guidedActionUnpressedAnimation).end();
     }
 
     /**
@@ -729,9 +722,240 @@
      * @param action The GuidedAction object to bind to.
      */
     public void onBindChevronView(ViewHolder vh, GuidedAction action) {
-        vh.mChevronView.setVisibility(action.hasNext() ? View.VISIBLE : View.GONE);
-        vh.mChevronView.setAlpha(action.isEnabled() ? mEnabledChevronAlpha :
-                mDisabledChevronAlpha);
+        final boolean hasNext = action.hasNext();
+        final boolean hasSubActions = action.hasSubActions();
+        if (hasNext || hasSubActions) {
+            vh.mChevronView.setVisibility(View.VISIBLE);
+            vh.mChevronView.setAlpha(action.isEnabled() ? mEnabledChevronAlpha :
+                    mDisabledChevronAlpha);
+            if (hasNext) {
+                float r = mMainView != null
+                        && mMainView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? 180f : 0f;
+                vh.mChevronView.setRotation(r);
+            } else if (action == mExpandedAction) {
+                vh.mChevronView.setRotation(270);
+            } else {
+                vh.mChevronView.setRotation(90);
+            }
+        } else {
+            vh.mChevronView.setVisibility(View.GONE);
+
+        }
+    }
+
+    /**
+     * Expands or collapse the sub actions list view.
+     * @param avh When not null, fill sub actions list of this ViewHolder into sub actions list and
+     * hide the other items in main list.  When null, collapse the sub actions list.
+     */
+    public void setExpandedViewHolder(ViewHolder avh) {
+        if (mSubActionsGridView == null || isInExpandTransition()) {
+            return;
+        }
+        if (isExpandTransitionSupported()) {
+            startExpandedTransition(avh);
+        } else {
+            onUpdateExpandedViewHolder(avh);
+        }
+    }
+
+    /**
+     * Returns true if it is running an expanding or collapsing transition, false otherwise.
+     * @return True if it is running an expanding or collapsing transition, false otherwise.
+     */
+    public boolean isInExpandTransition() {
+        return mExpandTransition != null;
+    }
+
+    /**
+     * Returns if expand/collapse animation is supported.  When this method returns true,
+     * {@link #startExpandedTransition(ViewHolder)} will be used.  When this method returns false,
+     * {@link #onUpdateExpandedViewHolder(ViewHolder)} will be called.
+     * @return True if it is running an expanding or collapsing transition, false otherwise.
+     */
+    public boolean isExpandTransitionSupported() {
+        return VERSION.SDK_INT >= 21;
+    }
+
+    /**
+     * Start transition to expand or collapse GuidedActionStylist.
+     * @param avh When not null, the GuidedActionStylist expands the sub actions of avh.  When null
+     * the GuidedActionStylist will collapse sub actions.
+     */
+    public void startExpandedTransition(ViewHolder avh) {
+        ViewHolder focusAvh = null; // expand / collapse view holder
+        final int count = mActionsGridView.getChildCount();
+        for (int i = 0; i < count; i++) {
+            ViewHolder vh = (ViewHolder) mActionsGridView
+                    .getChildViewHolder(mActionsGridView.getChildAt(i));
+            if (avh == null && vh.itemView.getVisibility() == View.VISIBLE) {
+                // going to collapse this one.
+                focusAvh = vh;
+                break;
+            } else if (avh != null && vh.getAction() == avh.getAction()) {
+                // going to expand this one.
+                focusAvh = vh;
+                break;
+            }
+        }
+        if (focusAvh == null) {
+            // huh?
+            onUpdateExpandedViewHolder(avh);
+            return;
+        }
+        Object set = TransitionHelper.createTransitionSet(false);
+        Object slideAndFade = TransitionHelper.createFadeAndShortSlide(Gravity.TOP | Gravity.BOTTOM,
+                (float) focusAvh.itemView.getHeight());
+        Object changeFocusItemTransform = TransitionHelper.createChangeTransform();
+        Object changeFocusItemBounds = TransitionHelper.createChangeBounds(false);
+        Object fadeGrid = TransitionHelper.createFadeTransition(TransitionHelper.FADE_IN |
+                TransitionHelper.FADE_OUT);
+        Object changeGridBounds = TransitionHelper.createChangeBounds(false);
+        if (avh == null) {
+            TransitionHelper.setStartDelay(slideAndFade, 150);
+            TransitionHelper.setStartDelay(changeFocusItemTransform, 100);
+            TransitionHelper.setStartDelay(changeFocusItemBounds, 100);
+        } else {
+            TransitionHelper.setStartDelay(fadeGrid, 100);
+            TransitionHelper.setStartDelay(changeGridBounds, 100);
+            TransitionHelper.setStartDelay(changeFocusItemTransform, 50);
+            TransitionHelper.setStartDelay(changeFocusItemBounds, 50);
+        }
+        for (int i = 0; i < count; i++) {
+            ViewHolder vh = (ViewHolder) mActionsGridView
+                    .getChildViewHolder(mActionsGridView.getChildAt(i));
+            if (vh == focusAvh) {
+                // going to expand/collapse this one.
+                TransitionHelper.include(changeFocusItemTransform, vh.itemView);
+                TransitionHelper.include(changeFocusItemBounds, vh.itemView);
+            } else {
+                // going to slide this item to top / bottom.
+                TransitionHelper.include(slideAndFade, vh.itemView);
+            }
+        }
+        TransitionHelper.include(fadeGrid, mSubActionsGridView);
+        TransitionHelper.include(changeGridBounds, mSubActionsGridView);
+        TransitionHelper.addTransition(set, slideAndFade);
+        TransitionHelper.addTransition(set, changeFocusItemTransform);
+        TransitionHelper.addTransition(set, changeFocusItemBounds);
+        TransitionHelper.addTransition(set, fadeGrid);
+        TransitionHelper.addTransition(set, changeGridBounds);
+        mExpandTransition = set;
+        TransitionHelper.addTransitionListener(mExpandTransition, new TransitionListener() {
+            @Override
+            public void onTransitionEnd(Object transition) {
+                mExpandTransition = null;
+            }
+        });
+        if (avh != null && mSubActionsGridView.getTop() != avh.itemView.getTop()) {
+            // For expanding, set the initial position of subActionsGridView before running
+            // a ChangeBounds on it.
+            final ViewHolder toUpdate = avh;
+            mSubActionsGridView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+                @Override
+                public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                        int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                    if (mSubActionsGridView == null) {
+                        return;
+                    }
+                    mSubActionsGridView.removeOnLayoutChangeListener(this);
+                    mMainView.post(new Runnable() {
+                        public void run() {
+                            if (mMainView == null) {
+                                return;
+                            }
+                            TransitionHelper.beginDelayedTransition(mMainView, mExpandTransition);
+                            onUpdateExpandedViewHolder(toUpdate);
+                        }
+                    });
+                }
+            });
+            ViewGroup.MarginLayoutParams lp =
+                    (ViewGroup.MarginLayoutParams) mSubActionsGridView.getLayoutParams();
+            lp.topMargin = avh.itemView.getTop();
+            lp.height = 0;
+            mSubActionsGridView.setLayoutParams(lp);
+            return;
+        }
+        TransitionHelper.beginDelayedTransition(mMainView, mExpandTransition);
+        onUpdateExpandedViewHolder(avh);
+    }
+
+    /**
+     * @return True if sub actions list is expanded.
+     */
+    public boolean isSubActionsExpanded() {
+        return mExpandedAction != null;
+    }
+
+    /**
+     * @return Current expanded GuidedAction or null if not expanded.
+     */
+    public GuidedAction getExpandedAction() {
+        return mExpandedAction;
+    }
+
+    /**
+     * Expand or collapse GuidedActionStylist.
+     * @param avh When not null, the GuidedActionStylist expands the sub actions of avh.  When null
+     * the GuidedActionStylist will collapse sub actions.
+     */
+    public void onUpdateExpandedViewHolder(ViewHolder avh) {
+        if (avh == null) {
+            mExpandedAction = null;
+        } else if (avh.getAction() != mExpandedAction) {
+            mExpandedAction = avh.getAction();
+        }
+        // In expanding mode, notifyItemChange on expanded item will reset the translationY by
+        // the default ItemAnimator.  So disable ItemAnimation in expanding mode.
+        mActionsGridView.setAnimateChildLayout(false);
+        final int count = mActionsGridView.getChildCount();
+        for (int i = 0; i < count; i++) {
+            ViewHolder vh = (ViewHolder) mActionsGridView
+                    .getChildViewHolder(mActionsGridView.getChildAt(i));
+            updateChevronAndVisibility(vh);
+        }
+        if (mSubActionsGridView != null) {
+            if (avh != null) {
+                ViewGroup.MarginLayoutParams lp =
+                        (ViewGroup.MarginLayoutParams) mSubActionsGridView.getLayoutParams();
+                lp.topMargin = avh.itemView.getTop();
+                lp.height = ViewGroup.MarginLayoutParams.MATCH_PARENT;
+                mSubActionsGridView.setLayoutParams(lp);
+                mSubActionsGridView.setVisibility(View.VISIBLE);
+                mSubActionsGridView.requestFocus();
+                mSubActionsGridView.setSelectedPosition(0);
+                ((GuidedActionAdapter) mSubActionsGridView.getAdapter())
+                        .setActions(avh.getAction().getSubActions());
+            } else {
+                mSubActionsGridView.setVisibility(View.INVISIBLE);
+                ViewGroup.MarginLayoutParams lp =
+                        (ViewGroup.MarginLayoutParams) mSubActionsGridView.getLayoutParams();
+                lp.height = 0;
+                mSubActionsGridView.setLayoutParams(lp);
+                ((GuidedActionAdapter) mSubActionsGridView.getAdapter())
+                        .setActions(Collections.EMPTY_LIST);
+                mActionsGridView.requestFocus();
+            }
+        }
+    }
+
+    private void updateChevronAndVisibility(ViewHolder vh) {
+        if (!vh.isSubAction()) {
+            if (mExpandedAction == null) {
+                vh.itemView.setVisibility(View.VISIBLE);
+                vh.itemView.setTranslationY(0);
+            } else if (vh.getAction() == mExpandedAction) {
+                vh.itemView.setVisibility(View.VISIBLE);
+                vh.itemView.setTranslationY(- vh.itemView.getHeight());
+            } else {
+                vh.itemView.setVisibility(View.INVISIBLE);
+                vh.itemView.setTranslationY(0);
+            }
+        }
+        if (vh.mChevronView != null) {
+            onBindChevronView(vh, vh.getAction());
+        }
     }
 
     /*
@@ -815,45 +1039,4 @@
         return (int)(mDisplayHeight - 2*mVerticalPadding - 2*mTitleMaxLines*title.getLineHeight());
     }
 
-    private void endSelectorAnimator() {
-        if (mSelectorAnimator != null) {
-            mSelectorAnimator.end();
-            mSelectorAnimator = null;
-        }
-    }
-
-    private void updateSelectorView(boolean animate) {
-        if (mActionsGridView == null || mSelectorView == null || mSelectorView.getHeight() <= 0) {
-            return;
-        }
-        final View focusedChild = mActionsGridView.getFocusedChild();
-        endSelectorAnimator();
-        if (focusedChild == null || !mActionsGridView.hasFocus()
-                || mActionsGridView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
-            if (animate) {
-                mSelectorAnimator = createAnimator(mSelectorView,
-                        R.attr.guidedActionsSelectorHideAnimation);
-                mSelectorAnimator.start();
-            } else {
-                mSelectorView.setAlpha(0f);
-            }
-        } else {
-            final float scaleY = (float) focusedChild.getHeight() / mSelectorView.getHeight();
-            Rect r = new Rect(0, 0, focusedChild.getWidth(), focusedChild.getHeight());
-            mMainView.offsetDescendantRectToMyCoords(focusedChild, r);
-            mMainView.offsetRectIntoDescendantCoords(mSelectorView, r);
-            mSelectorView.setTranslationY(r.exactCenterY() - mSelectorView.getHeight() * 0.5f);
-            if (animate) {
-                mSelectorAnimator = createAnimator(mSelectorView,
-                        R.attr.guidedActionsSelectorShowAnimation);
-                ((ObjectAnimator) ((AnimatorSet) mSelectorAnimator).getChildAnimations().get(1))
-                        .setFloatValues(scaleY);
-                mSelectorAnimator.start();
-            } else {
-                mSelectorView.setAlpha(1f);
-                mSelectorView.setScaleY(scaleY);
-            }
-        }
-    }
-
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
index 5540f78..6fbabc0 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
@@ -77,17 +77,52 @@
             mPaddingRight = mGridView.getPaddingRight();
         }
 
+        /**
+         * Gets ListRowPresenter that creates this ViewHolder.
+         * @return ListRowPresenter that creates this ViewHolder.
+         */
         public final ListRowPresenter getListRowPresenter() {
             return mListRowPresenter;
         }
 
+        /**
+         * Gets HorizontalGridView that shows a list of items.
+         * @return HorizontalGridView that shows a list of items.
+         */
         public final HorizontalGridView getGridView() {
             return mGridView;
         }
 
+        /**
+         * Gets ItemBridgeAdapter that creates the list of items.
+         * @return ItemBridgeAdapter that creates the list of items.
+         */
         public final ItemBridgeAdapter getBridgeAdapter() {
             return mItemBridgeAdapter;
         }
+
+        /**
+         * Gets selected item position in adapter.
+         * @return Selected item position in adapter.
+         */
+        public int getSelectedPosition() {
+            return mGridView.getSelectedPosition();
+        }
+
+        /**
+         * Gets ViewHolder at a position in adapter.  Returns null if the item does not exist
+         * or the item is not bound to a view.
+         * @param position Position of the item in adapter.
+         * @return ViewHolder bounds to the item.
+         */
+        public Presenter.ViewHolder getItemViewHolder(int position) {
+            ItemBridgeAdapter.ViewHolder ibvh = (ItemBridgeAdapter.ViewHolder) mGridView
+                    .findViewHolderForAdapterPosition(position);
+            if (ibvh == null) {
+                return null;
+            }
+            return ibvh.getViewHolder();
+        }
     }
 
     class ListRowPresenterItemBridgeAdapter extends ItemBridgeAdapter {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenterSelectItemViewHolderTask.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenterSelectItemViewHolderTask.java
new file mode 100644
index 0000000..c56e493
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenterSelectItemViewHolderTask.java
@@ -0,0 +1,103 @@
+/*
+ * 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.v7.widget.RecyclerView;
+
+/**
+ * A task on the ListRowPresenter.ViewHolder that can select an item by position in the
+ * HorizontalGridView and perform an optional item task on it.
+ */
+public class ListRowPresenterSelectItemViewHolderTask extends PresenterViewHolderTask {
+
+    private int mItemPosition;
+    private boolean mSmooth = true;
+    private PresenterViewHolderTask mItemTask;
+
+    public ListRowPresenterSelectItemViewHolderTask(int itemPosition) {
+        setItemPosition(itemPosition);
+    }
+
+    /**
+     * Sets the adapter position of item to select.
+     * @param itemPosition Position of the item in adapter.
+     */
+    public void setItemPosition(int itemPosition) {
+        mItemPosition = itemPosition;
+    }
+
+    /**
+     * Returns the adapter position of item to select.
+     * @return The adapter position of item to select.
+     */
+    public int getItemPosition() {
+        return mItemPosition;
+    }
+
+    /**
+     * Sets smooth scrolling to the item or jump to the item without scrolling.  By default it is
+     * true.
+     * @param smooth True for smooth scrolling to the item, false otherwise.
+     */
+    public void setSmooth(boolean smooth) {
+        mSmooth = smooth;
+    }
+
+    /**
+     * Returns true if smooth scrolling to the item false otherwise.  By default it is true.
+     * @return True for smooth scrolling to the item, false otherwise.
+     */
+    public boolean isSmooth() {
+        return mSmooth;
+    }
+
+    /**
+     * Returns optional task to run when the item is selected, null for no task.
+     * @return Optional task to run when the item is selected, null for no task.
+     */
+    public PresenterViewHolderTask getItemTask() {
+        return mItemTask;
+    }
+
+    /**
+     * Sets task to run when the item is selected, null for no task.
+     * @param itemTask Optional task to run when the item is selected, null for no task.
+     */
+    public void setItemTask(PresenterViewHolderTask itemTask) {
+        mItemTask = itemTask;
+    }
+
+    @Override
+    public void run(Presenter.ViewHolder holder) {
+        if (holder instanceof ListRowPresenter.ViewHolder) {
+            HorizontalGridView gridView = ((ListRowPresenter.ViewHolder) holder).getGridView();
+            ViewHolderTask task = null;
+            if (mItemTask != null) {
+                task = new ViewHolderTask() {
+                    final PresenterViewHolderTask itemTask = mItemTask;
+                    @Override
+                    public void run(RecyclerView.ViewHolder rvh) {
+                        ItemBridgeAdapter.ViewHolder ibvh = (ItemBridgeAdapter.ViewHolder) rvh;
+                        itemTask.run(ibvh.getViewHolder());
+                    }
+                };
+            }
+            if (mSmooth) {
+                gridView.setSelectedPositionSmooth(mItemPosition, task);
+            } else {
+                gridView.setSelectedPosition(mItemPosition, task);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java b/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java
new file mode 100644
index 0000000..52832e9
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package android.support.v17.leanback.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build.VERSION;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+/**
+ * Implements foreground drawable before M and falls back to M's foreground implementation.
+ * @hide
+ */
+class NonOverlappingLinearLayoutWithForeground extends LinearLayout {
+
+    private static final int VERSION_M = 23;
+
+    private Drawable mForeground;
+    private boolean mForegroundBoundsChanged;
+    private final Rect mSelfBounds = new Rect();
+
+    public NonOverlappingLinearLayoutWithForeground(Context context) {
+        this(context, null);
+    }
+
+    public NonOverlappingLinearLayoutWithForeground(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public NonOverlappingLinearLayoutWithForeground(Context context, AttributeSet attrs,
+            int defStyle) {
+        super(context, attrs, defStyle);
+        if (context.getApplicationInfo().targetSdkVersion >= VERSION_M
+                && VERSION.SDK_INT >= VERSION_M) {
+            // dont need do anything, base View constructor >=M already reads the foreground if
+            // targetSDK is >= M.
+        } else {
+            // in other cases, including M but targetSDK is less than M, we need setForeground in
+            // code.
+            TypedArray a = context.obtainStyledAttributes(attrs,
+                    new int[] { android.R.attr.foreground });
+            Drawable d = a.getDrawable(0);
+            if (d != null) {
+                setForegroundCompat(d);
+            }
+        }
+    }
+
+    public void setForegroundCompat(Drawable d) {
+        if (VERSION.SDK_INT >= VERSION_M) {
+            // From M,  foreground is naturally supported.
+            ForegroundHelper.getInstance().setForeground(this, d);
+        } else {
+            // before M, do our own customized foreground draw.
+            if (mForeground != d) {
+                mForeground = d;
+                mForegroundBoundsChanged = true;
+                setWillNotDraw(false);
+                mForeground.setCallback(this);
+                if (mForeground.isStateful()) {
+                    mForeground.setState(getDrawableState());
+                }
+            }
+        }
+    }
+
+    public Drawable getForegroundCompat() {
+        if (VERSION.SDK_INT >= VERSION_M) {
+            return ForegroundHelper.getInstance().getForeground(this);
+        } else {
+            return mForeground;
+        }
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+        if (mForeground != null) {
+            final Drawable foreground = mForeground;
+            if (mForegroundBoundsChanged) {
+                mForegroundBoundsChanged = false;
+                final Rect selfBounds = mSelfBounds;
+                final int w = getRight() - getLeft();
+                final int h = getBottom() - getTop();
+                selfBounds.set(0, 0, w, h);
+                foreground.setBounds(selfBounds);
+            }
+            foreground.draw(canvas);
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+        mForegroundBoundsChanged |= changed;
+    }
+
+    @Override
+    protected boolean verifyDrawable(Drawable who) {
+        return super.verifyDrawable(who) || (who == mForeground);
+    }
+
+    @Override
+    public void jumpDrawablesToCurrentState() {
+        super.jumpDrawablesToCurrentState();
+        if (mForeground != null) {
+            mForeground.jumpToCurrentState();
+        }
+    }
+
+    @Override
+    protected void drawableStateChanged() {
+        super.drawableStateChanged();
+        if (mForeground != null && mForeground.isStateful()) {
+            mForeground.setState(getDrawableState());
+        }
+    }
+
+    /**
+     * Avoids creating a hardware layer when animating alpha.
+     */
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java
index 1ee77f2..60327f2 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java
@@ -554,7 +554,7 @@
          * @param highlightColor Color for the highlighted icon state.
          */
         public ClosedCaptioningAction(Context context, int highlightColor) {
-            super(R.id.lb_control_high_quality);
+            super(R.id.lb_control_closed_captioning);
             BitmapDrawable uncoloredDrawable = (BitmapDrawable) getStyledDrawable(context,
                     R.styleable.lbPlaybackControlsActionIcons_closed_captioning);
             Drawable[] drawables = new Drawable[2];
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PresenterViewHolderTask.java b/v17/leanback/src/android/support/v17/leanback/widget/PresenterViewHolderTask.java
new file mode 100644
index 0000000..6db2d75
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PresenterViewHolderTask.java
@@ -0,0 +1,26 @@
+/*
+ * 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;
+
+/**
+ * Base class to perform a task on Presenter.ViewHolder.
+ */
+public abstract class PresenterViewHolderTask {
+    /**
+     * Called to perform a task on view holder.
+     * @param holder The view holder to perform task.
+     */
+    public void run(Presenter.ViewHolder holder) {
+    }
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ViewHolderTask.java b/v17/leanback/src/android/support/v17/leanback/widget/ViewHolderTask.java
new file mode 100644
index 0000000..6103487
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ViewHolderTask.java
@@ -0,0 +1,23 @@
+/*
+ * 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.v7.widget.RecyclerView;
+
+/**
+ * Interface for schedule task on a ViewHolder.
+ */
+public interface ViewHolderTask {
+    public void run(RecyclerView.ViewHolder viewHolder);
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
new file mode 100644
index 0000000..b24986c
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
@@ -0,0 +1,341 @@
+/*
+ * 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.picker;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.v17.leanback.R;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * {@link DatePicker} is a directly subclass of {@link Picker}.
+ * This class is a widget for selecting a date. The date can be selected by a
+ * year, month, and day Columns. The "minDate" and "maxDate" from which dates to be selected
+ * can be customized.  The columns can be customized by attribute "datePickerFormat".
+ *
+ * @attr ref R.styleable#lbDatePicker_android_maxDate
+ * @attr ref R.styleable#lbDatePicker_android_minDate
+ * @attr ref R.styleable#lbDatePicker_datePickerFormat
+ */
+
+public class DatePicker extends Picker {
+
+    static final String LOG_TAG = "DatePicker";
+
+    PickerColumn mMonthColumn;
+    PickerColumn mDayColumn;
+    PickerColumn mYearColumn;
+    int mColMonthIndex;
+    int mColDayIndex;
+    int mColYearIndex;
+
+    final static String DATE_FORMAT = "MM/dd/yyyy";
+    final DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
+    PickerConstant mConstant;
+
+    Calendar mMinDate;
+    Calendar mMaxDate;
+    Calendar mCurrentDate;
+    Calendar mTempDate;
+
+    public DatePicker(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        updateCurrentLocale();
+
+        final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
+                R.styleable.lbDatePicker);
+        String minDate = attributesArray.getString(R.styleable.lbDatePicker_android_minDate);
+        String maxDate = attributesArray.getString(R.styleable.lbDatePicker_android_maxDate);
+        String datePickerFormat = attributesArray
+                .getString(R.styleable.lbDatePicker_datePickerFormat);
+
+        if (TextUtils.isEmpty(datePickerFormat)) {
+            datePickerFormat = new String(
+                    android.text.format.DateFormat.getDateFormatOrder(context));
+        }
+        datePickerFormat = datePickerFormat.toUpperCase();
+        ArrayList<PickerColumn> columns = new ArrayList<PickerColumn>(3);
+        for (int i = 0; i < datePickerFormat.length(); i++) {
+            switch (datePickerFormat.charAt(i)) {
+            case 'Y':
+                if (mYearColumn != null) {
+                    throw new IllegalArgumentException("datePicker format error");
+                }
+                columns.add(mYearColumn = new PickerColumn());
+                mColYearIndex = i;
+                mYearColumn.setValueLabelFormat("%d");
+                break;
+            case 'M':
+                if (mMonthColumn != null) {
+                    throw new IllegalArgumentException("datePicker format error");
+                }
+                columns.add(mMonthColumn = new PickerColumn());
+                mMonthColumn.setValueStaticLabels(mConstant.months);
+                mColMonthIndex = i;
+                break;
+            case 'D':
+                if (mDayColumn != null) {
+                    throw new IllegalArgumentException("datePicker format error");
+                }
+                columns.add(mDayColumn = new PickerColumn());
+                mDayColumn.setValueLabelFormat("%02d");
+                mColDayIndex = i;
+                break;
+            default:
+                throw new IllegalArgumentException("datePicker format error");
+            }
+        }
+        setColumns(columns);
+
+        mTempDate.clear();
+        if (!TextUtils.isEmpty(minDate)) {
+            if (!parseDate(minDate, mTempDate)) {
+                mTempDate.set(1900, 0, 1);
+            }
+        } else {
+            mTempDate.set(1900, 0, 1);
+        }
+        setMinDate(mTempDate.getTimeInMillis());
+
+        mTempDate.clear();
+        if (!TextUtils.isEmpty(maxDate)) {
+            if (!parseDate(maxDate, mTempDate)) {
+                mTempDate.set(2100, 0, 1);
+            }
+        } else {
+            mTempDate.set(2100, 0, 1);
+        }
+        setMaxDate(mTempDate.getTimeInMillis());
+
+    }
+
+    private boolean parseDate(String date, Calendar outDate) {
+        try {
+            outDate.setTime(mDateFormat.parse(date));
+            return true;
+        } catch (ParseException e) {
+            Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
+            return false;
+        }
+    }
+
+    @Override
+    protected String getSeparator() {
+        return mConstant.dateSeparator;
+    }
+
+
+    private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
+        if (oldCalendar == null) {
+            return Calendar.getInstance(locale);
+        } else {
+            final long currentTimeMillis = oldCalendar.getTimeInMillis();
+            Calendar newCalendar = Calendar.getInstance(locale);
+            newCalendar.setTimeInMillis(currentTimeMillis);
+            return newCalendar;
+        }
+    }
+
+    private void updateCurrentLocale() {
+        mConstant = new PickerConstant(Locale.getDefault(), getContext().getResources());
+        mTempDate = getCalendarForLocale(mTempDate, mConstant.locale);
+        mMinDate = getCalendarForLocale(mMinDate, mConstant.locale);
+        mMaxDate = getCalendarForLocale(mMaxDate, mConstant.locale);
+        mCurrentDate = getCalendarForLocale(mCurrentDate, mConstant.locale);
+
+        if (mMonthColumn != null) {
+            mMonthColumn.setValueStaticLabels(mConstant.months);
+            updateAdapter(mColMonthIndex);
+        }
+    }
+
+    @Override
+    public void onColumnValueChange(int column, int newVal) {
+        mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis());
+        // take care of wrapping of days and months to update greater fields
+        int oldVal = getColumnAt(column).getCurrentValue();
+        if (column == mColDayIndex) {
+            mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
+        } else if (column == mColMonthIndex) {
+            mTempDate.add(Calendar.MONTH, newVal - oldVal);
+        } else if (column == mColYearIndex) {
+            mTempDate.add(Calendar.YEAR, newVal - oldVal);
+        } else {
+            throw new IllegalArgumentException();
+        }
+        setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH),
+                mTempDate.get(Calendar.DAY_OF_MONTH));
+        updateSpinners(false);
+    }
+
+
+    /**
+     * Sets the minimal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param minDate The minimal supported date.
+     */
+    public void setMinDate(long minDate) {
+        mTempDate.setTimeInMillis(minDate);
+        if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
+                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) {
+            return;
+        }
+        mMinDate.setTimeInMillis(minDate);
+        if (mCurrentDate.before(mMinDate)) {
+            mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+        }
+        updateSpinners(false);
+    }
+
+
+    /**
+     * Gets the minimal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     * <p>
+     * Note: The default minimal date is 01/01/1900.
+     * <p>
+     *
+     * @return The minimal supported date.
+     */
+    public Calendar getMinDate() {
+        final Calendar minDate = Calendar.getInstance();
+        minDate.setTimeInMillis(mMinDate.getTimeInMillis());
+        return minDate;
+    }
+
+    /**
+     * Sets the maximal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param maxDate The maximal supported date.
+     */
+    public void setMaxDate(long maxDate) {
+        mTempDate.setTimeInMillis(maxDate);
+        if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR)
+                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) {
+            return;
+        }
+        mMaxDate.setTimeInMillis(maxDate);
+        if (mCurrentDate.after(mMaxDate)) {
+            mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+        }
+        updateSpinners(false);
+    }
+
+    /**
+     * Gets the maximal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     * <p>
+     * Note: The default maximal date is 12/31/2100.
+     * <p>
+     *
+     * @return The maximal supported date.
+     */
+    public Calendar getMaxDate() {
+        final Calendar maxDate = Calendar.getInstance();
+        maxDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+        return maxDate;
+    }
+
+    private void setDate(int year, int month, int dayOfMonth) {
+        mCurrentDate.set(year, month, dayOfMonth);
+        if (mCurrentDate.before(mMinDate)) {
+            mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+        } else if (mCurrentDate.after(mMaxDate)) {
+            mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+        }
+    }
+
+    /**
+     * Update the current date.
+     *
+     * @param year The year.
+     * @param month The month which is <strong>starting from zero</strong>.
+     * @param dayOfMonth The day of the month.
+     * @param animation True to run animation to scroll the column.
+     */
+    public void updateDate(int year, int month, int dayOfMonth, boolean animation) {
+        if (!isNewDate(year, month, dayOfMonth)) {
+            return;
+        }
+        setDate(year, month, dayOfMonth);
+        updateSpinners(animation);
+    }
+
+    private boolean isNewDate(int year, int month, int dayOfMonth) {
+        return (mCurrentDate.get(Calendar.YEAR) != year
+                || mCurrentDate.get(Calendar.MONTH) != dayOfMonth
+                || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month);
+    }
+
+    private void updateSpinners(boolean animation) {
+        // set the spinner ranges respecting the min and max dates
+        boolean dayRangeChanged = false;
+        boolean monthRangeChanged = false;
+        if (mCurrentDate.equals(mMinDate)) {
+            dayRangeChanged |= mDayColumn.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+            dayRangeChanged |= mDayColumn.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
+            monthRangeChanged |= mMonthColumn.setMinValue(mCurrentDate.get(Calendar.MONTH));
+            monthRangeChanged |= mMonthColumn.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH));
+        } else if (mCurrentDate.equals(mMaxDate)) {
+            dayRangeChanged |= mDayColumn.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH));
+            dayRangeChanged |= mDayColumn.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+            monthRangeChanged |= mMonthColumn.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH));
+            monthRangeChanged |= mMonthColumn.setMaxValue(mCurrentDate.get(Calendar.MONTH));
+        } else {
+            dayRangeChanged |= mDayColumn.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH));
+            dayRangeChanged |= mDayColumn.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
+            monthRangeChanged |= mMonthColumn.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH));
+            monthRangeChanged |= mMonthColumn.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH));
+        }
+
+        // year spinner range does not change based on the current date
+        boolean yearRangeChanged = false;
+        yearRangeChanged |= mYearColumn.setMinValue(mMinDate.get(Calendar.YEAR));
+        yearRangeChanged |= mYearColumn.setMaxValue(mMaxDate.get(Calendar.YEAR));
+
+        if (dayRangeChanged) {
+            updateAdapter(mColDayIndex);
+        }
+        if (monthRangeChanged) {
+            updateAdapter(mColMonthIndex);
+        }
+        if (yearRangeChanged) {
+            updateAdapter(mColYearIndex);
+        }
+        // set the spinner values
+        updateValue(mColYearIndex, mCurrentDate.get(Calendar.YEAR), animation);
+        updateValue(mColMonthIndex, mCurrentDate.get(Calendar.MONTH), animation);
+        updateValue(mColDayIndex, mCurrentDate.get(Calendar.DAY_OF_MONTH), animation);
+
+    }
+
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
new file mode 100644
index 0000000..1b62889
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
@@ -0,0 +1,628 @@
+/*
+ * 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.picker;
+
+import android.content.Context;
+import android.support.v17.leanback.R;
+import android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
+import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Picker is a widget showing multiple customized {@link PickerColumn}s.  The PickerColumns are
+ * initialized in {@link #setColumns(ArrayList)}.  You could only set columns once and not able to
+ * add or remove Column later.  Call {@link #updateAdapter(int)} if the column value range or labels
+ * change.  Call {@link #updateValue(int, int, boolean)} to update the current value of
+ * PickerColumn.
+ * <p>
+ * Picker has two states and will change height:
+ * <li>{@link #isExpanded()} is true: Picker shows typically three items vertically (see
+ * {@link #getVisiblePickerItemsInExpand()}}. Columns other than {@link #getActiveColumn()} still
+ * shows one item if the Picker is focused.  On a touch screen device, the Picker will not get
+ * focus so it always show three items on all columns.   On a non-touch device (a TV), the Picker
+ * will show three items only on currently activated column.  If the Picker has focus, it will
+ * intercept DPAD directions and select activated column.
+ * <li>{@link #isExpanded()} is false: Picker shows one item vertically (see
+ * {@link #getVisiblePickerItems()}) on all columns.  The size of Picker shrinks.
+ * <li> The expand mode will be toggled if the Picker has focus and {@link #isToggleExpandOnClick()}
+ * is true.
+ * Summarize Typically use cases:
+ * <li> On a touch screen based device,  the Picker focusableInTouchMode=false.  It won't get focus,
+ * it wont toggle expand mode on click or touch, should call {@link #setExpanded(boolean)} with
+ * true, so that user always sees three items on all columns.
+ * <li> On a TV: the Picker focusable=true.  It will get focus and toggle into expand mode when user
+ * clicks on it, toggle can be disabled by {@link #setToggleExpandOnClick(boolean)} with false.
+ * Only the activated column shows multiple items and the activated column is selected by DPAD left
+ * or right.
+ */
+public class Picker extends FrameLayout {
+
+    public interface PickerValueListener {
+        public void onValueChanged(Picker picker, int column);
+    }
+
+    private String mSeparator;
+    private ViewGroup mRootView;
+    private ViewGroup mPickerView;
+    private List<VerticalGridView> mColumnViews = new ArrayList<VerticalGridView>();
+    private ArrayList<PickerColumn> mColumns;
+
+    private float mUnfocusedAlpha;
+    private float mFocusedAlpha;
+    private float mVisibleColumnAlpha;
+    private float mInvisibleColumnAlpha;
+    private int mAlphaAnimDuration;
+    private Interpolator mDecelerateInterpolator;
+    private Interpolator mAccelerateInterpolator;
+    private ArrayList<PickerValueListener> mListeners;
+    private boolean mExpanded;
+    private float mVisibleItemsInExpand = 3;
+    private float mVisibleItems = 1;
+    private int mActivatedColumn = 0;
+    private boolean mToggleExpandOnClick = true;
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the separator string
+     */
+    protected String getSeparator() {
+        return mSeparator;
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s root layout id
+     */
+    protected int getRootLayoutId() {
+        return R.layout.lb_picker;
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s id from within the layout provided by
+     * {@link Picker#getRootLayoutId()}
+     */
+    protected int getPickerId() {
+        return R.id.picker;
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s separator's layout id
+     */
+    protected int getPickerSeparatorLayoutId() {
+        return R.layout.lb_picker_separator;
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s item's layout id
+     */
+    protected int getPickerItemLayoutId() {
+        return R.layout.lb_picker_item;
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s item's {@link TextView}'s id from within the
+     * layout provided by {@link Picker#getPickerItemLayoutId()} or 0 if the
+     * layout provided by {@link Picker#getPickerItemLayoutId()} is a {link
+     * TextView}.
+     */
+    protected int getPickerItemTextViewId() {
+        return 0;
+    }
+
+    /**
+     * Creates a Picker widget.
+     * @param context
+     * @param attrs
+     * @param defStyleAttr
+     */
+    public Picker(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        // On TV, Picker is focusable and intercept Click / DPAD direction keys.  We dont want any
+        // child to get focus.  On touch screen, Picker is not focusable.
+        setFocusable(true);
+        setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+        // Make it enabled and clickable to receive Click event.
+        setEnabled(true);
+        setClickable(true);
+
+        mFocusedAlpha = 1f; //getFloat(R.dimen.list_item_selected_title_text_alpha);
+        mUnfocusedAlpha = 1f; //getFloat(R.dimen.list_item_unselected_text_alpha);
+        mVisibleColumnAlpha = 0.5f; //getFloat(R.dimen.picker_item_visible_column_item_alpha);
+        mInvisibleColumnAlpha = 0f; //getFloat(R.dimen.picker_item_invisible_column_item_alpha);
+
+        mAlphaAnimDuration = 200; // mContext.getResources().getInteger(R.integer.dialog_animation_duration);
+
+        mDecelerateInterpolator = new DecelerateInterpolator(2.5F);
+        mAccelerateInterpolator = new AccelerateInterpolator(2.5F);
+
+        LayoutInflater inflater = LayoutInflater.from(getContext());
+        mRootView = (ViewGroup) inflater.inflate(getRootLayoutId(), this, true);
+        mPickerView = (ViewGroup) mRootView.findViewById(getPickerId());
+
+    }
+
+    /**
+     * Get nth PickerColumn.
+     * @param colIndex  Index of PickerColumn.
+     * @return PickerColumn at colIndex or null if {@link #setColumns(ArrayList)} is not called yet.
+     */
+    public PickerColumn getColumnAt(int colIndex) {
+        if (mColumns == null) {
+            return null;
+        }
+        return mColumns.get(colIndex);
+    }
+
+    /**
+     * Get number of PickerColumns.
+     * @return Number of PickerColumns or 0 if {@link #setColumns(ArrayList)} is not called yet.
+     */
+    public int getColumnsCount() {
+        if (mColumns == null) {
+            return 0;
+        }
+        return mColumns.size();
+    }
+
+    /**
+     * Set columns and create Views.  The method is only allowed to be called once.
+     * @param columns PickerColumns to be shown in the Picker.
+     */
+    public void setColumns(ArrayList<PickerColumn> columns) {
+        if (mColumns != null) {
+            throw new IllegalStateException("columns can only be initialized once");
+        }
+        mColumns = columns;
+        LayoutInflater inflater = LayoutInflater.from(getContext());
+        int totalCol = getColumnsCount();
+        for (int i = 0; i < totalCol; i++) {
+            final int colIndex = i;
+            final VerticalGridView columnView = (VerticalGridView) inflater.inflate(
+                    R.layout.lb_picker_column, mPickerView, false);
+            // we dont want VerticalGridView to receive focus.
+            columnView.setFocusableInTouchMode(false);
+            columnView.setFocusable(false);
+            updateColumnSize(columnView);
+            // always center aligned, not aligning selected item on top/bottom edge.
+            columnView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
+            // Width is dynamic, so has fixed size is false.
+            columnView.setHasFixedSize(false);
+            mColumnViews.add(columnView);
+
+            // add view to root
+            mPickerView.addView(columnView);
+
+            // add a separator if not the last element
+            if (i != totalCol - 1 && getSeparator() != null) {
+                TextView separator = (TextView) inflater.inflate(
+                        getPickerSeparatorLayoutId(), mPickerView, false);
+                separator.setText(getSeparator());
+                mPickerView.addView(separator);
+            }
+
+            columnView.setAdapter(new PickerScrollArrayAdapter(getContext(),
+                    getPickerItemLayoutId(), getPickerItemTextViewId(), colIndex));
+            columnView.setOnChildViewHolderSelectedListener(mColumnChangeListener);
+        }
+    }
+
+    /**
+     * When column labels change or column range changes, call this function to re-populate the
+     * selection list.
+     * @param columnIndex Index of column to update.
+     */
+    public void updateAdapter(int columnIndex) {
+        VerticalGridView columnView = mColumnViews.get(columnIndex);
+        PickerScrollArrayAdapter adapter = (PickerScrollArrayAdapter) columnView.getAdapter();
+        if (adapter != null) {
+            adapter.notifyDataSetChanged();
+        }
+    }
+
+    /**
+     * Manually set current value of a column.  The function will update UI and notify listeners.
+     * @param columnIndex Index of column to update.
+     * @param value New value of the column.
+     * @param runAnimation True to scroll to the value or false otherwise.
+     */
+    public void updateValue(int columnIndex, int value, boolean runAnimation) {
+        if (mColumns.get(columnIndex).setCurrentValue(value)) {
+            notifyValueChanged(columnIndex);
+            VerticalGridView columnView = mColumnViews.get(columnIndex);
+            if (columnView != null) {
+                int position = value - mColumns.get(columnIndex).getMinValue();
+                if (runAnimation) {
+                    columnView.setSelectedPositionSmooth(position);
+                } else {
+                    columnView.setSelectedPosition(position);
+                }
+            }
+        }
+    }
+
+    private void notifyValueChanged(int columnIndex) {
+        if (mListeners != null) {
+            for (int i = mListeners.size() - 1; i >= 0; i--) {
+                mListeners.get(i).onValueChanged(this, columnIndex);
+            }
+        }
+    }
+
+    public void addPickerValueListener(PickerValueListener listener) {
+        if (mListeners == null) {
+            mListeners = new ArrayList<Picker.PickerValueListener>();
+        }
+        mListeners.add(listener);
+    }
+
+    public void removePickerValueListener(PickerValueListener listener) {
+        if (mListeners != null) {
+            mListeners.remove(listener);
+        }
+    }
+
+    private void updateColumnAlpha(int colIndex, boolean animate) {
+        VerticalGridView column = mColumnViews.get(colIndex);
+
+        int selected = column.getSelectedPosition();
+        View item;
+
+        for (int i = 0; i < column.getAdapter().getItemCount(); i++) {
+            item = column.getLayoutManager().findViewByPosition(i);
+            if (item != null) {
+                setOrAnimateAlpha(item, (selected == i), colIndex, animate);
+            }
+        }
+    }
+
+    private void setOrAnimateAlpha(View view, boolean selected, int colIndex,
+            boolean animate) {
+        boolean columnShownAsActivated = colIndex == mActivatedColumn || !isFocused();
+        if (selected) {
+            // set alpha for main item (selected) in the column
+            if (columnShownAsActivated) {
+                setOrAnimateAlpha(view, animate, mFocusedAlpha, -1, mDecelerateInterpolator);
+            } else {
+                setOrAnimateAlpha(view, animate, mUnfocusedAlpha, -1,  mDecelerateInterpolator);
+            }
+        } else {
+            // set alpha for remaining items in the column
+            if (columnShownAsActivated) {
+                setOrAnimateAlpha(view, animate, mVisibleColumnAlpha, -1, mDecelerateInterpolator);
+            } else {
+                setOrAnimateAlpha(view, animate, mInvisibleColumnAlpha, -1,
+                        mDecelerateInterpolator);
+            }
+        }
+    }
+
+    private void setOrAnimateAlpha(View view, boolean animate, float destAlpha, float startAlpha,
+            Interpolator interpolator) {
+        view.animate().cancel();
+        if (!animate) {
+            view.setAlpha(destAlpha);
+        } else {
+            if (startAlpha >= 0.0f) {
+                // set a start alpha
+                view.setAlpha(startAlpha);
+            }
+            view.animate().alpha(destAlpha)
+                    .setDuration(mAlphaAnimDuration).setInterpolator(interpolator)
+                    .start();
+        }
+    }
+
+    /**
+     * Classes extending {@link Picker} can override this function to supply the
+     * behavior when a list has been scrolled.  Subclass may call {@link #updateValue(int, int,
+     * boolean)} and or {@link #updateAdapter(int)}.  Subclass should not directly call
+     * {@link PickerColumn#setCurrentValue(int)} which does not update internal state or notify
+     * listeners.
+     * @param columnIndex index of which column was changed.
+     * @param newValue A new value desired to be set on the column.
+     */
+    public void onColumnValueChange(int columnIndex, int newValue) {
+        if (mColumns.get(columnIndex).setCurrentValue(newValue)) {
+            notifyValueChanged(columnIndex);
+        }
+    }
+
+    private float getFloat(int resourceId) {
+        TypedValue buffer = new TypedValue();
+        getContext().getResources().getValue(resourceId, buffer, true);
+        return buffer.getFloat();
+    }
+
+    static class ViewHolder extends RecyclerView.ViewHolder {
+        final TextView textView;
+
+        ViewHolder(View v, TextView textView) {
+            super(v);
+            this.textView = textView;
+        }
+    }
+
+    class PickerScrollArrayAdapter extends RecyclerView.Adapter<ViewHolder> {
+
+        private final int mResource;
+        private final int mColIndex;
+        private final int mTextViewResourceId;
+        private PickerColumn mData;
+
+        PickerScrollArrayAdapter(Context context, int resource, int textViewResourceId,
+                int colIndex) {
+            mResource = resource;
+            mColIndex = colIndex;
+            mTextViewResourceId = textViewResourceId;
+            mData = mColumns.get(mColIndex);
+        }
+
+        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+            View v = inflater.inflate(mResource, parent, false);
+            TextView textView;
+            if (mTextViewResourceId != 0) {
+                textView = (TextView) v.findViewById(mTextViewResourceId);
+            } else {
+                textView = (TextView) v;
+            }
+            ViewHolder vh = new ViewHolder(v, textView);
+            return vh;
+        }
+
+        public void onBindViewHolder(ViewHolder holder, int position) {
+            if (holder.textView != null && mData != null) {
+                holder.textView.setText(mData.getValueLabelAt(mData.getMinValue() + position));
+            }
+            setOrAnimateAlpha(holder.itemView,
+                    (mColumnViews.get(mColIndex).getSelectedPosition() == position),
+                    mColIndex, false);
+        }
+
+        public void setData(PickerColumn data) {
+            mData = data;
+            notifyDataSetChanged();
+        }
+
+        public int getItemCount() {
+            return mData == null ? 0 : mData.getItemsCount();
+        }
+    }
+
+    private final OnChildViewHolderSelectedListener mColumnChangeListener = new
+            OnChildViewHolderSelectedListener() {
+
+        @Override
+        public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child,
+                int position, int subposition) {
+            PickerScrollArrayAdapter pickerScrollArrayAdapter = (PickerScrollArrayAdapter) parent
+                    .getAdapter();
+
+            int colIndex = mColumnViews.indexOf(parent);
+            updateColumnAlpha(colIndex, true);
+            if (child != null) {
+                int newValue = mColumns.get(colIndex).getMinValue() + position;
+                onColumnValueChange(colIndex, newValue);
+            }
+        }
+
+    };
+
+    @Override
+    public boolean dispatchKeyEvent(android.view.KeyEvent event) {
+        if (isExpanded()) {
+            final int keyCode = event.getKeyCode();
+            switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                if (event.getAction() == KeyEvent.ACTION_DOWN) {
+                    if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL?
+                            keyCode == KeyEvent.KEYCODE_DPAD_LEFT :
+                            keyCode == KeyEvent.KEYCODE_DPAD_RIGHT ) {
+                        if (mActivatedColumn < getColumnsCount() - 1) {
+                            setActiveColumn(mActivatedColumn + 1);
+                        }
+                    } else {
+                        if (mActivatedColumn > 0) {
+                            setActiveColumn(mActivatedColumn - 1);
+                        }
+                    }
+                }
+                break;
+            case KeyEvent.KEYCODE_DPAD_UP:
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+                if (event.getAction() == KeyEvent.ACTION_DOWN && mActivatedColumn >= 0) {
+                    VerticalGridView gridView = mColumnViews.get(mActivatedColumn);
+                    if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
+                        int newPosition = gridView.getSelectedPosition() - 1;
+                        if (newPosition >= 0) {
+                            gridView.setSelectedPositionSmooth(newPosition);
+                        }
+                    } else {
+                        int newPosition = gridView.getSelectedPosition() + 1;
+                        if (newPosition < gridView.getAdapter().getItemCount()) {
+                            gridView.setSelectedPositionSmooth(newPosition);
+                        }
+                    }
+                }
+                break;
+            default:
+                return super.dispatchKeyEvent(event);
+            }
+            return true;
+        }
+        return super.dispatchKeyEvent(event);
+    }
+
+    /**
+     * Classes extending {@link Picker} can choose to override this method to
+     * supply the {@link Picker}'s column's single item height in pixels.
+     */
+    protected int getPickerItemHeightPixels() {
+        return getContext().getResources().getDimensionPixelSize(R.dimen.picker_item_height);
+    }
+
+    private void updateColumnSize() {
+        for (int i = 0; i < getColumnsCount(); i++) {
+            updateColumnSize(mColumnViews.get(i));
+        }
+    }
+
+    private void updateColumnSize(VerticalGridView columnView) {
+        ViewGroup.LayoutParams lp = columnView.getLayoutParams();
+        lp.height = (int) (getPickerItemHeightPixels() * (isExpanded() ?
+                getVisiblePickerItemsInExpand() : getVisiblePickerItems()));
+        columnView.setLayoutParams(lp);
+    }
+
+    /**
+     * Returns number of visible items showing in a column when it's expanded, it's 3 by default.
+     * @return Number of visible items showing in a column when it's expanded.
+     */
+    public float getVisiblePickerItemsInExpand() {
+        return mVisibleItemsInExpand;
+    }
+
+    /**
+     * Change number of visible items showing in a column when it's expanded.
+     * @param visiblePickerItems Number of visible items showing in a column when it's expanded.
+     */
+    public void setVisiblePickerItemsInExpand(float visiblePickerItems) {
+        if (visiblePickerItems <= 0) {
+            throw new IllegalArgumentException();
+        }
+        if (mVisibleItemsInExpand != visiblePickerItems) {
+            mVisibleItemsInExpand = visiblePickerItems;
+            if (isExpanded()) {
+                updateColumnSize();
+            }
+        }
+    }
+
+    /**
+     * Returns number of visible items showing in a column when it's not expanded, it's 1 by
+     * default.
+     * @return Number of visible items showing in a column when it's not expanded.
+     */
+    public float getVisiblePickerItems() {
+        return 1;
+    }
+
+    /**
+     * Change number of visible items showing in a column when it's not expanded, it's 1 by default.
+     * @param pickerItems Number of visible items showing in a column when it's not expanded.
+     */
+    public void setVisiblePickerItems(float pickerItems) {
+        if (pickerItems <= 0) {
+            throw new IllegalArgumentException();
+        }
+        if (mVisibleItems != pickerItems) {
+            mVisibleItems = pickerItems;
+            if (!isExpanded()) {
+                updateColumnSize();
+            }
+        }
+    }
+
+    /**
+     * Change expanded state of Picker, the height LayoutParams will be changed.
+     * @see #getVisiblePickerItemsInExpand()
+     * @see #getVisiblePickerItems()
+     * @param expanded New expanded state of Picker.
+     */
+    public void setExpanded(boolean expanded) {
+        if (mExpanded != expanded) {
+            mExpanded = expanded;
+            updateColumnSize();
+        }
+    }
+
+    /**
+     * Returns true if the Picker is currently expanded, false otherwise.
+     * @return True if the Picker is currently expanded, false otherwise.
+     */
+    public boolean isExpanded() {
+        return mExpanded;
+    }
+
+    /**
+     * Change current activated column.  Shows multiple items on activate column if Picker has
+     * focus. Show multiple items on all column if Picker has no focus (e.g. a Touchscreen
+     * screen).
+     * @param columnIndex Index of column to activate.
+     */
+    public void setActiveColumn(int columnIndex) {
+        if (mActivatedColumn != columnIndex) {
+            mActivatedColumn = columnIndex;
+            for (int i = 0; i < mColumnViews.size(); i++) {
+                updateColumnAlpha(i, true);
+            }
+        }
+    }
+
+    /**
+     * Get current activated column index.
+     * @return Current activated column index.
+     */
+    public int getActiveColumn() {
+        return mActivatedColumn;
+    }
+
+    /**
+     * Enable or disable toggle on click when Picker has focus.
+     * @param toggleExpandOnClick True to enable toggle on click when Picker has focus, false
+     * otherwise.
+     */
+    public void setToggleExpandOnClick(boolean toggleExpandOnClick) {
+        mToggleExpandOnClick = toggleExpandOnClick;
+    }
+
+    /**
+     * Returns true if toggle on click is enabled when Picker has focus, false otherwise.
+     * @return True if toggle on click is enabled when Picker has focus, false otherwise.
+     */
+    public boolean isToggleExpandOnClick() {
+        return mToggleExpandOnClick;
+    }
+
+    @Override
+    public boolean performClick() {
+        if (isFocused() && isToggleExpandOnClick()) {
+            setExpanded(!isExpanded());
+            super.performClick();
+            return true;
+        }
+        return super.performClick();
+    }
+
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerColumn.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerColumn.java
new file mode 100644
index 0000000..c4c0c57
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerColumn.java
@@ -0,0 +1,192 @@
+/*
+ * 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.picker;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Picker column class used by {@link Picker}, defines a contiguous value ranges and associated
+ * labels.  A PickerColumn has a minValue and maxValue to choose between.  The Picker column has
+ * a current value.
+ * The labels can be dynamically generated from value by {@link #setValueLabelFormat(String)} or
+ * a list of static labels set by {@link #setValueStaticLabels(String[])}.
+ */
+public class PickerColumn implements Parcelable {
+
+    private int mCurrentValue;
+    private int mMinValue;
+    private int mMaxValue;
+    private String[] mStaticLabels;
+    private String mValueFormat;
+
+    public PickerColumn() {
+    }
+
+    public PickerColumn(Parcel source) {
+        mValueFormat = source.readString();
+        int count = source.readInt();
+        if (count > 0) {
+            mStaticLabels = new String[count];
+            source.readStringArray(mStaticLabels);
+        }
+        mCurrentValue = source.readInt();
+        mMinValue = source.readInt();
+        mMaxValue = source.readInt();
+    }
+
+    /**
+     * Set string format to display label for value, e.g. "%02d".  The string format is only
+     * used when {@link #setValueStaticLabels(String[])} is not called.
+     * @param valueFormat String format to display label for value.
+     */
+    public void setValueLabelFormat(String valueFormat) {
+        mValueFormat = valueFormat;
+    }
+
+    /**
+     * Return string format to display label for value, e.g. "%02d".
+     * @return String format to display label for value.
+     */
+    public String getValueLabelFormat() {
+        return mValueFormat;
+    }
+
+    /**
+     * Set static labels for each value, minValue maps to labels[0], maxValue maps to
+     * labels[labels.length - 1].
+     * @param labels Static labels for each value between minValue and maxValue.
+     */
+    public void setValueStaticLabels(String[] labels) {
+        mStaticLabels = labels;
+    }
+
+    /**
+     * Get a label for value.  The label can be static ({@link #setValueStaticLabels(String[])} or
+     * dynamically generated (@link {@link #setValueLabelFormat(String)}.
+     * @param value Value between minValue and maxValue.
+     * @return Label for the value.
+     */
+    public String getValueLabelAt(int value) {
+        if (mStaticLabels == null) {
+            return String.format(mValueFormat, value);
+        }
+        return mStaticLabels[value];
+    }
+
+    /**
+     * Returns current value of the Column.
+     * @return Current value of the Column.
+     */
+    public int getCurrentValue() {
+        return mCurrentValue;
+    }
+
+    /**
+     * Sets current value of the Column.
+     * @return True if current value has changed.
+     */
+    public boolean setCurrentValue(int value) {
+        if (mCurrentValue != value) {
+            mCurrentValue = value;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Get total items count between minValue(inclusive) and maxValue (inclusive).
+     * @return Total items count between minValue(inclusive) and maxValue (inclusive).
+     */
+    public int getItemsCount() {
+        return mMaxValue - mMinValue + 1;
+    }
+
+    /**
+     * Returns minimal value (inclusive) of the Column.
+     * @return Minimal value (inclusive) of the Column.
+     */
+    public int getMinValue() {
+        return mMinValue;
+    }
+
+    /**
+     * Returns maximum value (inclusive) of the Column.
+     * @return Maximum value (inclusive) of the Column.
+     */
+    public int getMaxValue() {
+        return mMaxValue;
+    }
+
+    /**
+     * Sets minimal value (inclusive) of the Column.
+     * @param minValue New minimal value to set.
+     * @return True if minimal value changes.
+     */
+    public boolean setMinValue(int minValue) {
+        if (minValue != mMinValue) {
+            mMinValue = minValue;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Sets maximum value (inclusive) of the Column.
+     * @param maxValue New maximum value to set.
+     * @return True if maximum value changes.
+     */
+    public boolean setMaxValue(int maxValue) {
+        if (maxValue != mMaxValue) {
+            mMaxValue = maxValue;
+            return true;
+        }
+        return false;
+    }
+
+    public static Parcelable.Creator<PickerColumn>
+            CREATOR = new Parcelable.Creator<PickerColumn>() {
+
+                @Override
+                public PickerColumn createFromParcel(Parcel source) {
+                    return new PickerColumn(source);
+                }
+
+                @Override
+                public PickerColumn[] newArray(int size) {
+                    return new PickerColumn[size];
+                }
+            };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mValueFormat);
+        if (mStaticLabels != null) {
+            dest.writeInt(mStaticLabels.length);
+            dest.writeStringArray(mStaticLabels);
+        } else {
+            dest.writeInt(0);
+        }
+        dest.writeInt(mCurrentValue);
+        dest.writeInt(mMinValue);
+        dest.writeInt(mMaxValue);
+    }
+
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerConstant.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerConstant.java
new file mode 100644
index 0000000..cfb704f
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerConstant.java
@@ -0,0 +1,68 @@
+/*
+ * 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.picker;
+
+import android.content.res.Resources;
+import android.support.v17.leanback.R;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+import java.util.Locale;
+
+/**
+ * Date/Time Picker related constants
+ */
+class PickerConstant {
+
+    public final String[] months;
+    public final String[] days;
+    public final String[] hours12;
+    public final String[] hours24;
+    public final String[] minutes;
+    public final String[] ampm;
+    public final String dateSeparator;
+    public final String timeSeparator;
+    public final Locale locale;
+
+    public PickerConstant(Locale locale, Resources resources) {
+        this.locale = locale;
+        DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
+        months = symbols.getShortMonths();
+        Calendar calendar = Calendar.getInstance(locale);
+        days = createStringIntArrays(calendar.getMinimum(Calendar.DAY_OF_MONTH),
+                calendar.getMaximum(Calendar.DAY_OF_MONTH), "%02d");
+        hours12 = createStringIntArrays(1, 12, "%02d");
+        hours24 = createStringIntArrays(0, 23, "%02d");
+        minutes = createStringIntArrays(0, 59, "%02d");
+        ampm = symbols.getAmPmStrings();
+        dateSeparator = resources.getString(R.string.lb_date_separator);
+        timeSeparator = resources.getString(R.string.lb_time_separator);
+    }
+
+
+    public static String[] createStringIntArrays(int firstNumber, int lastNumber, String format) {
+        String[] array = new String[lastNumber - firstNumber + 1];
+        for (int i = firstNumber; i <= lastNumber; i++) {
+            if (format != null) {
+                array[i - firstNumber] = String.format(format, i);
+            } else {
+                array[i - firstNumber] = String.valueOf(i);
+            }
+        }
+        return array;
+    }
+
+
+}
\ No newline at end of file
diff --git a/v17/preference-leanback/api/23.1.1.txt b/v17/preference-leanback/api/23.1.1.txt
new file mode 100644
index 0000000..06316ab
--- /dev/null
+++ b/v17/preference-leanback/api/23.1.1.txt
@@ -0,0 +1,61 @@
+package android.support.v17.preference {
+
+  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
+    ctor public BaseLeanbackPreferenceFragment();
+  }
+
+  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
+    ctor public LeanbackListPreferenceDialogFragment();
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
+    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
+    method public android.view.ViewGroup getContainer();
+    method public android.widget.TextView getTitleView();
+    method public android.widget.Checkable getWidgetView();
+    method public void onClick(android.view.View);
+  }
+
+  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
+    ctor public LeanbackPreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    field public static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
+    ctor public LeanbackPreferenceFragment();
+  }
+
+  public abstract class LeanbackSettingsFragment extends android.app.Fragment {
+    ctor public LeanbackSettingsFragment();
+    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+    method public abstract void onPreferenceStartInitialScreen();
+    method public void startImmersiveFragment(android.app.Fragment);
+    method public void startPreferenceFragment(android.app.Fragment);
+  }
+
+}
+
diff --git a/v17/tests/res/layout/vertical_grid_ltr.xml b/v17/tests/res/layout/vertical_grid_ltr.xml
new file mode 100644
index 0000000..6a390a3
--- /dev/null
+++ b/v17/tests/res/layout/vertical_grid_ltr.xml
@@ -0,0 +1,33 @@
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:lb="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layoutDirection="ltr"
+    >
+  <Button android:id="@+id/button"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_alignParentStart="true"
+      android:text="button"
+      />
+  <android.support.v17.leanback.widget.VerticalGridViewEx
+      android:id="@+id/gridview"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:layout_toEndOf="@id/button"
+      android:clipToPadding="false"
+      android:focusable="true"
+      android:focusableInTouchMode="true"
+      android:background="#00ffff"
+      lb:horizontalMargin="12dip"
+      lb:verticalMargin="24dip"
+      lb:numberOfColumns="1"
+      lb:columnWidth="150dip"
+      lb:focusOutSideStart="false"
+      lb:focusOutSideEnd="true"
+      android:paddingBottom="12dip"
+      android:paddingLeft="12dip"
+      android:paddingRight="12dip"
+      android:paddingTop="12dip" />
+</RelativeLayout>
diff --git a/v17/tests/res/layout/vertical_grid_rtl.xml b/v17/tests/res/layout/vertical_grid_rtl.xml
new file mode 100644
index 0000000..87b2054
--- /dev/null
+++ b/v17/tests/res/layout/vertical_grid_rtl.xml
@@ -0,0 +1,33 @@
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:lb="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layoutDirection="rtl"
+    >
+  <Button android:id="@+id/button"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_alignParentStart="true"
+      android:text="button"
+      />
+  <android.support.v17.leanback.widget.VerticalGridViewEx
+      android:id="@+id/gridview"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:layout_toEndOf="@id/button"
+      android:clipToPadding="false"
+      android:focusable="true"
+      android:focusableInTouchMode="true"
+      android:background="#00ffff"
+      lb:horizontalMargin="12dip"
+      lb:verticalMargin="24dip"
+      lb:numberOfColumns="1"
+      lb:columnWidth="150dip"
+      lb:focusOutSideStart="false"
+      lb:focusOutSideEnd="true"
+      android:paddingBottom="12dip"
+      android:paddingLeft="12dip"
+      android:paddingRight="12dip"
+      android:paddingTop="12dip" />
+</RelativeLayout>
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java
index e9b1063..da56b71 100644
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java
+++ b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java
@@ -26,9 +26,9 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
-
+import android.support.v17.leanback.widget.ListRowPresenterSelectItemViewHolderTask;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
 import android.app.Instrumentation;
 import android.content.Intent;
 import android.os.Parcelable;
@@ -46,10 +46,38 @@
         ActivityInstrumentationTestCase2<BrowseFragmentTestActivity> {
 
     static final long TRANSITION_LENGTH = 1000;
+    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long TIMEOUT = 10000;
 
     Instrumentation mInstrumentation;
     BrowseFragmentTestActivity mActivity;
 
+    static class WaitLock {
+        final boolean[] finished = new boolean[1];
+        String message;
+        long timeout;
+        public WaitLock(long timeout, String message) {
+            this.message = message;
+            this.timeout = timeout;
+        }
+        public void waitForFinish() {
+            long totalSleep = 0;
+            try {
+            while (!finished[0]) {
+                if ((totalSleep += 100) >= timeout) {
+                    assertTrue(message, false);
+                }
+                Thread.sleep(100);
+            }
+            } catch (InterruptedException ex) {
+                assertTrue("Interrupted during wait", false);
+            }
+        }
+        public void signalFinish() {
+            finished[0] = true;
+        }
+    }
+
     public BrowseFragmentTest() {
         super(BrowseFragmentTestActivity.class);
     }
@@ -90,4 +118,34 @@
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
+    public void testSelectCardOnARow() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getBrowseTestFragment().setSelectedPosition(10, true,
+                        new ListRowPresenterSelectItemViewHolderTask(20) {
+                    @Override
+                    public void run(Presenter.ViewHolder holder) {
+                        super.run(holder);
+                        waitLock.signalFinish();
+                    }
+                });
+            }
+        });
+        waitLock.waitForFinish();
+
+        // wait for scrolling to the item.
+        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
+        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
+                .getBrowseTestFragment().getSelectedRowViewHolder();
+        assertEquals(20, row.getGridView().getSelectedPosition());
+    }
+
 }
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
index ee433bd..5f6316f 100644
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
+++ b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
@@ -55,4 +55,8 @@
         }
         ft.commit();
     }
+
+    public BrowseTestFragment getBrowseTestFragment() {
+        return (BrowseTestFragment) getFragmentManager().findFragmentById(R.id.main_frame);
+    }
 }
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
index 0c901be..b2ef3bb 100644
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
+++ b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
@@ -28,9 +28,9 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
-
+import android.support.v17.leanback.widget.ListRowPresenterSelectItemViewHolderTask;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
 import android.app.Instrumentation;
 import android.content.Intent;
 import android.os.Parcelable;
@@ -48,10 +48,38 @@
         ActivityInstrumentationTestCase2<BrowseSupportFragmentTestActivity> {
 
     static final long TRANSITION_LENGTH = 1000;
+    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long TIMEOUT = 10000;
 
     Instrumentation mInstrumentation;
     BrowseSupportFragmentTestActivity mActivity;
 
+    static class WaitLock {
+        final boolean[] finished = new boolean[1];
+        String message;
+        long timeout;
+        public WaitLock(long timeout, String message) {
+            this.message = message;
+            this.timeout = timeout;
+        }
+        public void waitForFinish() {
+            long totalSleep = 0;
+            try {
+            while (!finished[0]) {
+                if ((totalSleep += 100) >= timeout) {
+                    assertTrue(message, false);
+                }
+                Thread.sleep(100);
+            }
+            } catch (InterruptedException ex) {
+                assertTrue("Interrupted during wait", false);
+            }
+        }
+        public void signalFinish() {
+            finished[0] = true;
+        }
+    }
+
     public BrowseSupportFragmentTest() {
         super(BrowseSupportFragmentTestActivity.class);
     }
@@ -92,4 +120,34 @@
         sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
     }
 
+    public void testSelectCardOnARow() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getBrowseTestSupportFragment().setSelectedPosition(10, true,
+                        new ListRowPresenterSelectItemViewHolderTask(20) {
+                    @Override
+                    public void run(Presenter.ViewHolder holder) {
+                        super.run(holder);
+                        waitLock.signalFinish();
+                    }
+                });
+            }
+        });
+        waitLock.waitForFinish();
+
+        // wait for scrolling to the item.
+        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
+        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
+                .getBrowseTestSupportFragment().getSelectedRowViewHolder();
+        assertEquals(20, row.getGridView().getSelectedPosition());
+    }
+
 }
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
index 036d254..10c27d1 100644
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
+++ b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
@@ -57,4 +57,8 @@
         }
         ft.commit();
     }
+
+    public BrowseTestSupportFragment getBrowseTestSupportFragment() {
+        return (BrowseTestSupportFragment) getSupportFragmentManager().findFragmentById(R.id.main_frame);
+    }
 }
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java b/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
index 902a665..ff72249 100644
--- a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
+++ b/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
@@ -172,7 +172,7 @@
             mNumItems = mItemLengths.length;
         }
 
-        mGridView.setAdapter(new MyAdapter());
+        mGridView.setAdapter(adapter);
         setContentView(view);
     }
 
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 335f449..dba1754 100644
--- a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -1100,6 +1100,58 @@
 
     }
 
+    public void testLtrFocusOutStartDisabled() throws Throwable {
+        final int numItems = 200;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_ltr);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.requestFocus();
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.hasFocus());
+    }
+
+    public void testRtlFocusOutStartDisabled() throws Throwable {
+        final int numItems = 200;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_rtl);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.requestFocus();
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.hasFocus());
+    }
+
     public void testTransferFocusable() throws Throwable {
         final int numItems = 200;
         final int numColumns = 3;
diff --git a/v4/Android.mk b/v4/Android.mk
index 4336e40..446e2c0 100644
--- a/v4/Android.mk
+++ b/v4/Android.mk
@@ -223,7 +223,7 @@
 # A helper sub-library that makes direct use of V22 APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v4-api22
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := 22
 LOCAL_SRC_FILES := $(call all-java-files-under, api22)
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api21
 include $(BUILD_STATIC_JAVA_LIBRARY)
@@ -235,7 +235,7 @@
 # A helper sub-library that makes direct use of V23 APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v4-api23
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := 23
 LOCAL_SRC_FILES := $(call all-java-files-under, api23)
 LOCAL_JAVA_LIBRARIES := android-support-v4-api21-internal
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api22
@@ -245,6 +245,18 @@
 
 # -----------------------------------------------------------------------
 
+# A helper sub-library that makes direct use of V24 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-v4-api24
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, api24)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api23
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+support_module_src_files += $(LOCAL_SRC_FILES)
+
+# -----------------------------------------------------------------------
+
 # Here is the final static library that apps can link against.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v4
@@ -252,7 +264,7 @@
 LOCAL_AIDL_INCLUDES := frameworks/support/v4/java
 LOCAL_SRC_FILES := $(call all-java-files-under, java) \
     $(call all-Iaidl-files-under, java)
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4-api23
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4-api24
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 support_module_src_files += $(LOCAL_SRC_FILES)
diff --git a/v4/NOTICES.md b/v4/NOTICES.md
new file mode 100644
index 0000000..8665d5d
--- /dev/null
+++ b/v4/NOTICES.md
@@ -0,0 +1,12 @@
+# Change Log
+
+## [23.0.1](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/) (2015-09-24)
+
+**Breakage and deprecation notices:**
+
+- ExploreByTouchHelper
+  - Several public methods that are only meant to be called by app developers (and not internally by
+    the helper itself) became final. Any code that depends on overriding these methods should be
+    moved elsewhere.
+  - The concept of keyboard and accessibility focus have been clarified. As a result, the
+    getFocusedVirtualView() method has been deprecated and will be removed in a subsequent release.
diff --git a/v4/api/23.1.1.txt b/v4/api/23.1.1.txt
new file mode 100644
index 0000000..5b4c450
--- /dev/null
+++ b/v4/api/23.1.1.txt
@@ -0,0 +1,3487 @@
+package android.support.v4.accessibilityservice {
+
+  public class AccessibilityServiceInfoCompat {
+    method public static java.lang.String capabilityToString(int);
+    method public static java.lang.String feedbackTypeToString(int);
+    method public static java.lang.String flagToString(int);
+    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package android.support.v4.app {
+
+  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
+    method public boolean isDrawerIndicatorEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void syncState();
+  }
+
+  public static abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+  public class ActivityCompat extends android.support.v4.content.ContextCompat {
+    ctor public ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public android.net.Uri getReferrer(android.app.Activity);
+    method public static boolean invalidateOptionsMenu(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
+    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
+    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public android.os.Bundle toBundle();
+    method public void update(android.support.v4.app.ActivityOptionsCompat);
+  }
+
+  public class AppOpsManagerCompat {
+    ctor public AppOpsManagerCompat();
+    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
+    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
+    method public static java.lang.String permissionToOp(java.lang.String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+   abstract class BaseFragmentActivityDonut extends android.app.Activity {
+  }
+
+   abstract class BaseFragmentActivityHoneycomb extends android.support.v4.app.BaseFragmentActivityDonut {
+  }
+
+  public class BundleCompat {
+    ctor public BundleCompat();
+    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
+    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
+  }
+
+  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog getDialog();
+    method public boolean getShowsDialog();
+    method public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method public android.app.Dialog onCreateDialog(android.os.Bundle);
+    method public void onDismiss(android.content.DialogInterface);
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, int);
+    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
+    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
+    ctor public Fragment();
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean equals(java.lang.Object);
+    method public final android.support.v4.app.FragmentActivity getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle getArguments();
+    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context getContext();
+    method public java.lang.Object getEnterTransition();
+    method public java.lang.Object getExitTransition();
+    method public final android.support.v4.app.FragmentManager getFragmentManager();
+    method public final java.lang.Object getHost();
+    method public final int getId();
+    method public android.support.v4.app.LoaderManager getLoaderManager();
+    method public final android.support.v4.app.Fragment getParentFragment();
+    method public java.lang.Object getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method public final boolean getRetainInstance();
+    method public java.lang.Object getReturnTransition();
+    method public java.lang.Object getSharedElementEnterTransition();
+    method public java.lang.Object getSharedElementReturnTransition();
+    method public final java.lang.String getString(int);
+    method public final java.lang.String getString(int, java.lang.Object...);
+    method public final java.lang.String getTag();
+    method public final android.support.v4.app.Fragment getTargetFragment();
+    method public final int getTargetRequestCode();
+    method public final java.lang.CharSequence getText(int);
+    method public boolean getUserVisibleHint();
+    method public android.view.View getView();
+    method public final int hashCode();
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isVisible();
+    method public void onActivityCreated(android.os.Bundle);
+    method public void onActivityResult(int, int, android.content.Intent);
+    method public void onAttach(android.content.Context);
+    method public deprecated void onAttach(android.app.Activity);
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public boolean onContextItemSelected(android.view.MenuItem);
+    method public void onCreate(android.os.Bundle);
+    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
+    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
+    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDestroy();
+    method public void onDestroyOptionsMenu();
+    method public void onDestroyView();
+    method public void onDetach();
+    method public void onHiddenChanged(boolean);
+    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
+    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
+    method public void onLowMemory();
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void onOptionsMenuClosed(android.view.Menu);
+    method public void onPause();
+    method public void onPrepareOptionsMenu(android.view.Menu);
+    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
+    method public void onResume();
+    method public void onSaveInstanceState(android.os.Bundle);
+    method public void onStart();
+    method public void onStop();
+    method public void onViewCreated(android.view.View, android.os.Bundle);
+    method public void onViewStateRestored(android.os.Bundle);
+    method public void registerForContextMenu(android.view.View);
+    method public final void requestPermissions(java.lang.String[], int);
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle);
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setEnterTransition(java.lang.Object);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitTransition(java.lang.Object);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(java.lang.Object);
+    method public void setRetainInstance(boolean);
+    method public void setReturnTransition(java.lang.Object);
+    method public void setSharedElementEnterTransition(java.lang.Object);
+    method public void setSharedElementReturnTransition(java.lang.Object);
+    method public void setTargetFragment(android.support.v4.app.Fragment, int);
+    method public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
+    method public void startActivity(android.content.Intent);
+    method public void startActivityForResult(android.content.Intent, int);
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
+  }
+
+  public class FragmentActivity extends android.support.v4.app.BaseFragmentActivityHoneycomb implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
+    ctor public FragmentActivity();
+    method public java.lang.Object getLastCustomNonConfigurationInstance();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public final android.support.v4.media.session.MediaControllerCompat getSupportMediaController();
+    method public void onAttachFragment(android.support.v4.app.Fragment);
+    method protected void onResumeFragments();
+    method public java.lang.Object onRetainCustomNonConfigurationInstance();
+    method public final java.lang.Object onRetainNonConfigurationInstance();
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public final void setSupportMediaController(android.support.v4.media.session.MediaControllerCompat);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void supportFinishAfterTransition();
+    method public void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method public abstract android.view.View onFindViewById(int);
+    method public abstract boolean onHasView();
+  }
+
+  public class FragmentController {
+    method public void attachHost(android.support.v4.app.Fragment);
+    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method public void doLoaderDestroy();
+    method public void doLoaderRetain();
+    method public void doLoaderStart();
+    method public void doLoaderStop(boolean);
+    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public boolean execPendingActions();
+    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
+    method public int getActiveFragmentsCount();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public void reportLoaderStart();
+    method public void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
+    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
+    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
+    method public java.util.List<android.support.v4.app.Fragment> retainNonConfig();
+    method public android.os.Parcelable saveAllState();
+  }
+
+  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public android.view.View onFindViewById(int);
+    method public abstract E onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
+    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
+    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager {
+    ctor public FragmentManager();
+    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract boolean executePendingTransactions();
+    method public abstract android.support.v4.app.Fragment findFragmentById(int);
+    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
+    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public abstract int getBackStackEntryCount();
+    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
+    method public abstract boolean isDestroyed();
+    method public abstract void popBackStack();
+    method public abstract void popBackStack(java.lang.String, int);
+    method public abstract void popBackStack(int, int);
+    method public abstract boolean popBackStackImmediate();
+    method public abstract boolean popBackStackImmediate(java.lang.String, int);
+    method public abstract boolean popBackStackImmediate(int, int);
+    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
+    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static abstract interface FragmentManager.BackStackEntry {
+    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
+    method public abstract int getBreadCrumbShortTitleRes();
+    method public abstract java.lang.CharSequence getBreadCrumbTitle();
+    method public abstract int getBreadCrumbTitleRes();
+    method public abstract int getId();
+    method public abstract java.lang.String getName();
+  }
+
+  public static abstract interface FragmentManager.OnBackStackChangedListener {
+    method public abstract void onBackStackChanged();
+  }
+
+  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public long getItemId(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public FragmentTabHost(android.content.Context);
+    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method public void onTabChanged(java.lang.String);
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor public FragmentTransaction();
+    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
+    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
+    method public abstract boolean isAddToBackStackAllowed();
+    method public abstract boolean isEmpty();
+    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
+    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
+    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  public class ListFragment extends android.support.v4.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public void setEmptyText(java.lang.CharSequence);
+    method public void setListAdapter(android.widget.ListAdapter);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+  public abstract class LoaderManager {
+    ctor public LoaderManager();
+    method public abstract void destroyLoader(int);
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract android.support.v4.content.Loader<D> getLoader(int);
+    method public boolean hasRunningLoaders();
+    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+  }
+
+  public static abstract interface LoaderManager.LoaderCallbacks {
+    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
+    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
+    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
+  }
+
+  public class NavUtils {
+    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static java.lang.String getParentActivityName(android.app.Activity);
+    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationCompat {
+    ctor public NotificationCompat();
+    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static java.lang.String getCategory(android.app.Notification);
+    method public static android.os.Bundle getExtras(android.app.Notification);
+    method public static java.lang.String getGroup(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static java.lang.String getSortKey(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final java.lang.String CATEGORY_ALARM = "alarm";
+    field public static final java.lang.String CATEGORY_CALL = "call";
+    field public static final java.lang.String CATEGORY_EMAIL = "email";
+    field public static final java.lang.String CATEGORY_ERROR = "err";
+    field public static final java.lang.String CATEGORY_EVENT = "event";
+    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
+    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
+    field public static final java.lang.String CATEGORY_PROMO = "promo";
+    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final java.lang.String CATEGORY_SERVICE = "service";
+    field public static final java.lang.String CATEGORY_SOCIAL = "social";
+    field public static final java.lang.String CATEGORY_STATUS = "status";
+    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
+    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
+    field public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
+    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
+    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
+    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
+    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
+    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
+    field public static final java.lang.String EXTRA_TEXT = "android.text";
+    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final java.lang.String EXTRA_TITLE = "android.title";
+    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.app.PendingIntent getActionIntent();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
+    method public java.lang.CharSequence getTitle();
+    field public android.app.PendingIntent actionIntent;
+    field public int icon;
+    field public java.lang.CharSequence title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
+    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
+    method public android.support.v4.app.NotificationCompat.Action build();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+  }
+
+  public static abstract interface NotificationCompat.Action.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+    method public java.lang.CharSequence getCancelLabel();
+    method public java.lang.CharSequence getConfirmLabel();
+    method public java.lang.CharSequence getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
+    method public android.app.Notification build();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method public deprecated android.app.Notification getNotification();
+    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
+    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
+    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
+    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
+    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
+    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
+    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
+    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
+    field public java.util.ArrayList<java.lang.String> mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public int getColor();
+    method public android.graphics.Bitmap getLargeIcon();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
+    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
+    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation {
+    method public long getLatestTimestamp();
+    method public java.lang.String[] getMessages();
+    method public java.lang.String getParticipant();
+    method public java.lang.String[] getParticipants();
+    method public android.app.PendingIntent getReadPendingIntent();
+    method public android.support.v4.app.RemoteInput getRemoteInput();
+    method public android.app.PendingIntent getReplyPendingIntent();
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
+  }
+
+  public static abstract interface NotificationCompat.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static abstract class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification build();
+    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
+    method public android.graphics.Bitmap getBackground();
+    method public int getContentAction();
+    method public int getContentIcon();
+    method public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method public int getCustomContentHeight();
+    method public int getCustomSizePreset();
+    method public android.app.PendingIntent getDisplayIntent();
+    method public int getGravity();
+    method public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintHideIcon();
+    method public int getHintScreenTimeout();
+    method public boolean getHintShowBackgroundOnly();
+    method public java.util.List<android.app.Notification> getPages();
+    method public boolean getStartScrollBottom();
+    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field public static final int SIZE_DEFAULT = 0; // 0x0
+    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field public static final int SIZE_LARGE = 4; // 0x4
+    field public static final int SIZE_MEDIUM = 3; // 0x3
+    field public static final int SIZE_SMALL = 2; // 0x2
+    field public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(java.lang.String, int, java.lang.String);
+    method public abstract void cancelAll(java.lang.String);
+    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public class NotificationManagerCompat {
+    method public void cancel(int);
+    method public void cancel(java.lang.String, int);
+    method public void cancelAll();
+    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
+    method public void notify(int, android.app.Notification);
+    method public void notify(java.lang.String, int, android.app.Notification);
+    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+  }
+
+  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
+    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.lang.CharSequence[] getChoices();
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getLabel();
+    method public java.lang.String getResultKey();
+    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
+    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(java.lang.String);
+    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
+    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
+  }
+
+   class RemoteInputCompatBase {
+  }
+
+  public static abstract class RemoteInputCompatBase.RemoteInput {
+    ctor public RemoteInputCompatBase.RemoteInput();
+    method protected abstract boolean getAllowFreeFormInput();
+    method protected abstract java.lang.CharSequence[] getChoices();
+    method protected abstract android.os.Bundle getExtras();
+    method protected abstract java.lang.CharSequence getLabel();
+    method protected abstract java.lang.String getResultKey();
+  }
+
+  public class ServiceCompat {
+    field public static final int START_STICKY = 1; // 0x1
+  }
+
+  public class ShareCompat {
+    ctor public ShareCompat();
+    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
+    method public static java.lang.String getCallingPackage(android.app.Activity);
+    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName getCallingActivity();
+    method public android.graphics.drawable.Drawable getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
+    method public java.lang.CharSequence getCallingApplicationLabel();
+    method public java.lang.String getCallingPackage();
+    method public java.lang.String[] getEmailBcc();
+    method public java.lang.String[] getEmailCc();
+    method public java.lang.String[] getEmailTo();
+    method public java.lang.String getHtmlText();
+    method public android.net.Uri getStream();
+    method public android.net.Uri getStream(int);
+    method public int getStreamCount();
+    method public java.lang.String getSubject();
+    method public java.lang.CharSequence getText();
+    method public java.lang.String getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
+    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
+    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
+    method public void onRejectSharedElements(java.util.List<android.view.View>);
+    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+  }
+
+  public class TaskStackBuilder implements java.lang.Iterable {
+    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent editIntentAt(int);
+    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
+    method public deprecated android.content.Intent getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent[] getIntents();
+    method public android.app.PendingIntent getPendingIntent(int, int);
+    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
+    method public deprecated java.util.Iterator<android.content.Intent> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle);
+  }
+
+  public static abstract interface TaskStackBuilder.SupportParentable {
+    method public abstract android.content.Intent getSupportParentActivityIntent();
+  }
+
+}
+
+package android.support.v4.content {
+
+  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
+    ctor public AsyncTaskLoader(android.content.Context);
+    method public void cancelLoadInBackground();
+    method public boolean isLoadInBackgroundCanceled();
+    method public abstract D loadInBackground();
+    method public void onCanceled(D);
+    method protected D onLoadInBackground();
+    method public void setUpdateThrottle(long);
+  }
+
+  public class ContentResolverCompat {
+    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
+  }
+
+  public class ContextCompat {
+    ctor public ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public final java.io.File getCodeCacheDir(android.content.Context);
+    method public static final int getColor(android.content.Context, int);
+    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
+    method public final java.io.File getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
+  }
+
+  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
+    ctor public CursorLoader(android.content.Context);
+    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public void deliverResult(android.database.Cursor);
+    method public java.lang.String[] getProjection();
+    method public java.lang.String getSelection();
+    method public java.lang.String[] getSelectionArgs();
+    method public java.lang.String getSortOrder();
+    method public android.net.Uri getUri();
+    method public android.database.Cursor loadInBackground();
+    method public void onCanceled(android.database.Cursor);
+    method public void setProjection(java.lang.String[]);
+    method public void setSelection(java.lang.String);
+    method public void setSelectionArgs(java.lang.String[]);
+    method public void setSortOrder(java.lang.String);
+    method public void setUri(android.net.Uri);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public java.lang.String getType(android.net.Uri);
+    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
+    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+  }
+
+  public class IntentCompat {
+    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
+    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
+    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
+    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
+    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
+    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
+    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
+    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
+  }
+
+  public class Loader {
+    ctor public Loader(android.content.Context);
+    method public void abandon();
+    method public boolean cancelLoad();
+    method public void commitContentChanged();
+    method public java.lang.String dataToString(D);
+    method public void deliverCancellation();
+    method public void deliverResult(D);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public void forceLoad();
+    method public android.content.Context getContext();
+    method public int getId();
+    method public boolean isAbandoned();
+    method public boolean isReset();
+    method public boolean isStarted();
+    method protected void onAbandon();
+    method protected boolean onCancelLoad();
+    method public void onContentChanged();
+    method protected void onForceLoad();
+    method protected void onReset();
+    method protected void onStartLoading();
+    method protected void onStopLoading();
+    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+    method public void reset();
+    method public void rollbackContentChanged();
+    method public final void startLoading();
+    method public void stopLoading();
+    method public boolean takeContentChanged();
+    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+  }
+
+  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
+    ctor public Loader.ForceLoadContentObserver();
+  }
+
+  public static abstract interface Loader.OnLoadCanceledListener {
+    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
+  }
+
+  public static abstract interface Loader.OnLoadCompleteListener {
+    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
+  }
+
+  public class LocalBroadcastManager {
+    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
+    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+    method public boolean sendBroadcast(android.content.Intent);
+    method public void sendBroadcastSync(android.content.Intent);
+    method public void unregisterReceiver(android.content.BroadcastReceiver);
+  }
+
+  public class ParallelExecutorCompat {
+    ctor public ParallelExecutorCompat();
+    method public static java.util.concurrent.Executor getParallelExecutor();
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
+    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
+    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
+  }
+
+  public class SharedPreferencesCompat {
+    ctor public SharedPreferencesCompat();
+  }
+
+  public static class SharedPreferencesCompat.EditorCompat {
+    method public void apply(android.content.SharedPreferences.Editor);
+    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  }
+
+  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
+    ctor public WakefulBroadcastReceiver();
+    method public static boolean completeWakefulIntent(android.content.Intent);
+    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
+  }
+
+}
+
+package android.support.v4.content.pm {
+
+  public class ActivityInfoCompat {
+    field public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+}
+
+package android.support.v4.content.res {
+
+  public class ResourcesCompat {
+    ctor public ResourcesCompat();
+    method public int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+  }
+
+}
+
+package android.support.v4.database {
+
+  public class DatabaseUtilsCompat {
+    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
+    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  public class BitmapCompat {
+    ctor public BitmapCompat();
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class ColorUtils {
+    method public static int HSLToColor(float[]);
+    method public static void RGBToHSL(int, int, int, float[]);
+    method public static double calculateContrast(int, int);
+    method public static double calculateLuminance(int);
+    method public static int calculateMinimumAlpha(int, int, float);
+    method public static void colorToHSL(int, float[]);
+    method public static int compositeColors(int, int);
+    method public static int setAlphaComponent(int, int);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  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);
+    method public static T unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setCornerRadius(float);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public class RoundedBitmapDrawableFactory {
+    ctor public RoundedBitmapDrawableFactory();
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package android.support.v4.hardware.display {
+
+  public abstract class DisplayManagerCompat {
+    method public abstract android.view.Display getDisplay(int);
+    method public abstract android.view.Display[] getDisplays();
+    method public abstract android.view.Display[] getDisplays(java.lang.String);
+    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package android.support.v4.hardware.fingerprint {
+
+  public class FingerprintManagerCompat {
+    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
+    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method public boolean hasEnrolledFingerprints();
+    method public boolean isHardwareDetected();
+  }
+
+  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
+    ctor public FingerprintManagerCompat.AuthenticationCallback();
+    method public void onAuthenticationError(int, java.lang.CharSequence);
+    method public void onAuthenticationFailed();
+    method public void onAuthenticationHelp(int, java.lang.CharSequence);
+    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
+  }
+
+  public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
+    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
+  }
+
+  public static class FingerprintManagerCompat.CryptoObject {
+    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method public javax.crypto.Cipher getCipher();
+    method public javax.crypto.Mac getMac();
+    method public java.security.Signature getSignature();
+  }
+
+}
+
+package android.support.v4.media {
+
+  public final class MediaDescriptionCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
+    method public java.lang.CharSequence getDescription();
+    method public android.os.Bundle getExtras();
+    method public android.graphics.Bitmap getIconBitmap();
+    method public android.net.Uri getIconUri();
+    method public java.lang.Object getMediaDescription();
+    method public java.lang.String getMediaId();
+    method public android.net.Uri getMediaUri();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
+  }
+
+  public static final class MediaDescriptionCompat.Builder {
+    ctor public MediaDescriptionCompat.Builder();
+    method public android.support.v4.media.MediaDescriptionCompat build();
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
+  }
+
+  public final class MediaMetadataCompat implements android.os.Parcelable {
+    method public boolean containsKey(java.lang.String);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
+    method public android.graphics.Bitmap getBitmap(java.lang.String);
+    method public android.os.Bundle getBundle();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getLong(java.lang.String);
+    method public java.lang.Object getMediaMetadata();
+    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
+    method public java.lang.String getString(java.lang.String);
+    method public java.lang.CharSequence getText(java.lang.String);
+    method public java.util.Set<java.lang.String> keySet();
+    method public int size();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
+    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
+    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
+    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
+    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public static final class MediaMetadataCompat.Builder {
+    ctor public MediaMetadataCompat.Builder();
+    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
+    method public android.support.v4.media.MediaMetadataCompat build();
+    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
+  }
+
+  public final class RatingCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
+    method public float getPercentRating();
+    method public java.lang.Object getRating();
+    method public int getRatingStyle();
+    method public float getStarRating();
+    method public boolean hasHeart();
+    method public boolean isRated();
+    method public boolean isThumbUp();
+    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
+    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
+    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
+    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
+    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
+    field public static final int RATING_3_STARS = 3; // 0x3
+    field public static final int RATING_4_STARS = 4; // 0x4
+    field public static final int RATING_5_STARS = 5; // 0x5
+    field public static final int RATING_HEART = 1; // 0x1
+    field public static final int RATING_NONE = 0; // 0x0
+    field public static final int RATING_PERCENTAGE = 6; // 0x6
+    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
+  }
+
+  public abstract class TransportController {
+    ctor public TransportController();
+    method public abstract int getBufferPercentage();
+    method public abstract long getCurrentPosition();
+    method public abstract long getDuration();
+    method public abstract int getTransportControlFlags();
+    method public abstract boolean isPlaying();
+    method public abstract void pausePlaying();
+    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public abstract void seekTo(long);
+    method public abstract void startPlaying();
+    method public abstract void stopPlaying();
+    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
+  }
+
+  public class TransportMediator extends android.support.v4.media.TransportController {
+    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
+    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
+    method public void destroy();
+    method public boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public int getBufferPercentage();
+    method public long getCurrentPosition();
+    method public long getDuration();
+    method public java.lang.Object getRemoteControlClient();
+    method public int getTransportControlFlags();
+    method public boolean isPlaying();
+    method public void pausePlaying();
+    method public void refreshState();
+    method public void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public void seekTo(long);
+    method public void startPlaying();
+    method public void stopPlaying();
+    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
+    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
+    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
+    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
+    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
+    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
+    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
+    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
+    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
+    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
+    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
+  }
+
+  public abstract class TransportPerformer {
+    ctor public TransportPerformer();
+    method public void onAudioFocusChange(int);
+    method public int onGetBufferPercentage();
+    method public abstract long onGetCurrentPosition();
+    method public abstract long onGetDuration();
+    method public int onGetTransportControlFlags();
+    method public abstract boolean onIsPlaying();
+    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
+    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
+    method public abstract void onPause();
+    method public abstract void onSeekTo(long);
+    method public abstract void onStart();
+    method public abstract void onStop();
+  }
+
+  public class TransportStateListener {
+    ctor public TransportStateListener();
+    method public void onPlayingChanged(android.support.v4.media.TransportController);
+    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
+  }
+
+  public abstract class VolumeProviderCompat {
+    ctor public VolumeProviderCompat(int, int, int);
+    method public final int getCurrentVolume();
+    method public final int getMaxVolume();
+    method public final int getVolumeControl();
+    method public java.lang.Object getVolumeProvider();
+    method public void onAdjustVolume(int);
+    method public void onSetVolumeTo(int);
+    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
+    method public final void setCurrentVolume(int);
+    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
+    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
+    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
+  }
+
+  public static abstract class VolumeProviderCompat.Callback {
+    ctor public VolumeProviderCompat.Callback();
+    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
+  }
+
+}
+
+package android.support.v4.media.session {
+
+  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+    ctor public MediaButtonReceiver();
+    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
+    method public void onReceive(android.content.Context, android.content.Intent);
+  }
+
+  public final class MediaControllerCompat {
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
+    method public void adjustVolume(int, int);
+    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
+    method public android.os.Bundle getExtras();
+    method public long getFlags();
+    method public java.lang.Object getMediaController();
+    method public android.support.v4.media.MediaMetadataCompat getMetadata();
+    method public java.lang.String getPackageName();
+    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
+    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
+    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
+    method public java.lang.CharSequence getQueueTitle();
+    method public int getRatingType();
+    method public android.app.PendingIntent getSessionActivity();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
+    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public void setVolumeTo(int, int);
+    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+  }
+
+  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
+    ctor public MediaControllerCompat.Callback();
+    method public void binderDied();
+    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
+    method public void onExtrasChanged(android.os.Bundle);
+    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
+    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
+    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void onQueueTitleChanged(java.lang.CharSequence);
+    method public void onSessionDestroyed();
+    method public void onSessionEvent(java.lang.String, android.os.Bundle);
+  }
+
+  public static final class MediaControllerCompat.PlaybackInfo {
+    method public int getAudioStream();
+    method public int getCurrentVolume();
+    method public int getMaxVolume();
+    method public int getPlaybackType();
+    method public int getVolumeControl();
+    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
+  }
+
+  public static abstract class MediaControllerCompat.TransportControls {
+    method public abstract void fastForward();
+    method public abstract void pause();
+    method public abstract void play();
+    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
+    method public abstract void rewind();
+    method public abstract void seekTo(long);
+    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
+    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
+    method public abstract void setRating(android.support.v4.media.RatingCompat);
+    method public abstract void skipToNext();
+    method public abstract void skipToPrevious();
+    method public abstract void skipToQueueItem(long);
+    method public abstract void stop();
+  }
+
+  public class MediaSessionCompat {
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
+    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public android.support.v4.media.session.MediaControllerCompat getController();
+    method public java.lang.Object getMediaSession();
+    method public java.lang.Object getRemoteControlClient();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isActive();
+    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
+    method public void release();
+    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
+    method public void setActive(boolean);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
+    method public void setExtras(android.os.Bundle);
+    method public void setFlags(int);
+    method public void setMediaButtonReceiver(android.app.PendingIntent);
+    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
+    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
+    method public void setPlaybackToLocal(int);
+    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
+    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void setQueueTitle(java.lang.CharSequence);
+    method public void setRatingType(int);
+    method public void setSessionActivity(android.app.PendingIntent);
+    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+  }
+
+  public static abstract class MediaSessionCompat.Callback {
+    ctor public MediaSessionCompat.Callback();
+    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public void onCustomAction(java.lang.String, android.os.Bundle);
+    method public void onFastForward();
+    method public boolean onMediaButtonEvent(android.content.Intent);
+    method public void onPause();
+    method public void onPlay();
+    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRewind();
+    method public void onSeekTo(long);
+    method public void onSetRating(android.support.v4.media.RatingCompat);
+    method public void onSkipToNext();
+    method public void onSkipToPrevious();
+    method public void onSkipToQueueItem(long);
+    method public void onStop();
+  }
+
+  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
+    method public abstract void onActiveChanged();
+  }
+
+  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
+    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
+    method public int describeContents();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getQueueId();
+    method public java.lang.Object getQueueItem();
+    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
+    field public static final int UNKNOWN_ID = -1; // 0xffffffff
+  }
+
+  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
+    method public java.lang.Object getToken();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
+  }
+
+  public class ParcelableVolumeInfo implements android.os.Parcelable {
+    ctor public ParcelableVolumeInfo(int, int, int, int, int);
+    ctor public ParcelableVolumeInfo(android.os.Parcel);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
+    field public int audioStream;
+    field public int controlType;
+    field public int currentVolume;
+    field public int maxVolume;
+    field public int volumeType;
+  }
+
+  public final class PlaybackStateCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
+    method public long getActions();
+    method public long getActiveQueueItemId();
+    method public long getBufferedPosition();
+    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
+    method public java.lang.CharSequence getErrorMessage();
+    method public android.os.Bundle getExtras();
+    method public long getLastPositionUpdateTime();
+    method public float getPlaybackSpeed();
+    method public java.lang.Object getPlaybackState();
+    method public long getPosition();
+    method public int getState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
+    field public static final long ACTION_PAUSE = 2L; // 0x2L
+    field public static final long ACTION_PLAY = 4L; // 0x4L
+    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
+    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
+    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
+    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
+    field public static final long ACTION_REWIND = 8L; // 0x8L
+    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
+    field public static final long ACTION_SET_RATING = 128L; // 0x80L
+    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
+    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
+    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
+    field public static final long ACTION_STOP = 1L; // 0x1L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
+    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+    field public static final int STATE_BUFFERING = 6; // 0x6
+    field public static final int STATE_CONNECTING = 8; // 0x8
+    field public static final int STATE_ERROR = 7; // 0x7
+    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
+    field public static final int STATE_NONE = 0; // 0x0
+    field public static final int STATE_PAUSED = 2; // 0x2
+    field public static final int STATE_PLAYING = 3; // 0x3
+    field public static final int STATE_REWINDING = 5; // 0x5
+    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
+    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
+    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
+    field public static final int STATE_STOPPED = 1; // 0x1
+  }
+
+  public static final class PlaybackStateCompat.Builder {
+    ctor public PlaybackStateCompat.Builder();
+    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
+    method public android.support.v4.media.session.PlaybackStateCompat build();
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
+  }
+
+  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
+    method public java.lang.String getAction();
+    method public java.lang.Object getCustomAction();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public java.lang.CharSequence getName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
+  }
+
+  public static final class PlaybackStateCompat.CustomAction.Builder {
+    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
+  }
+
+}
+
+package android.support.v4.net {
+
+  public class ConnectivityManagerCompat {
+    ctor public ConnectivityManagerCompat();
+    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+  }
+
+  public class TrafficStatsCompat {
+    ctor public TrafficStatsCompat();
+    method public static void clearThreadStatsTag();
+    method public static int getThreadStatsTag();
+    method public static void incrementOperationCount(int);
+    method public static void incrementOperationCount(int, int);
+    method public static void setThreadStatsTag(int);
+    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
+  }
+
+}
+
+package android.support.v4.os {
+
+  public class AsyncTaskCompat {
+    ctor public AsyncTaskCompat();
+    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public java.lang.Object getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
+    method public void throwIfCanceled();
+  }
+
+  public static abstract interface CancellationSignal.OnCancelListener {
+    method public abstract void onCancel();
+  }
+
+  public class EnvironmentCompat {
+    ctor public EnvironmentCompat();
+    method public static java.lang.String getStorageState(java.io.File);
+    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(java.lang.String);
+  }
+
+  public class ParcelableCompat {
+    ctor public ParcelableCompat();
+    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
+  }
+
+  public abstract interface ParcelableCompatCreatorCallbacks {
+    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+    method public abstract T[] newArray(int);
+  }
+
+  public class TraceCompat {
+    ctor public TraceCompat();
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
+}
+
+package android.support.v4.print {
+
+  public final class PrintHelper {
+    ctor public PrintHelper(android.content.Context);
+    method public int getColorMode();
+    method public int getOrientation();
+    method public int getScaleMode();
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
+    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
+    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
+    method public void setColorMode(int);
+    method public void setOrientation(int);
+    method public void setScaleMode(int);
+    method public static boolean systemSupportsPrint();
+    field public static final int COLOR_MODE_COLOR = 2; // 0x2
+    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
+    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
+    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
+    field public static final int SCALE_MODE_FILL = 2; // 0x2
+    field public static final int SCALE_MODE_FIT = 1; // 0x1
+  }
+
+  public static abstract interface PrintHelper.OnPrintFinishCallback {
+    method public abstract void onFinish();
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public abstract class DocumentFile {
+    method public abstract boolean canRead();
+    method public abstract boolean canWrite();
+    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
+    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
+    method public abstract boolean delete();
+    method public abstract boolean exists();
+    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
+    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
+    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
+    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
+    method public abstract java.lang.String getName();
+    method public android.support.v4.provider.DocumentFile getParentFile();
+    method public abstract java.lang.String getType();
+    method public abstract android.net.Uri getUri();
+    method public abstract boolean isDirectory();
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
+    method public abstract boolean isFile();
+    method public abstract long lastModified();
+    method public abstract long length();
+    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
+    method public abstract boolean renameTo(java.lang.String);
+  }
+
+}
+
+package android.support.v4.text {
+
+  public final class BidiFormatter {
+    method public static android.support.v4.text.BidiFormatter getInstance();
+    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
+    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
+    method public boolean getStereoReset();
+    method public boolean isRtl(java.lang.String);
+    method public boolean isRtlContext();
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.String unicodeWrap(java.lang.String, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale);
+    method public android.support.v4.text.BidiFormatter build();
+    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
+    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
+  }
+
+  public class ICUCompat {
+    ctor public ICUCompat();
+    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
+  }
+
+  public abstract interface TextDirectionHeuristicCompat {
+    method public abstract boolean isRtl(char[], int, int);
+    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
+  }
+
+  public class TextDirectionHeuristicsCompat {
+    ctor public TextDirectionHeuristicsCompat();
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
+  }
+
+  public class TextUtilsCompat {
+    ctor public TextUtilsCompat();
+    method public static int getLayoutDirectionFromLocale(java.util.Locale);
+    method public static java.lang.String htmlEncode(java.lang.String);
+    field public static final java.util.Locale ROOT;
+  }
+
+}
+
+package android.support.v4.util {
+
+  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
+    ctor public ArrayMap();
+    ctor public ArrayMap(int);
+    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+    method public java.util.Set<K> keySet();
+    method public void putAll(java.util.Map<? extends K, ? extends V>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public java.util.Collection<V> values();
+  }
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream);
+    method public void finishWrite(java.io.FileOutputStream);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public final class CircularArray {
+    ctor public CircularArray();
+    ctor public CircularArray(int);
+    method public void addFirst(E);
+    method public void addLast(E);
+    method public void clear();
+    method public E get(int);
+    method public E getFirst();
+    method public E getLast();
+    method public boolean isEmpty();
+    method public E popFirst();
+    method public E popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public final class CircularIntArray {
+    ctor public CircularIntArray();
+    ctor public CircularIntArray(int);
+    method public void addFirst(int);
+    method public void addLast(int);
+    method public void clear();
+    method public int get(int);
+    method public int getFirst();
+    method public int getLast();
+    method public boolean isEmpty();
+    method public int popFirst();
+    method public int popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public class LongSparseArray {
+    ctor public LongSparseArray();
+    ctor public LongSparseArray(int);
+    method public void append(long, E);
+    method public void clear();
+    method public android.support.v4.util.LongSparseArray<E> clone();
+    method public void delete(long);
+    method public E get(long);
+    method public E get(long, E);
+    method public int indexOfKey(long);
+    method public int indexOfValue(E);
+    method public long keyAt(int);
+    method public void put(long, E);
+    method public void remove(long);
+    method public void removeAt(int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+  public class LruCache {
+    ctor public LruCache(int);
+    method protected V create(K);
+    method public final synchronized int createCount();
+    method protected void entryRemoved(boolean, K, V, V);
+    method public final void evictAll();
+    method public final synchronized int evictionCount();
+    method public final V get(K);
+    method public final synchronized int hitCount();
+    method public final synchronized int maxSize();
+    method public final synchronized int missCount();
+    method public final V put(K, V);
+    method public final synchronized int putCount();
+    method public final V remove(K);
+    method public void resize(int);
+    method public final synchronized int size();
+    method protected int sizeOf(K, V);
+    method public final synchronized java.util.Map<K, V> snapshot();
+    method public final synchronized java.lang.String toString();
+    method public void trimToSize(int);
+  }
+
+  public class Pair {
+    ctor public Pair(F, S);
+    method public static android.support.v4.util.Pair<A, B> create(A, B);
+    field public final F first;
+    field public final S second;
+  }
+
+  public final class Pools {
+  }
+
+  public static abstract interface Pools.Pool {
+    method public abstract T acquire();
+    method public abstract boolean release(T);
+  }
+
+  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
+    ctor public Pools.SimplePool(int);
+    method public T acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public class SimpleArrayMap {
+    ctor public SimpleArrayMap();
+    ctor public SimpleArrayMap(int);
+    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
+    method public void clear();
+    method public boolean containsKey(java.lang.Object);
+    method public boolean containsValue(java.lang.Object);
+    method public void ensureCapacity(int);
+    method public V get(java.lang.Object);
+    method public int indexOfKey(java.lang.Object);
+    method public boolean isEmpty();
+    method public K keyAt(int);
+    method public V put(K, V);
+    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
+    method public V remove(java.lang.Object);
+    method public V removeAt(int);
+    method public V setValueAt(int, V);
+    method public int size();
+    method public V valueAt(int);
+  }
+
+  public class SparseArrayCompat {
+    ctor public SparseArrayCompat();
+    ctor public SparseArrayCompat(int);
+    method public void append(int, E);
+    method public void clear();
+    method public android.support.v4.util.SparseArrayCompat<E> clone();
+    method public void delete(int);
+    method public E get(int);
+    method public E get(int, E);
+    method public int indexOfKey(int);
+    method public int indexOfValue(E);
+    method public int keyAt(int);
+    method public void put(int, E);
+    method public void remove(int);
+    method public void removeAt(int);
+    method public void removeAtRange(int, int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+}
+
+package android.support.v4.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
+  }
+
+  public static abstract interface ActionProvider.VisibilityListener {
+    method public abstract void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+  }
+
+  public class GravityCompat {
+    ctor public GravityCompat();
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public class InputDeviceCompat {
+    ctor public InputDeviceCompat();
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public class KeyEventCompat {
+    ctor public KeyEventCompat();
+    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
+    method public static java.lang.Object getKeyDispatcherState(android.view.View);
+    method public static boolean hasModifiers(android.view.KeyEvent, int);
+    method public static boolean hasNoModifiers(android.view.KeyEvent);
+    method public static boolean isTracking(android.view.KeyEvent);
+    method public static boolean metaStateHasModifiers(int, int);
+    method public static boolean metaStateHasNoModifiers(int);
+    method public static int normalizeMetaState(int);
+    method public static void startTracking(android.view.KeyEvent);
+  }
+
+  public class LayoutInflaterCompat {
+    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
+  }
+
+  public abstract interface LayoutInflaterFactory {
+    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+  }
+
+  public class MarginLayoutParamsCompat {
+    ctor public MarginLayoutParamsCompat();
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public class MenuCompat {
+    ctor public MenuCompat();
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+  }
+
+  public class MenuItemCompat {
+    ctor public MenuItemCompat();
+    method public static boolean collapseActionView(android.view.MenuItem);
+    method public static boolean expandActionView(android.view.MenuItem);
+    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
+    method public static android.view.View getActionView(android.view.MenuItem);
+    method public static boolean isActionViewExpanded(android.view.MenuItem);
+    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
+    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
+    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
+    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
+    method public static void setShowAsAction(android.view.MenuItem, int);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  public static abstract interface MenuItemCompat.OnActionExpandListener {
+    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+  }
+
+  public class MotionEventCompat {
+    ctor public MotionEventCompat();
+    method public static int findPointerIndex(android.view.MotionEvent, int);
+    method public static int getActionIndex(android.view.MotionEvent);
+    method public static int getActionMasked(android.view.MotionEvent);
+    method public static float getAxisValue(android.view.MotionEvent, int);
+    method public static float getAxisValue(android.view.MotionEvent, int, int);
+    method public static int getPointerCount(android.view.MotionEvent);
+    method public static int getPointerId(android.view.MotionEvent, int);
+    method public static int getSource(android.view.MotionEvent);
+    method public static float getX(android.view.MotionEvent, int);
+    method public static float getY(android.view.MotionEvent, int);
+    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field public static final int ACTION_MASK = 255; // 0xff
+    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field public static final int ACTION_POINTER_UP = 6; // 0x6
+    field public static final int ACTION_SCROLL = 8; // 0x8
+    field public static final int AXIS_BRAKE = 23; // 0x17
+    field public static final int AXIS_DISTANCE = 24; // 0x18
+    field public static final int AXIS_GAS = 22; // 0x16
+    field public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field public static final int AXIS_HAT_X = 15; // 0xf
+    field public static final int AXIS_HAT_Y = 16; // 0x10
+    field public static final int AXIS_HSCROLL = 10; // 0xa
+    field public static final int AXIS_LTRIGGER = 17; // 0x11
+    field public static final int AXIS_ORIENTATION = 8; // 0x8
+    field public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RTRIGGER = 18; // 0x12
+    field public static final int AXIS_RUDDER = 20; // 0x14
+    field public static final int AXIS_RX = 12; // 0xc
+    field public static final int AXIS_RY = 13; // 0xd
+    field public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SIZE = 3; // 0x3
+    field public static final int AXIS_THROTTLE = 19; // 0x13
+    field public static final int AXIS_TILT = 25; // 0x19
+    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field public static final int AXIS_VSCROLL = 9; // 0x9
+    field public static final int AXIS_WHEEL = 21; // 0x15
+    field public static final int AXIS_X = 0; // 0x0
+    field public static final int AXIS_Y = 1; // 0x1
+    field public static final int AXIS_Z = 11; // 0xb
+  }
+
+  public abstract interface NestedScrollingChild {
+    method public abstract boolean dispatchNestedFling(float, float, boolean);
+    method public abstract boolean dispatchNestedPreFling(float, float);
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public abstract boolean hasNestedScrollingParent();
+    method public abstract boolean isNestedScrollingEnabled();
+    method public abstract void setNestedScrollingEnabled(boolean);
+    method public abstract boolean startNestedScroll(int);
+    method public abstract void stopNestedScroll();
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public abstract interface NestedScrollingParent {
+    method public abstract int getNestedScrollAxes();
+    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
+    method public abstract boolean onNestedPreFling(android.view.View, float, float);
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public abstract void onStopNestedScroll(android.view.View);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public abstract interface OnApplyWindowInsetsListener {
+    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+  }
+
+  public abstract class PagerAdapter {
+    ctor public PagerAdapter();
+    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
+    method public void finishUpdate(android.view.ViewGroup);
+    method public deprecated void finishUpdate(android.view.View);
+    method public abstract int getCount();
+    method public int getItemPosition(java.lang.Object);
+    method public java.lang.CharSequence getPageTitle(int);
+    method public float getPageWidth(int);
+    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
+    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
+    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
+    method public void notifyDataSetChanged();
+    method public void registerDataSetObserver(android.database.DataSetObserver);
+    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+    method public android.os.Parcelable saveState();
+    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
+    method public void startUpdate(android.view.ViewGroup);
+    method public deprecated void startUpdate(android.view.View);
+    method public void unregisterDataSetObserver(android.database.DataSetObserver);
+    field public static final int POSITION_NONE = -2; // 0xfffffffe
+    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
+  }
+
+  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
+    ctor public PagerTabStrip(android.content.Context);
+    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
+    method public boolean getDrawFullUnderline();
+    method public int getTabIndicatorColor();
+    method public void setDrawFullUnderline(boolean);
+    method public void setTabIndicatorColor(int);
+    method public void setTabIndicatorColorResource(int);
+  }
+
+  public class PagerTitleStrip extends android.view.ViewGroup {
+    ctor public PagerTitleStrip(android.content.Context);
+    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
+    method public int getTextSpacing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setGravity(int);
+    method public void setNonPrimaryAlpha(float);
+    method public void setTextColor(int);
+    method public void setTextSize(int, float);
+    method public void setTextSpacing(int);
+  }
+
+  public class ScaleGestureDetectorCompat {
+    method public static boolean isQuickScaleEnabled(java.lang.Object);
+    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
+  }
+
+  public abstract interface ScrollingView {
+    method public abstract int computeHorizontalScrollExtent();
+    method public abstract int computeHorizontalScrollOffset();
+    method public abstract int computeHorizontalScrollRange();
+    method public abstract int computeVerticalScrollExtent();
+    method public abstract int computeVerticalScrollOffset();
+    method public abstract int computeVerticalScrollRange();
+  }
+
+  public abstract interface TintableBackgroundView {
+    method public abstract android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public abstract void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class VelocityTrackerCompat {
+    ctor public VelocityTrackerCompat();
+    method public static float getXVelocity(android.view.VelocityTracker, int);
+    method public static float getYVelocity(android.view.VelocityTracker, int);
+  }
+
+  public class ViewCompat {
+    ctor public ViewCompat();
+    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method public static boolean canScrollHorizontally(android.view.View, int);
+    method public static boolean canScrollVertically(android.view.View, int);
+    method public static int combineMeasuredStates(int, int);
+    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public static float getAlpha(android.view.View);
+    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect getClipBounds(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method public static int getLayerType(android.view.View);
+    method public static int getLayoutDirection(android.view.View);
+    method public static int getMeasuredHeightAndState(android.view.View);
+    method public static int getMeasuredState(android.view.View);
+    method public static int getMeasuredWidthAndState(android.view.View);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getOverScrollMode(android.view.View);
+    method public static int getPaddingEnd(android.view.View);
+    method public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
+    method public static float getPivotX(android.view.View);
+    method public static float getPivotY(android.view.View);
+    method public static float getRotation(android.view.View);
+    method public static float getRotationX(android.view.View);
+    method public static float getRotationY(android.view.View);
+    method public static float getScaleX(android.view.View);
+    method public static float getScaleY(android.view.View);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.lang.String getTransitionName(android.view.View);
+    method public static float getTranslationX(android.view.View);
+    method public static float getTranslationY(android.view.View);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method public static float getX(android.view.View);
+    method public static float getY(android.view.View);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method public static boolean isOpaque(android.view.View);
+    method public static boolean isPaddingRelative(android.view.View);
+    method public static void jumpDrawablesToCurrentState(android.view.View);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
+    method public static void requestApplyInsets(android.view.View);
+    method public static int resolveSizeAndState(int, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method public static void setActivated(android.view.View, boolean);
+    method public static void setAlpha(android.view.View, float);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
+    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect);
+    method public static void setElevation(android.view.View, float);
+    method public static void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setLabelFor(android.view.View, int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
+    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
+    method public static void setOverScrollMode(android.view.View, int);
+    method public static void setPaddingRelative(android.view.View, int, int, int, int);
+    method public static void setPivotX(android.view.View, float);
+    method public static void setPivotY(android.view.View, float);
+    method public static void setRotation(android.view.View, float);
+    method public static void setRotationX(android.view.View, float);
+    method public static void setRotationY(android.view.View, float);
+    method public static void setSaveFromParentEnabled(android.view.View, boolean);
+    method public static void setScaleX(android.view.View, float);
+    method public static void setScaleY(android.view.View, float);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method public static void setTransitionName(android.view.View, java.lang.String);
+    method public static void setTranslationX(android.view.View, float);
+    method public static void setTranslationY(android.view.View, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setX(android.view.View, float);
+    method public static void setY(android.view.View, float);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static void stopNestedScroll(android.view.View);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+  }
+
+  public class ViewConfigurationCompat {
+    ctor public ViewConfigurationCompat();
+    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
+  }
+
+  public class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public class ViewPager extends android.view.ViewGroup {
+    ctor public ViewPager(android.content.Context);
+    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public boolean arrowScroll(int);
+    method public boolean beginFakeDrag();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public void clearOnPageChangeListeners();
+    method public void endFakeDrag();
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fakeDragBy(float);
+    method public android.support.v4.view.PagerAdapter getAdapter();
+    method public int getCurrentItem();
+    method public int getOffscreenPageLimit();
+    method public int getPageMargin();
+    method public boolean isFakeDragging();
+    method protected void onLayout(boolean, int, int, int, int);
+    method protected void onPageScrolled(int, float, int);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setAdapter(android.support.v4.view.PagerAdapter);
+    method public void setCurrentItem(int);
+    method public void setCurrentItem(int, boolean);
+    method public void setOffscreenPageLimit(int);
+    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setPageMargin(int);
+    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
+    method public void setPageMarginDrawable(int);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+  }
+
+  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
+    ctor public ViewPager.LayoutParams();
+    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public int gravity;
+    field public boolean isDecor;
+  }
+
+  public static abstract interface ViewPager.OnPageChangeListener {
+    method public abstract void onPageScrollStateChanged(int);
+    method public abstract void onPageScrolled(int, float, int);
+    method public abstract void onPageSelected(int);
+  }
+
+  public static abstract interface ViewPager.PageTransformer {
+    method public abstract void transformPage(android.view.View, float);
+  }
+
+  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
+    ctor public ViewPager.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
+  }
+
+  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+    ctor public ViewPager.SimpleOnPageChangeListener();
+    method public void onPageScrollStateChanged(int);
+    method public void onPageScrolled(int, float, int);
+    method public void onPageSelected(int);
+  }
+
+  public class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public class ViewPropertyAnimatorCompat {
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator getInterpolator();
+    method public long getStartDelay();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
+    method public void start();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public abstract interface ViewPropertyAnimatorListener {
+    method public abstract void onAnimationCancel(android.view.View);
+    method public abstract void onAnimationEnd(android.view.View);
+    method public abstract void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public abstract interface ViewPropertyAnimatorUpdateListener {
+    method public abstract void onAnimationUpdate(android.view.View);
+  }
+
+  public class WindowCompat {
+    ctor public WindowCompat();
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
+    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+  }
+
+}
+
+package android.support.v4.view.accessibility {
+
+  public class AccessibilityEventCompat {
+    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
+    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public class AccessibilityManagerCompat {
+    ctor public AccessibilityManagerCompat();
+    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+  }
+
+  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+    method public abstract void onAccessibilityStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
+    method public void addAction(int);
+    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public void addChild(android.view.View);
+    method public void addChild(android.view.View, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
+    method public int getActions();
+    method public void getBoundsInParent(android.graphics.Rect);
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
+    method public int getChildCount();
+    method public java.lang.CharSequence getClassName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
+    method public java.lang.CharSequence getContentDescription();
+    method public java.lang.CharSequence getError();
+    method public android.os.Bundle getExtras();
+    method public java.lang.Object getInfo();
+    method public int getInputType();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public java.lang.CharSequence getPackageName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
+    method public java.lang.CharSequence getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
+    method public java.lang.String getViewIdResourceName();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isVisibleToUser();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public boolean removeChild(android.view.View);
+    method public boolean removeChild(android.view.View, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setBoundsInParent(android.graphics.Rect);
+    method public void setBoundsInScreen(android.graphics.Rect);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(java.lang.CharSequence);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(java.lang.Object);
+    method public void setCollectionItemInfo(java.lang.Object);
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setContentInvalid(boolean);
+    method public void setDismissable(boolean);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(java.lang.CharSequence);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View);
+    method public void setLabelFor(android.view.View, int);
+    method public void setLabeledBy(android.view.View);
+    method public void setLabeledBy(android.view.View, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(java.lang.CharSequence);
+    method public void setParent(android.view.View);
+    method public void setParent(android.view.View, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setSource(android.view.View);
+    method public void setSource(android.view.View, int);
+    method public void setText(java.lang.CharSequence);
+    method public void setTextSelection(int, int);
+    method public void setTraversalAfter(android.view.View);
+    method public void setTraversalAfter(android.view.View, int);
+    method public void setTraversalBefore(android.view.View);
+    method public void setTraversalBefore(android.view.View, int);
+    method public void setViewIdResourceName(java.lang.String);
+    method public void setVisibleToUser(boolean);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
+    method public int getId();
+    method public java.lang.CharSequence getLabel();
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public boolean isHierarchical();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method public boolean isHeading();
+    method public boolean isSelected();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public java.lang.Object getProvider();
+    method public boolean performAction(int, int, android.os.Bundle);
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
+    method public int getAddedCount();
+    method public java.lang.CharSequence getBeforeText();
+    method public java.lang.CharSequence getClassName();
+    method public java.lang.CharSequence getContentDescription();
+    method public int getCurrentItemIndex();
+    method public int getFromIndex();
+    method public deprecated java.lang.Object getImpl();
+    method public int getItemCount();
+    method public int getMaxScrollX();
+    method public int getMaxScrollY();
+    method public android.os.Parcelable getParcelableData();
+    method public int getRemovedCount();
+    method public int getScrollX();
+    method public int getScrollY();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
+    method public java.util.List<java.lang.CharSequence> getText();
+    method public int getToIndex();
+    method public int getWindowId();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isFullScreen();
+    method public boolean isPassword();
+    method public boolean isScrollable();
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
+    method public void recycle();
+    method public void setAddedCount(int);
+    method public void setBeforeText(java.lang.CharSequence);
+    method public void setChecked(boolean);
+    method public void setClassName(java.lang.CharSequence);
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setCurrentItemIndex(int);
+    method public void setEnabled(boolean);
+    method public void setFromIndex(int);
+    method public void setFullScreen(boolean);
+    method public void setItemCount(int);
+    method public void setMaxScrollX(int);
+    method public void setMaxScrollY(int);
+    method public void setParcelableData(android.os.Parcelable);
+    method public void setPassword(boolean);
+    method public void setRemovedCount(int);
+    method public void setScrollX(int);
+    method public void setScrollY(int);
+    method public void setScrollable(boolean);
+    method public void setSource(android.view.View);
+    method public void setSource(android.view.View, int);
+    method public void setToIndex(int);
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public FastOutLinearInInterpolator();
+  }
+
+  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public FastOutSlowInInterpolator();
+  }
+
+  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public LinearOutSlowInInterpolator();
+  }
+
+   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
+    ctor public LookupTableInterpolator(float[]);
+    method public float getInterpolation(float);
+  }
+
+  public class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package android.support.v4.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+    method public abstract void scrollTargetBy(int, int);
+    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
+    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
+    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public abstract class CursorAdapter extends android.widget.BaseAdapter {
+    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
+    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursor(android.database.Cursor);
+    method public java.lang.CharSequence convertToString(android.database.Cursor);
+    method public int getCount();
+    method public android.database.Cursor getCursor();
+    method public android.widget.Filter getFilter();
+    method public android.widget.FilterQueryProvider getFilterQueryProvider();
+    method public java.lang.Object getItem(int);
+    method public long getItemId(int);
+    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
+    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
+    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method protected void onContentChanged();
+    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
+    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
+    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
+  }
+
+  public class DrawerLayout extends android.view.ViewGroup {
+    ctor public DrawerLayout(android.content.Context);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    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);
+    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
+    method public boolean isDrawerOpen(android.view.View);
+    method public boolean isDrawerOpen(int);
+    method public boolean isDrawerVisible(android.view.View);
+    method public boolean isDrawerVisible(int);
+    method public void onDraw(android.graphics.Canvas);
+    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);
+    method public void setDrawerLockMode(int, android.view.View);
+    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
+    method public void setDrawerShadow(int, int);
+    method public void setDrawerTitle(int, java.lang.CharSequence);
+    method public void setScrimColor(int);
+    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackground(int);
+    method public void setStatusBarBackgroundColor(int);
+    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
+    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
+    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract interface DrawerLayout.DrawerListener {
+    method public abstract void onDrawerClosed(android.view.View);
+    method public abstract void onDrawerOpened(android.view.View);
+    method public abstract void onDrawerSlide(android.view.View, float);
+    method public abstract void onDrawerStateChanged(int);
+  }
+
+  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout.LayoutParams(int, int);
+    ctor public DrawerLayout.LayoutParams(int, int, int);
+    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public int gravity;
+  }
+
+  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
+    ctor public DrawerLayout.SavedState(android.os.Parcel);
+    ctor public DrawerLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
+  }
+
+  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public DrawerLayout.SimpleDrawerListener();
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+  }
+
+  public class EdgeEffectCompat {
+    ctor public EdgeEffectCompat(android.content.Context);
+    method public boolean draw(android.graphics.Canvas);
+    method public void finish();
+    method public boolean isFinished();
+    method public boolean onAbsorb(int);
+    method public deprecated boolean onPull(float);
+    method public boolean onPull(float, float);
+    method public boolean onRelease();
+    method public void setSize(int, int);
+  }
+
+  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public ExploreByTouchHelper(android.view.View);
+    method public boolean dispatchHoverEvent(android.view.MotionEvent);
+    method public int getFocusedVirtualView();
+    method protected abstract int getVirtualViewAt(float, float);
+    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
+    method public void invalidateRoot();
+    method public void invalidateVirtualView(int);
+    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
+    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
+    method public void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public boolean sendEventForVirtualView(int, int);
+    field public static final int HOST_ID = -1; // 0xffffffff
+    field public static final int INVALID_ID = -2147483648; // 0x80000000
+  }
+
+  public class ListPopupWindowCompat {
+    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
+    method public boolean arrowScroll(int);
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollTo(int, int);
+  }
+
+  public static abstract interface NestedScrollView.OnScrollChangeListener {
+    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
+  }
+
+  public class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
+    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
+    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
+    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
+    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public void setDropDownViewResource(int);
+    method public void setViewResource(int);
+  }
+
+  public class ScrollerCompat {
+    method public void abortAnimation();
+    method public boolean computeScrollOffset();
+    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
+    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
+    method public void fling(int, int, int, int, int, int, int, int);
+    method public void fling(int, int, int, int, int, int, int, int, int, int);
+    method public float getCurrVelocity();
+    method public int getCurrX();
+    method public int getCurrY();
+    method public int getFinalX();
+    method public int getFinalY();
+    method public boolean isFinished();
+    method public boolean isOverScrolled();
+    method public void notifyHorizontalEdgeReached(int, int, int);
+    method public void notifyVerticalEdgeReached(int, int, int);
+    method public boolean springBack(int, int, int, int, int, int);
+    method public void startScroll(int, int, int, int);
+    method public void startScroll(int, int, int, int, int);
+  }
+
+  public class SearchViewCompat {
+    method public static java.lang.CharSequence getQuery(android.view.View);
+    method public static boolean isIconified(android.view.View);
+    method public static boolean isQueryRefinementEnabled(android.view.View);
+    method public static boolean isSubmitButtonEnabled(android.view.View);
+    method public static android.view.View newSearchView(android.content.Context);
+    method public static void setIconified(android.view.View, boolean);
+    method public static void setImeOptions(android.view.View, int);
+    method public static void setInputType(android.view.View, int);
+    method public static void setMaxWidth(android.view.View, int);
+    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
+    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
+    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
+    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
+    method public static void setQueryRefinementEnabled(android.view.View, boolean);
+    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
+    method public static void setSubmitButtonEnabled(android.view.View, boolean);
+  }
+
+  public static abstract class SearchViewCompat.OnCloseListenerCompat {
+    ctor public SearchViewCompat.OnCloseListenerCompat();
+    method public boolean onClose();
+  }
+
+  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
+    ctor public SearchViewCompat.OnQueryTextListenerCompat();
+    method public boolean onQueryTextChange(java.lang.String);
+    method public boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
+    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
+    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
+    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
+    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
+    method public int getStringConversionColumn();
+    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
+    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
+    method public void setStringConversionColumn(int);
+    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
+    method public void setViewImage(android.widget.ImageView, java.lang.String);
+    method public void setViewText(android.widget.TextView, java.lang.String);
+  }
+
+  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
+    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
+  }
+
+  public static abstract interface SimpleCursorAdapter.ViewBinder {
+    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
+  }
+
+  public class SlidingPaneLayout extends android.view.ViewGroup {
+    ctor public SlidingPaneLayout(android.content.Context);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public deprecated boolean canSlide();
+    method public boolean closePane();
+    method public int getCoveredFadeColor();
+    method public int getParallaxDistance();
+    method public int getSliderFadeColor();
+    method public boolean isOpen();
+    method public boolean isSlideable();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public boolean openPane();
+    method public void setCoveredFadeColor(int);
+    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
+    method public void setParallaxDistance(int);
+    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
+    method public deprecated void setShadowResource(int);
+    method public void setShadowResourceLeft(int);
+    method public void setShadowResourceRight(int);
+    method public void setSliderFadeColor(int);
+    method public deprecated void smoothSlideClosed();
+    method public deprecated void smoothSlideOpen();
+  }
+
+  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public SlidingPaneLayout.LayoutParams();
+    ctor public SlidingPaneLayout.LayoutParams(int, int);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public float weight;
+  }
+
+  public static abstract interface SlidingPaneLayout.PanelSlideListener {
+    method public abstract void onPanelClosed(android.view.View);
+    method public abstract void onPanelOpened(android.view.View);
+    method public abstract void onPanelSlide(android.view.View, float);
+  }
+
+  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
+    ctor public SlidingPaneLayout.SimplePanelSlideListener();
+    method public void onPanelClosed(android.view.View);
+    method public void onPanelOpened(android.view.View);
+    method public void onPanelSlide(android.view.View, float);
+  }
+
+  public class Space extends android.view.View {
+    ctor public Space(android.content.Context, android.util.AttributeSet, int);
+    ctor public Space(android.content.Context, android.util.AttributeSet);
+    ctor public Space(android.content.Context);
+  }
+
+  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
+    ctor public SwipeRefreshLayout(android.content.Context);
+    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
+    method public boolean canChildScrollUp();
+    method public int getProgressCircleDiameter();
+    method public boolean isRefreshing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onMeasure(int, int);
+    method public deprecated void setColorScheme(int...);
+    method public void setColorSchemeColors(int...);
+    method public void setColorSchemeResources(int...);
+    method public void setDistanceToTriggerSync(int);
+    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
+    method public deprecated void setProgressBackgroundColor(int);
+    method public void setProgressBackgroundColorSchemeColor(int);
+    method public void setProgressBackgroundColorSchemeResource(int);
+    method public void setProgressViewEndTarget(boolean, int);
+    method public void setProgressViewOffset(boolean, int, int);
+    method public void setRefreshing(boolean);
+    method public void setSize(int);
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+    field protected int mFrom;
+    field protected int mOriginalOffsetTop;
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+    method public abstract void onRefresh();
+  }
+
+  public class TextViewCompat {
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
+  }
+
+  public abstract interface TintableCompoundButton {
+    method public abstract android.content.res.ColorStateList getSupportButtonTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportButtonTintMode();
+    method public abstract void setSupportButtonTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportButtonTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class ViewDragHelper {
+    method public void abort();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
+    method public void cancel();
+    method public void captureChildView(android.view.View, int);
+    method public boolean checkTouchSlop(int);
+    method public boolean checkTouchSlop(int, int);
+    method public boolean continueSettling(boolean);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
+    method public android.view.View findTopChildUnder(int, int);
+    method public void flingCapturedView(int, int, int, int);
+    method public int getActivePointerId();
+    method public android.view.View getCapturedView();
+    method public int getEdgeSize();
+    method public float getMinVelocity();
+    method public int getTouchSlop();
+    method public int getViewDragState();
+    method public boolean isCapturedViewUnder(int, int);
+    method public boolean isEdgeTouched(int);
+    method public boolean isEdgeTouched(int, int);
+    method public boolean isPointerDown(int);
+    method public boolean isViewUnder(android.view.View, int, int);
+    method public void processTouchEvent(android.view.MotionEvent);
+    method public void setEdgeTrackingEnabled(int);
+    method public void setMinVelocity(float);
+    method public boolean settleCapturedViewAt(int, int);
+    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
+    method public boolean smoothSlideViewTo(android.view.View, int, int);
+    field public static final int DIRECTION_ALL = 3; // 0x3
+    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
+    field public static final int DIRECTION_VERTICAL = 2; // 0x2
+    field public static final int EDGE_ALL = 15; // 0xf
+    field public static final int EDGE_BOTTOM = 8; // 0x8
+    field public static final int EDGE_LEFT = 1; // 0x1
+    field public static final int EDGE_RIGHT = 2; // 0x2
+    field public static final int EDGE_TOP = 4; // 0x4
+    field public static final int INVALID_POINTER = -1; // 0xffffffff
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class ViewDragHelper.Callback {
+    ctor public ViewDragHelper.Callback();
+    method public int clampViewPositionHorizontal(android.view.View, int, int);
+    method public int clampViewPositionVertical(android.view.View, int, int);
+    method public int getOrderedChildIndex(int);
+    method public int getViewHorizontalDragRange(android.view.View);
+    method public int getViewVerticalDragRange(android.view.View);
+    method public void onEdgeDragStarted(int, int);
+    method public boolean onEdgeLock(int);
+    method public void onEdgeTouched(int, int);
+    method public void onViewCaptured(android.view.View, int);
+    method public void onViewDragStateChanged(int);
+    method public void onViewPositionChanged(android.view.View, int, int, int, int);
+    method public void onViewReleased(android.view.View, float, float);
+    method public abstract boolean tryCaptureView(android.view.View, int);
+  }
+
+}
+
diff --git a/v4/api/current.txt b/v4/api/current.txt
index 9f50a24..f08404c 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -1,6 +1,6 @@
 package android.support.v4.accessibilityservice {
 
-  public class AccessibilityServiceInfoCompat {
+  public final class AccessibilityServiceInfoCompat {
     method public static java.lang.String capabilityToString(int);
     method public static java.lang.String feedbackTypeToString(int);
     method public static java.lang.String flagToString(int);
@@ -89,8 +89,7 @@
     method public void update(android.support.v4.app.ActivityOptionsCompat);
   }
 
-  public class AppOpsManagerCompat {
-    ctor public AppOpsManagerCompat();
+  public final class AppOpsManagerCompat {
     method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
     method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
     method public static java.lang.String permissionToOp(java.lang.String);
@@ -105,8 +104,7 @@
    abstract class BaseFragmentActivityHoneycomb extends android.support.v4.app.BaseFragmentActivityDonut {
   }
 
-  public class BundleCompat {
-    ctor public BundleCompat();
+  public final class BundleCompat {
     method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
     method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
   }
@@ -448,7 +446,7 @@
     method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
   }
 
-  public class NavUtils {
+  public final class NavUtils {
     method public static android.content.Intent getParentActivityIntent(android.app.Activity);
     method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
     method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -759,7 +757,7 @@
     method public android.os.IBinder onBind(android.content.Intent);
   }
 
-  public class NotificationManagerCompat {
+  public final class NotificationManagerCompat {
     method public void cancel(int);
     method public void cancel(java.lang.String, int);
     method public void cancelAll();
@@ -771,7 +769,7 @@
     field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
   }
 
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
+  public final class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
     method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
     method public boolean getAllowFreeFormInput();
     method public java.lang.CharSequence[] getChoices();
@@ -805,12 +803,11 @@
     method protected abstract java.lang.String getResultKey();
   }
 
-  public class ServiceCompat {
+  public final class ServiceCompat {
     field public static final int START_STICKY = 1; // 0x1
   }
 
-  public class ShareCompat {
-    ctor public ShareCompat();
+  public final class ShareCompat {
     method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
     method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
     method public static android.content.ComponentName getCallingActivity(android.app.Activity);
@@ -875,7 +872,7 @@
     method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
   }
 
-  public class TaskStackBuilder implements java.lang.Iterable {
+  public final class TaskStackBuilder implements java.lang.Iterable {
     method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
     method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
     method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
@@ -912,13 +909,14 @@
     method public void setUpdateThrottle(long);
   }
 
-  public class ContentResolverCompat {
+  public final class ContentResolverCompat {
     method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
   }
 
   public class ContextCompat {
     ctor public ContextCompat();
     method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public static android.content.Context createDeviceEncryptedStorageContext(android.content.Context);
     method public static java.io.File getCodeCacheDir(android.content.Context);
     method public static final int getColor(android.content.Context, int);
     method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
@@ -927,6 +925,7 @@
     method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
     method public static java.io.File getNoBackupFilesDir(android.content.Context);
     method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean isDeviceEncryptedStorage(android.content.Context);
     method public static boolean startActivities(android.content.Context, android.content.Intent[]);
     method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
   }
@@ -960,7 +959,7 @@
     method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
-  public class IntentCompat {
+  public final class IntentCompat {
     method public static android.content.Intent makeMainActivity(android.content.ComponentName);
     method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
     method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
@@ -1018,7 +1017,7 @@
     method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
   }
 
-  public class LocalBroadcastManager {
+  public final class LocalBroadcastManager {
     method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
     method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
     method public boolean sendBroadcast(android.content.Intent);
@@ -1026,8 +1025,7 @@
     method public void unregisterReceiver(android.content.BroadcastReceiver);
   }
 
-  public class ParallelExecutorCompat {
-    ctor public ParallelExecutorCompat();
+  public final class ParallelExecutorCompat {
     method public static java.util.concurrent.Executor getParallelExecutor();
   }
 
@@ -1044,11 +1042,10 @@
   public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
   }
 
-  public class SharedPreferencesCompat {
-    ctor public SharedPreferencesCompat();
+  public final class SharedPreferencesCompat {
   }
 
-  public static class SharedPreferencesCompat.EditorCompat {
+  public static final class SharedPreferencesCompat.EditorCompat {
     method public void apply(android.content.SharedPreferences.Editor);
     method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
   }
@@ -1063,7 +1060,7 @@
 
 package android.support.v4.content.pm {
 
-  public class ActivityInfoCompat {
+  public final class ActivityInfoCompat {
     field public static final int CONFIG_UI_MODE = 512; // 0x200
   }
 
@@ -1071,8 +1068,7 @@
 
 package android.support.v4.content.res {
 
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
+  public final class ResourcesCompat {
     method public static int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
     method public static android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
     method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
@@ -1083,7 +1079,7 @@
 
 package android.support.v4.database {
 
-  public class DatabaseUtilsCompat {
+  public final class DatabaseUtilsCompat {
     method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
     method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
   }
@@ -1092,14 +1088,13 @@
 
 package android.support.v4.graphics {
 
-  public class BitmapCompat {
-    ctor public BitmapCompat();
+  public final class BitmapCompat {
     method public static int getAllocationByteCount(android.graphics.Bitmap);
     method public static boolean hasMipMap(android.graphics.Bitmap);
     method public static void setHasMipMap(android.graphics.Bitmap, boolean);
   }
 
-  public class ColorUtils {
+  public final class ColorUtils {
     method public static int HSLToColor(float[]);
     method public static void RGBToHSL(int, int, int, float[]);
     method public static double calculateContrast(int, int);
@@ -1114,8 +1109,7 @@
 
 package android.support.v4.graphics.drawable {
 
-  public class DrawableCompat {
-    ctor public DrawableCompat();
+  public final class 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);
@@ -1152,8 +1146,7 @@
     method public void setTargetDensity(int);
   }
 
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
+  public final class RoundedBitmapDrawableFactory {
     method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
     method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
     method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
@@ -1175,7 +1168,7 @@
 
 package android.support.v4.hardware.fingerprint {
 
-  public class FingerprintManagerCompat {
+  public final class FingerprintManagerCompat {
     method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
     method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
     method public boolean hasEnrolledFingerprints();
@@ -1724,20 +1717,20 @@
 
 package android.support.v4.net {
 
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
+  public final class ConnectivityManagerCompat {
     method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
     method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
   }
 
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
+  public final class TrafficStatsCompat {
     method public static void clearThreadStatsTag();
     method public static int getThreadStatsTag();
     method public static void incrementOperationCount(int);
     method public static void incrementOperationCount(int, int);
     method public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
     method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
     method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
   }
 
@@ -1745,8 +1738,7 @@
 
 package android.support.v4.os {
 
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
+  public final class AsyncTaskCompat {
     method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
   }
 
@@ -1763,8 +1755,7 @@
     method public abstract void onCancel();
   }
 
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
+  public final class EnvironmentCompat {
     method public static java.lang.String getStorageState(java.io.File);
     field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
   }
@@ -1774,8 +1765,7 @@
     ctor public OperationCanceledException(java.lang.String);
   }
 
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
+  public final class ParcelableCompat {
     method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
   }
 
@@ -1784,12 +1774,17 @@
     method public abstract T[] newArray(int);
   }
 
-  public class TraceCompat {
-    ctor public TraceCompat();
+  public final class TraceCompat {
     method public static void beginSection(java.lang.String);
     method public static void endSection();
   }
 
+  public class UserManagerCompat {
+    ctor public UserManagerCompat();
+    method public static boolean isUserRunningAndLocked(android.content.Context);
+    method public static boolean isUserRunningAndUnlocked(android.content.Context);
+  }
+
 }
 
 package android.support.v4.print {
@@ -1873,8 +1868,7 @@
     method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
   }
 
-  public class ICUCompat {
-    ctor public ICUCompat();
+  public final class ICUCompat {
     method public static java.lang.String maximizeAndGetScript(java.util.Locale);
   }
 
@@ -1883,8 +1877,7 @@
     method public abstract boolean isRtl(java.lang.CharSequence, int, int);
   }
 
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
+  public final class TextDirectionHeuristicsCompat {
     field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
     field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
     field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
@@ -1893,8 +1886,7 @@
     field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
   }
 
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
+  public final class TextUtilsCompat {
     method public static int getLayoutDirectionFromLocale(java.util.Locale);
     method public static java.lang.String htmlEncode(java.lang.String);
     field public static final java.util.Locale ROOT;
@@ -2106,7 +2098,16 @@
     method public abstract void onActionProviderVisibilityChanged(boolean);
   }
 
-  public class GestureDetectorCompat {
+  public final class AsyncLayoutInflater {
+    ctor public AsyncLayoutInflater(android.content.Context);
+    method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
+  }
+
+  public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
+    method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
+  }
+
+  public final class GestureDetectorCompat {
     ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
     ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
     method public boolean isLongpressEnabled();
@@ -2115,8 +2116,7 @@
     method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
   }
 
-  public class GravityCompat {
-    ctor public GravityCompat();
+  public final class GravityCompat {
     method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
     method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
     method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
@@ -2127,8 +2127,7 @@
     field public static final int START = 8388611; // 0x800003
   }
 
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
+  public final class InputDeviceCompat {
     field public static final int SOURCE_ANY = -256; // 0xffffff00
     field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
     field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
@@ -2151,8 +2150,7 @@
     field public static final int SOURCE_UNKNOWN = 0; // 0x0
   }
 
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
+  public final class KeyEventCompat {
     method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
     method public static java.lang.Object getKeyDispatcherState(android.view.View);
     method public static boolean hasModifiers(android.view.KeyEvent, int);
@@ -2164,7 +2162,7 @@
     method public static void startTracking(android.view.KeyEvent);
   }
 
-  public class LayoutInflaterCompat {
+  public final class LayoutInflaterCompat {
     method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
   }
 
@@ -2172,8 +2170,7 @@
     method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
   }
 
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
+  public final class MarginLayoutParamsCompat {
     method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
     method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
     method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
@@ -2184,13 +2181,11 @@
     method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
   }
 
-  public class MenuCompat {
-    ctor public MenuCompat();
+  public final class MenuCompat {
     method public static deprecated void setShowAsAction(android.view.MenuItem, int);
   }
 
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
+  public final class MenuItemCompat {
     method public static boolean collapseActionView(android.view.MenuItem);
     method public static boolean expandActionView(android.view.MenuItem);
     method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
@@ -2213,8 +2208,7 @@
     method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
   }
 
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
+  public final class MotionEventCompat {
     method public static int findPointerIndex(android.view.MotionEvent, int);
     method public static int getActionIndex(android.view.MotionEvent);
     method public static int getActionMasked(android.view.MotionEvent);
@@ -2375,7 +2369,7 @@
     method public void setTextSpacing(int);
   }
 
-  public class ScaleGestureDetectorCompat {
+  public final class ScaleGestureDetectorCompat {
     method public static boolean isQuickScaleEnabled(java.lang.Object);
     method public static void setQuickScaleEnabled(java.lang.Object, boolean);
   }
@@ -2396,14 +2390,12 @@
     method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
   }
 
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
+  public final class VelocityTrackerCompat {
     method public static float getXVelocity(android.view.VelocityTracker, int);
     method public static float getYVelocity(android.view.VelocityTracker, int);
   }
 
-  public class ViewCompat {
-    ctor public ViewCompat();
+  public final class ViewCompat {
     method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
     method public static boolean canScrollHorizontally(android.view.View, int);
     method public static boolean canScrollVertically(android.view.View, int);
@@ -2546,13 +2538,12 @@
     field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
   }
 
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
+  public final class ViewConfigurationCompat {
     method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
     method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
   }
 
-  public class ViewGroupCompat {
+  public final class ViewGroupCompat {
     method public static int getLayoutMode(android.view.ViewGroup);
     method public static int getNestedScrollAxes(android.view.ViewGroup);
     method public static boolean isTransitionGroup(android.view.ViewGroup);
@@ -2628,7 +2619,7 @@
     method public void onPageSelected(int);
   }
 
-  public class ViewParentCompat {
+  public final class ViewParentCompat {
     method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
     method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
     method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
@@ -2640,7 +2631,7 @@
     method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
   }
 
-  public class ViewPropertyAnimatorCompat {
+  public final class ViewPropertyAnimatorCompat {
     method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
     method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
     method public void cancel();
@@ -2697,8 +2688,7 @@
     method public abstract void onAnimationUpdate(android.view.View);
   }
 
-  public class WindowCompat {
-    ctor public WindowCompat();
+  public final class WindowCompat {
     field public static final int FEATURE_ACTION_BAR = 8; // 0x8
     field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
     field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
@@ -2728,7 +2718,7 @@
 
 package android.support.v4.view.accessibility {
 
-  public class AccessibilityEventCompat {
+  public final class AccessibilityEventCompat {
     method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
     method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
     method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
@@ -2757,8 +2747,7 @@
     field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
   }
 
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
+  public final class AccessibilityManagerCompat {
     method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
     method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
     method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
@@ -3082,7 +3071,7 @@
     method public float getInterpolation(float);
   }
 
-  public class PathInterpolatorCompat {
+  public final class PathInterpolatorCompat {
     method public static android.view.animation.Interpolator create(android.graphics.Path);
     method public static android.view.animation.Interpolator create(float, float);
     method public static android.view.animation.Interpolator create(float, float, float, float);
@@ -3233,7 +3222,7 @@
     method public void onDrawerStateChanged(int);
   }
 
-  public class EdgeEffectCompat {
+  public final class EdgeEffectCompat {
     ctor public EdgeEffectCompat(android.content.Context);
     method public boolean draw(android.graphics.Canvas);
     method public void finish();
@@ -3247,22 +3236,31 @@
 
   public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
     ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
+    method public final boolean clearKeyboardFocusForVirtualView(int);
+    method public final boolean dispatchHoverEvent(android.view.MotionEvent);
+    method public final boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public final int getAccessibilityFocusedVirtualViewId();
+    method public deprecated int getFocusedVirtualView();
+    method public final int getKeyboardFocusedVirtualViewId();
     method protected abstract int getVirtualViewAt(float, float);
     method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
+    method public final void invalidateRoot();
+    method public final void invalidateVirtualView(int);
+    method public final void invalidateVirtualView(int, int);
+    method public final void onFocusChanged(boolean, int, android.graphics.Rect);
     method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method public void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
     method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
+    method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
+    method public final boolean requestKeyboardFocusForVirtualView(int);
+    method public final boolean sendEventForVirtualView(int, int);
     field public static final int HOST_ID = -1; // 0xffffffff
     field public static final int INVALID_ID = -2147483648; // 0x80000000
   }
 
-  public class ListPopupWindowCompat {
+  public final class ListPopupWindowCompat {
     method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
   }
 
@@ -3298,11 +3296,11 @@
     method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
   }
 
-  public class PopupMenuCompat {
+  public final class PopupMenuCompat {
     method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
   }
 
-  public class PopupWindowCompat {
+  public final class PopupWindowCompat {
     method public static boolean getOverlapAnchor(android.widget.PopupWindow);
     method public static int getWindowLayoutType(android.widget.PopupWindow);
     method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
@@ -3319,7 +3317,7 @@
     method public void setViewResource(int);
   }
 
-  public class ScrollerCompat {
+  public final class ScrollerCompat {
     method public void abortAnimation();
     method public boolean computeScrollOffset();
     method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
@@ -3340,7 +3338,7 @@
     method public void startScroll(int, int, int, int, int);
   }
 
-  public class SearchViewCompat {
+  public final class SearchViewCompat {
     method public static java.lang.CharSequence getQuery(android.view.View);
     method public static boolean isIconified(android.view.View);
     method public static boolean isQueryRefinementEnabled(android.view.View);
@@ -3480,7 +3478,7 @@
     method public abstract void onRefresh();
   }
 
-  public class TextViewCompat {
+  public final class TextViewCompat {
     method public static int getMaxLines(android.widget.TextView);
     method public static int getMinLines(android.widget.TextView);
     method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
diff --git a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java b/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
index ddcff2e..37c4b97 100644
--- a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
+++ b/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
@@ -92,6 +92,36 @@
         return transitionSet;
     }
 
+    private static void excludeViews(Transition transition, Transition fromTransition,
+            ArrayList<View> views, boolean exclude) {
+        if (transition != null) {
+            final int viewCount = fromTransition == null ? 0 : views.size();
+            for (int i = 0; i < viewCount; i++) {
+                transition.excludeTarget(views.get(i), exclude);
+            }
+        }
+    }
+
+    /**
+     * Exclude (or remove the exclude) of shared element views from the enter and exit transitions.
+     *
+     * @param enterTransitionObj The enter transition
+     * @param exitTransitionObj The exit transition
+     * @param sharedElementTransitionObj The shared element transition
+     * @param views The shared element target views.
+     * @param exclude <code>true</code> to exclude or <code>false</code> to remove the excluded
+     *                views.
+     */
+    public static void excludeSharedElementViews(Object enterTransitionObj,
+            Object exitTransitionObj, Object sharedElementTransitionObj, ArrayList<View> views,
+            boolean exclude) {
+        Transition enterTransition = (Transition) enterTransitionObj;
+        Transition exitTransition = (Transition) exitTransitionObj;
+        Transition sharedElementTransition = (Transition) sharedElementTransitionObj;
+        excludeViews(enterTransition, sharedElementTransition, views, exclude);
+        excludeViews(exitTransition, sharedElementTransition, views, exclude);
+    }
+
     /**
      * Prepares the enter transition by adding a non-existent view to the transition's target list
      * and setting it epicenter callback. By adding a non-existent view to the target list,
@@ -104,35 +134,42 @@
      *  capturing the final state of the Transition.</p>
      */
     public static void addTransitionTargets(Object enterTransitionObject,
-            Object sharedElementTransitionObject, final View container,
+            Object sharedElementTransitionObject, Object exitTransitionObject, final View container,
             final ViewRetriever inFragment, final View nonExistentView,
             EpicenterView epicenterView, final Map<String, String> nameOverrides,
-            final ArrayList<View> enteringViews, final Map<String, View> namedViews,
-            final Map<String, View> renamedViews, final ArrayList<View> sharedElementTargets) {
+            final ArrayList<View> enteringViews, final ArrayList<View> exitingViews,
+            final Map<String, View> namedViews, final Map<String, View> renamedViews,
+            final ArrayList<View> sharedElementTargets) {
+        final Transition enterTransition = (Transition) enterTransitionObject;
+        final Transition exitTransition = (Transition) exitTransitionObject;
+        final Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
+        excludeViews(enterTransition, exitTransition, exitingViews, true);
         if (enterTransitionObject != null || sharedElementTransitionObject != null) {
-            final Transition enterTransition = (Transition) enterTransitionObject;
             if (enterTransition != null) {
                 enterTransition.addTarget(nonExistentView);
             }
             if (sharedElementTransitionObject != null) {
-                setSharedElementTargets(sharedElementTransitionObject, nonExistentView,
+                setSharedElementTargets(sharedElementTransition, nonExistentView,
                         namedViews, sharedElementTargets);
+                excludeViews(enterTransition, sharedElementTransition, sharedElementTargets, true);
+                excludeViews(exitTransition, sharedElementTransition, sharedElementTargets, true);
             }
 
-            if (inFragment != null) {
-                container.getViewTreeObserver().addOnPreDrawListener(
-                        new ViewTreeObserver.OnPreDrawListener() {
-                            public boolean onPreDraw() {
-                                container.getViewTreeObserver().removeOnPreDrawListener(this);
-                                if (enterTransition != null) {
-                                    enterTransition.removeTarget(nonExistentView);
-                                }
+            container.getViewTreeObserver().addOnPreDrawListener(
+                    new ViewTreeObserver.OnPreDrawListener() {
+                        public boolean onPreDraw() {
+                            container.getViewTreeObserver().removeOnPreDrawListener(this);
+                            if (enterTransition != null) {
+                                enterTransition.removeTarget(nonExistentView);
+                            }
+                            if (inFragment != null) {
                                 View fragmentView = inFragment.getView();
                                 if (fragmentView != null) {
                                     if (!nameOverrides.isEmpty()) {
                                         findNamedViews(renamedViews, fragmentView);
                                         renamedViews.keySet().retainAll(nameOverrides.values());
-                                        for (Map.Entry<String, String> entry : nameOverrides.entrySet()) {
+                                        for (Map.Entry<String, String> entry : nameOverrides
+                                                .entrySet()) {
                                             String to = entry.getValue();
                                             View view = renamedViews.get(to);
                                             if (view != null) {
@@ -148,10 +185,12 @@
                                         addTargets(enterTransition, enteringViews);
                                     }
                                 }
-                                return true;
                             }
-                        });
-            }
+                            excludeViews(exitTransition, enterTransition, enteringViews, true);
+
+                            return true;
+                        }
+                    });
             setSharedElementEpicenter(enterTransition, epicenterView);
         }
     }
@@ -355,9 +394,15 @@
                     sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
                     if (enterTransition != null) {
                         removeTargets(enterTransition, enteringViews);
+                        excludeViews(enterTransition, exitTransition, exitingViews, false);
+                        excludeViews(enterTransition, sharedElementTransition, sharedElementTargets,
+                                false);
                     }
                     if (exitTransition != null) {
                         removeTargets(exitTransition, exitingViews);
+                        excludeViews(exitTransition, enterTransition, enteringViews, false);
+                        excludeViews(exitTransition, sharedElementTransition, sharedElementTargets,
+                                false);
                     }
                     if (sharedElementTransition != null) {
                         removeTargets(sharedElementTransition, sharedElementTargets);
diff --git a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java b/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
index 2f3b45a..3d0d9e6 100644
--- a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
+++ b/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
@@ -21,6 +21,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.DrawableContainer;
 import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.InsetDrawable;
 
 /**
  * Implementation of drawable compatibility that can call L APIs.
@@ -57,8 +58,9 @@
 
     private static boolean shouldForceCompatTinting(Drawable drawable) {
         // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
-        // functionality instead. We also do the same for DrawableContainers since they may
-        // contain GradientDrawable instances.
-        return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer;
+        // functionality instead. We also do the same for DrawableContainers and DrawableWrappers
+        // since they may contain GradientDrawable instances.
+        return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer
+                || drawable instanceof InsetDrawable;
     }
 }
diff --git a/v4/api21/android/support/v4/view/ViewCompatLollipop.java b/v4/api21/android/support/v4/view/ViewCompatLollipop.java
index 09b84b3..4984acc 100644
--- a/v4/api21/android/support/v4/view/ViewCompatLollipop.java
+++ b/v4/api21/android/support/v4/view/ViewCompatLollipop.java
@@ -53,17 +53,21 @@
 
     public static void setOnApplyWindowInsetsListener(View view,
             final OnApplyWindowInsetsListener listener) {
-        view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
-            @Override
-            public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
-                // Wrap the framework insets in our wrapper
-                WindowInsetsCompatApi21 insets = new WindowInsetsCompatApi21(windowInsets);
-                // Give the listener a chance to use the wrapped insets
-                insets = (WindowInsetsCompatApi21) listener.onApplyWindowInsets(view, insets);
-                // Return the unwrapped insets
-                return insets.unwrap();
-            }
-        });
+        if (listener == null) {
+            view.setOnApplyWindowInsetsListener(null);
+        } else {
+            view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
+                @Override
+                public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
+                    // Wrap the framework insets in our wrapper
+                    WindowInsetsCompatApi21 insets = new WindowInsetsCompatApi21(windowInsets);
+                    // Give the listener a chance to use the wrapped insets
+                    insets = (WindowInsetsCompatApi21) listener.onApplyWindowInsets(view, insets);
+                    // Return the unwrapped insets
+                    return insets.unwrap();
+                }
+            });
+        }
     }
 
     public static boolean isImportantForAccessibility(View view) {
diff --git a/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java b/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
index 50f2657..e0455bb 100644
--- a/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
+++ b/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
@@ -25,7 +25,10 @@
 
     public static Drawable wrapForTinting(Drawable drawable) {
         // We need to wrap to force an invalidation on any state change
-        return new DrawableWrapperLollipop(drawable);
+        if (!(drawable instanceof DrawableWrapperLollipop)) {
+            return new DrawableWrapperLollipop(drawable);
+        }
+        return drawable;
     }
 
 }
diff --git a/v4/api23/android/support/v4/content/ResourcesCompatApi23.java b/v4/api23/android/support/v4/content/res/ResourcesCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/content/ResourcesCompatApi23.java
rename to v4/api23/android/support/v4/content/res/ResourcesCompatApi23.java
diff --git a/v4/api24/android/support/v4/content/ContextCompatApi24.java b/v4/api24/android/support/v4/content/ContextCompatApi24.java
new file mode 100644
index 0000000..cc48e67
--- /dev/null
+++ b/v4/api24/android/support/v4/content/ContextCompatApi24.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.content;
+
+import android.content.Context;
+
+/** {@hide} */
+public class ContextCompatApi24 {
+    public static Context createDeviceEncryptedStorageContext(Context context) {
+        return context.createDeviceEncryptedStorageContext();
+    }
+
+    public static boolean isDeviceEncryptedStorage(Context context) {
+        return context.isDeviceEncryptedStorage();
+    }
+}
diff --git a/v4/api24/android/support/v4/net/TrafficStatsCompatApi24.java b/v4/api24/android/support/v4/net/TrafficStatsCompatApi24.java
new file mode 100644
index 0000000..f525dea
--- /dev/null
+++ b/v4/api24/android/support/v4/net/TrafficStatsCompatApi24.java
@@ -0,0 +1,33 @@
+/*
+ * 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.net;
+
+import android.net.TrafficStats;
+
+import java.net.DatagramSocket;
+import java.net.SocketException;
+
+/** {@hide} */
+public class TrafficStatsCompatApi24 {
+    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+        TrafficStats.tagDatagramSocket(socket);
+    }
+
+    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+        TrafficStats.untagDatagramSocket(socket);
+    }
+}
diff --git a/v4/api24/android/support/v4/os/UserManagerCompatApi24.java b/v4/api24/android/support/v4/os/UserManagerCompatApi24.java
new file mode 100644
index 0000000..a72ab30
--- /dev/null
+++ b/v4/api24/android/support/v4/os/UserManagerCompatApi24.java
@@ -0,0 +1,31 @@
+/*
+ * 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.os;
+
+import android.content.Context;
+import android.os.UserManager;
+
+/** {@hide} */
+public class UserManagerCompatApi24 {
+    public static boolean isUserRunningAndLocked(Context context) {
+        return context.getSystemService(UserManager.class).isUserRunningAndLocked();
+    }
+
+    public static boolean isUserRunningAndUnlocked(Context context) {
+        return context.getSystemService(UserManager.class).isUserRunningAndUnlocked();
+    }
+}
diff --git a/v4/build.gradle b/v4/build.gradle
index ba65cab..82b6b16 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -30,8 +30,8 @@
 def api20SS        = createApiSourceset('api20',        'api20',         '20',      kitkatSS)
 def api21SS        = createApiSourceset('api21',        'api21',         '21',      api20SS)
 def api22SS        = createApiSourceset('api22',        'api22',         '22',      api21SS)
-def api23SS        = createApiSourceset('api23',        'api23',         'current', api22SS)
-
+def api23SS        = createApiSourceset('api23',        'api23',         '23',      api22SS)
+def api24SS        = createApiSourceset('api24',        'api24',         'current', api23SS)
 
 def createApiSourceset(String name, String folder, String apiLevel, SourceSet previousSource) {
     def sourceSet = sourceSets.create(name)
@@ -104,6 +104,7 @@
 
     testOptions {
         unitTests.returnDefaultValues = true
+        compileSdkVersion 'current'
     }
 }
 
diff --git a/v4/donut/android/support/v4/app/NotificationCompatBase.java b/v4/donut/android/support/v4/app/NotificationCompatBase.java
index 777a57f..7324f26 100644
--- a/v4/donut/android/support/v4/app/NotificationCompatBase.java
+++ b/v4/donut/android/support/v4/app/NotificationCompatBase.java
@@ -16,7 +16,9 @@
 
 package android.support.v4.app;
 
+import android.app.Notification;
 import android.app.PendingIntent;
+import android.content.Context;
 import android.os.Bundle;
 
 /**
@@ -54,4 +56,10 @@
                     String[] participants, long latestTimestamp);
         }
     }
+
+    public static Notification add(Notification notification, Context context,
+            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {
+        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+        return notification;
+    }
 }
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
index 300e2e8..f742c15 100644
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
+++ b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
@@ -54,7 +54,9 @@
 
     @Override
     protected void onBoundsChange(Rect bounds) {
-        mDrawable.setBounds(bounds);
+        if (mDrawable != null) {
+            mDrawable.setBounds(bounds);
+        }
     }
 
     @Override
diff --git a/v4/ics/android/support/v4/net/DatagramSocketWrapper.java b/v4/ics/android/support/v4/net/DatagramSocketWrapper.java
new file mode 100644
index 0000000..87dfc00
--- /dev/null
+++ b/v4/ics/android/support/v4/net/DatagramSocketWrapper.java
@@ -0,0 +1,117 @@
+/*
+ * 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.net;
+
+import android.os.ParcelFileDescriptor;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.net.SocketImpl;
+
+/** {@hide} */
+class DatagramSocketWrapper extends Socket {
+    public DatagramSocketWrapper(DatagramSocket socket) throws SocketException {
+        super(new DatagramSocketImplWrapper(socket));
+    }
+
+    /**
+     * Empty implementation which can expose a fd.
+     */
+    private static class DatagramSocketImplWrapper extends SocketImpl {
+        public DatagramSocketImplWrapper(DatagramSocket socket) throws SocketException {
+            super();
+            localport = socket.getLocalPort();
+            fd = ParcelFileDescriptor.fromDatagramSocket(socket).getFileDescriptor();
+        }
+
+        @Override
+        protected void accept(SocketImpl newSocket) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected int available() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void bind(InetAddress address, int port) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void close() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void connect(String host, int port) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void connect(InetAddress address, int port) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void create(boolean isStreaming) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected InputStream getInputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected OutputStream getOutputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void listen(int backlog) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void connect(SocketAddress remoteAddr, int timeout) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected void sendUrgentData(int value) throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Object getOption(int optID) throws SocketException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setOption(int optID, Object val) throws SocketException {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java b/v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java
index 0f63fce..4d2b600 100644
--- a/v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java
+++ b/v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java
@@ -18,6 +18,7 @@
 
 import android.net.TrafficStats;
 
+import java.net.DatagramSocket;
 import java.net.Socket;
 import java.net.SocketException;
 
@@ -52,4 +53,12 @@
     public static void untagSocket(Socket socket) throws SocketException {
         TrafficStats.untagSocket(socket);
     }
+
+    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+        TrafficStats.tagSocket(new DatagramSocketWrapper(socket));
+    }
+
+    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+        TrafficStats.untagSocket(new DatagramSocketWrapper(socket));
+    }
 }
diff --git a/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
index abd208b..3de3631 100644
--- a/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ b/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -26,7 +26,7 @@
  * Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class AccessibilityServiceInfoCompat {
+public final class AccessibilityServiceInfoCompat {
 
     static interface AccessibilityServiceInfoVersionImpl {
         public String getId(AccessibilityServiceInfo info);
@@ -277,9 +277,7 @@
     /*
      * Hide constructor
      */
-    private AccessibilityServiceInfoCompat() {
-
-    }
+    private AccessibilityServiceInfoCompat() {}
 
     /**
      * The accessibility service id.
diff --git a/v4/java/android/support/v4/app/ActivityCompat.java b/v4/java/android/support/v4/app/ActivityCompat.java
index 0926d49..4e699d4 100644
--- a/v4/java/android/support/v4/app/ActivityCompat.java
+++ b/v4/java/android/support/v4/app/ActivityCompat.java
@@ -300,6 +300,12 @@
      * When checking whether you have a permission you should use {@link
      * #checkSelfPermission(android.content.Context, String)}.
      * </p>
+     * <p>
+     * Calling this API for permissions already granted to your app would show UI
+     * to the user to decided whether the app can still hold these permissions. This
+     * can be useful if the way your app uses the data guarded by the permissions
+     * changes significantly.
+     * </p>
      *
      * @param activity The target activity.
      * @param permissions The requested permissions.
diff --git a/v4/java/android/support/v4/app/ActivityManagerCompat.java b/v4/java/android/support/v4/app/ActivityManagerCompat.java
index ff5c180..53d8703 100644
--- a/v4/java/android/support/v4/app/ActivityManagerCompat.java
+++ b/v4/java/android/support/v4/app/ActivityManagerCompat.java
@@ -25,8 +25,8 @@
  * introduced after API level 4 in a backwards compatible fashion.
  */
 public final class ActivityManagerCompat {
-    private ActivityManagerCompat() {
-    }
+
+    private ActivityManagerCompat() {}
 
     /**
      * Returns true if this is a low-RAM device.  Exactly whether a device is low-RAM
diff --git a/v4/java/android/support/v4/app/AppOpsManagerCompat.java b/v4/java/android/support/v4/app/AppOpsManagerCompat.java
index 6ec0fe4..c0058a9 100644
--- a/v4/java/android/support/v4/app/AppOpsManagerCompat.java
+++ b/v4/java/android/support/v4/app/AppOpsManagerCompat.java
@@ -24,7 +24,7 @@
  * Helper for accessing features in android.app.AppOpsManager
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class AppOpsManagerCompat {
+public final class AppOpsManagerCompat {
 
     /**
      * Result from {@link #noteOp}: the given caller is allowed to
@@ -87,6 +87,8 @@
         }
     }
 
+    private AppOpsManagerCompat() {}
+
     /**
      * Gets the app op name associated with a given permission.
      *
diff --git a/v4/java/android/support/v4/app/BackStackRecord.java b/v4/java/android/support/v4/app/BackStackRecord.java
index 24cf866..88f7655 100644
--- a/v4/java/android/support/v4/app/BackStackRecord.java
+++ b/v4/java/android/support/v4/app/BackStackRecord.java
@@ -742,21 +742,33 @@
         }
     }
 
-    private static void setFirstOut(SparseArray<Fragment> fragments, Fragment fragment) {
+    private static void setFirstOut(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments, Fragment fragment) {
         if (fragment != null) {
             int containerId = fragment.mContainerId;
-            if (containerId != 0 && !fragment.isHidden() && fragment.isAdded() &&
-                    fragment.getView() != null && fragments.get(containerId) == null) {
-                fragments.put(containerId, fragment);
+            if (containerId != 0 && !fragment.isHidden()) {
+                if (fragment.isAdded() && fragment.getView() != null
+                        && firstOutFragments.get(containerId) == null) {
+                    firstOutFragments.put(containerId, fragment);
+                }
+                if (lastInFragments.get(containerId) == fragment) {
+                    lastInFragments.remove(containerId);
+                }
             }
         }
     }
 
-    private void setLastIn(SparseArray<Fragment> fragments, Fragment fragment) {
+    private void setLastIn(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments, Fragment fragment) {
         if (fragment != null) {
             int containerId = fragment.mContainerId;
             if (containerId != 0) {
-                fragments.put(containerId, fragment);
+                if (!fragment.isAdded()) {
+                    lastInFragments.put(containerId, fragment);
+                }
+                if (firstOutFragments.get(containerId) == fragment) {
+                    firstOutFragments.remove(containerId);
+                }
             }
         }
     }
@@ -779,7 +791,7 @@
         while (op != null) {
             switch (op.cmd) {
                 case OP_ADD:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_REPLACE: {
                     Fragment f = op.fragment;
@@ -789,29 +801,30 @@
                             if (f == null || old.mContainerId == f.mContainerId) {
                                 if (old == f) {
                                     f = null;
+                                    lastInFragments.remove(old.mContainerId);
                                 } else {
-                                    setFirstOut(firstOutFragments, old);
+                                    setFirstOut(firstOutFragments, lastInFragments, old);
                                 }
                             }
                         }
                     }
-                    setLastIn(lastInFragments, f);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 }
                 case OP_REMOVE:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_HIDE:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_SHOW:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_DETACH:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_ATTACH:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
             }
 
@@ -833,38 +846,38 @@
         if (!mManager.mContainer.onHasView()) {
             return; // nothing to see, so no transitions
         }
-        Op op = mHead;
+        Op op = mTail;
         while (op != null) {
             switch (op.cmd) {
                 case OP_ADD:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_REPLACE:
                     if (op.removed != null) {
                         for (int i = op.removed.size() - 1; i >= 0; i--) {
-                            setLastIn(lastInFragments, op.removed.get(i));
+                            setLastIn(firstOutFragments, lastInFragments, op.removed.get(i));
                         }
                     }
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_REMOVE:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_HIDE:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_SHOW:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_DETACH:
-                    setLastIn(lastInFragments, op.fragment);
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
                     break;
                 case OP_ATTACH:
-                    setFirstOut(firstOutFragments, op.fragment);
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
                     break;
             }
 
-            op = op.next;
+            op = op.prev;
         }
     }
 
@@ -1016,6 +1029,7 @@
      */
     private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments,
             SparseArray<Fragment> lastInFragments, boolean isBack) {
+        ensureFragmentsAreInitialized(lastInFragments);
         TransitionState state = new TransitionState();
 
         // Adding a non-existent target view makes sure that the transitions don't target
@@ -1050,6 +1064,21 @@
         return state;
     }
 
+    /**
+     * Ensure that fragments that are entering are at least at the CREATED state
+     * so that they may load Transitions using TransitionInflater.
+     */
+    private void ensureFragmentsAreInitialized(SparseArray<Fragment> lastInFragments) {
+        final int count = lastInFragments.size();
+        for (int i = 0; i < count; i++) {
+            final Fragment fragment = lastInFragments.valueAt(i);
+            if (fragment.mState < Fragment.CREATED) {
+                mManager.makeActive(fragment);
+                mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
+            }
+        }
+    }
+
     private static Object getEnterTransition(Fragment inFragment, boolean isBack) {
         if (inFragment == null) {
             return null;
@@ -1158,7 +1187,8 @@
                     callback.onSharedElementStart(names, views, null);
                 }
                 prepareSharedElementTransition(state, sceneRoot, sharedElementTransition,
-                        inFragment, outFragment, isBack, sharedElementTargets);
+                        inFragment, outFragment, isBack, sharedElementTargets, enterTransition,
+                        exitTransition);
             }
         }
         if (enterTransition == null && sharedElementTransition == null &&
@@ -1205,9 +1235,9 @@
 
         if (transition != null) {
             FragmentTransitionCompat21.addTransitionTargets(enterTransition,
-                    sharedElementTransition, sceneRoot, viewRetriever, state.nonExistentView,
-                    state.enteringEpicenterView, state.nameOverrides, enteringViews,
-                    namedViews, renamedViews, sharedElementTargets);
+                    sharedElementTransition, exitTransition, sceneRoot, viewRetriever,
+                    state.nonExistentView, state.enteringEpicenterView, state.nameOverrides,
+                    enteringViews, exitingViews, namedViews, renamedViews, sharedElementTargets);
             excludeHiddenFragmentsAfterEnter(sceneRoot, state, containerId, transition);
 
             // We want to exclude hidden views later, so we need a non-null list in the
@@ -1229,16 +1259,22 @@
     private void prepareSharedElementTransition(final TransitionState state, final View sceneRoot,
             final Object sharedElementTransition, final Fragment inFragment,
             final Fragment outFragment, final boolean isBack,
-            final ArrayList<View> sharedElementTargets) {
-        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
-                new ViewTreeObserver.OnPreDrawListener() {
-            @Override
-            public boolean onPreDraw() {
-                sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+            final ArrayList<View> sharedElementTargets, final Object enterTransition,
+            final Object exitTransition) {
+        if (sharedElementTransition != null) {
+            sceneRoot.getViewTreeObserver().addOnPreDrawListener(
+                    new ViewTreeObserver.OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
 
-                if (sharedElementTransition != null) {
+                    // Remove the exclude for the shared elements from the exiting fragment.
                     FragmentTransitionCompat21.removeTargets(sharedElementTransition,
                             sharedElementTargets);
+                    // keep the nonExistentView as excluded so the list doesn't get emptied
+                    sharedElementTargets.remove(state.nonExistentView);
+                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
+                            exitTransition, sharedElementTransition, sharedElementTargets, false);
                     sharedElementTargets.clear();
 
                     ArrayMap<String, View> namedViews = mapSharedElementsIn(
@@ -1250,11 +1286,14 @@
 
                     callSharedElementEnd(state, inFragment, outFragment, isBack,
                             namedViews);
-                }
 
-                return true;
-            }
-        });
+                    // Exclude the shared elements from the entering fragment.
+                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
+                            exitTransition, sharedElementTransition, sharedElementTargets, true);
+                    return true;
+                }
+            });
+        }
     }
 
     private void callSharedElementEnd(TransitionState state, Fragment inFragment,
diff --git a/v4/java/android/support/v4/app/BundleCompat.java b/v4/java/android/support/v4/app/BundleCompat.java
index b17ddcc..9c54e0c 100644
--- a/v4/java/android/support/v4/app/BundleCompat.java
+++ b/v4/java/android/support/v4/app/BundleCompat.java
@@ -24,7 +24,10 @@
  * Helper for accessing features in {@link Bundle}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class BundleCompat {
+public final class BundleCompat {
+
+    private BundleCompat() {}
+
     /**
      * A convenience method to handle getting an {@link IBinder} inside a {@link Bundle} for all
      * Android versions.
diff --git a/v4/java/android/support/v4/app/Fragment.java b/v4/java/android/support/v4/app/Fragment.java
index 48fc495..a5013c6 100644
--- a/v4/java/android/support/v4/app/Fragment.java
+++ b/v4/java/android/support/v4/app/Fragment.java
@@ -59,6 +59,7 @@
     final boolean mRetainInstance;
     final boolean mDetached;
     final Bundle mArguments;
+    final boolean mHidden;
     
     Bundle mSavedFragmentState;
     
@@ -74,6 +75,7 @@
         mRetainInstance = frag.mRetainInstance;
         mDetached = frag.mDetached;
         mArguments = frag.mArguments;
+        mHidden = frag.mHidden;
     }
     
     public FragmentState(Parcel in) {
@@ -86,6 +88,7 @@
         mRetainInstance = in.readInt() != 0;
         mDetached = in.readInt() != 0;
         mArguments = in.readBundle();
+        mHidden = in.readInt() != 0;
         mSavedFragmentState = in.readBundle();
     }
 
@@ -113,6 +116,7 @@
         mInstance.mTag = mTag;
         mInstance.mRetainInstance = mRetainInstance;
         mInstance.mDetached = mDetached;
+        mInstance.mHidden = mHidden;
         mInstance.mFragmentManager = host.mFragmentManager;
 
         if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
@@ -135,6 +139,7 @@
         dest.writeInt(mRetainInstance ? 1 : 0);
         dest.writeInt(mDetached ? 1 : 0);
         dest.writeBundle(mArguments);
+        dest.writeInt(mHidden? 1 : 0);
         dest.writeBundle(mSavedFragmentState);
     }
     
@@ -981,6 +986,12 @@
      * android.content.Context#checkSelfPermission(String)}.
      * </p>
      * <p>
+     * Calling this API for permissions already granted to your app would show UI
+     * to the user to decided whether the app can still hold these permissions. This
+     * can be useful if the way your app uses the data guarded by the permissions
+     * changes significantly.
+     * </p>
+     * <p>
      * A sample permissions request looks like this:
      * </p>
      * <code><pre><p>
diff --git a/v4/java/android/support/v4/app/FragmentTransaction.java b/v4/java/android/support/v4/app/FragmentTransaction.java
index 48f2088..b128efc 100644
--- a/v4/java/android/support/v4/app/FragmentTransaction.java
+++ b/v4/java/android/support/v4/app/FragmentTransaction.java
@@ -162,7 +162,7 @@
     public static final int TRANSIT_EXIT_MASK = 0x2000;
 
     /** @hide */
-    @IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE})
+    @IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE, TRANSIT_FRAGMENT_FADE})
     @Retention(RetentionPolicy.SOURCE)
     private @interface Transit {}
 
@@ -212,7 +212,7 @@
     /**
      * Select a standard transition animation for this transaction.  May be
      * one of {@link #TRANSIT_NONE}, {@link #TRANSIT_FRAGMENT_OPEN},
-     * or {@link #TRANSIT_FRAGMENT_CLOSE}
+     * {@link #TRANSIT_FRAGMENT_CLOSE}, or {@link #TRANSIT_FRAGMENT_FADE}.
      */
     public abstract FragmentTransaction setTransition(@Transit int transit);
 
diff --git a/v4/java/android/support/v4/app/NavUtils.java b/v4/java/android/support/v4/app/NavUtils.java
index 682aaaf..f9661a7 100644
--- a/v4/java/android/support/v4/app/NavUtils.java
+++ b/v4/java/android/support/v4/app/NavUtils.java
@@ -35,7 +35,7 @@
  * from the developer guide and <a href="{@docRoot}design/patterns/navigation.html">Navigation</a>
  * from the design guide.
  */
-public class NavUtils {
+public final class NavUtils {
     private static final String TAG = "NavUtils";
     public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
 
diff --git a/v4/java/android/support/v4/app/NotificationCompat.java b/v4/java/android/support/v4/app/NotificationCompat.java
index e23c11c..35e7d30 100644
--- a/v4/java/android/support/v4/app/NotificationCompat.java
+++ b/v4/java/android/support/v4/app/NotificationCompat.java
@@ -476,8 +476,8 @@
         @Override
         public Notification build(Builder b, BuilderExtender extender) {
             Notification result = b.mNotification;
-            result.setLatestEventInfo(b.mContext, b.mContentTitle,
-                    b.mContentText, b.mContentIntent);
+            result = NotificationCompatBase.add(result, b.mContext,
+                    b.mContentTitle, b.mContentText, b.mContentIntent);
             // translate high priority requests into legacy flag
             if (b.mPriority > PRIORITY_DEFAULT) {
                 result.flags |= FLAG_HIGH_PRIORITY;
@@ -553,8 +553,6 @@
         @Override
         public Notification build(Builder b, BuilderExtender extender) {
             Notification result = b.mNotification;
-            result.setLatestEventInfo(b.mContext, b.mContentTitle,
-                    b.mContentText, b.mContentIntent);
             result = NotificationCompatGingerbread.add(result, b.mContext,
                     b.mContentTitle, b.mContentText, b.mContentIntent, b.mFullScreenIntent);
             // translate high priority requests into legacy flag
diff --git a/v4/java/android/support/v4/app/NotificationManagerCompat.java b/v4/java/android/support/v4/app/NotificationManagerCompat.java
index a848007..e2b6fc9 100644
--- a/v4/java/android/support/v4/app/NotificationManagerCompat.java
+++ b/v4/java/android/support/v4/app/NotificationManagerCompat.java
@@ -51,7 +51,7 @@
  * {@link NotificationManagerCompat} object, and then call one of its
  * methods to post or cancel notifications.
  */
-public class NotificationManagerCompat {
+public final class NotificationManagerCompat {
     private static final String TAG = "NotifManCompat";
 
     /**
diff --git a/v4/java/android/support/v4/app/RemoteInput.java b/v4/java/android/support/v4/app/RemoteInput.java
index 38ecad0..eb389d6 100644
--- a/v4/java/android/support/v4/app/RemoteInput.java
+++ b/v4/java/android/support/v4/app/RemoteInput.java
@@ -25,7 +25,7 @@
  * Helper for using the {@link android.app.RemoteInput} API
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class RemoteInput extends RemoteInputCompatBase.RemoteInput {
+public final class RemoteInput extends RemoteInputCompatBase.RemoteInput {
     private static final String TAG = "RemoteInput";
 
     /** Label used to denote the clip data type used for remote input transport */
@@ -40,7 +40,7 @@
     private final boolean mAllowFreeFormInput;
     private final Bundle mExtras;
 
-    RemoteInput(String resultKey, CharSequence label, CharSequence[] choices,
+    private RemoteInput(String resultKey, CharSequence label, CharSequence[] choices,
             boolean allowFreeFormInput, Bundle extras) {
         this.mResultKey = resultKey;
         this.mLabel = label;
diff --git a/v4/java/android/support/v4/app/ServiceCompat.java b/v4/java/android/support/v4/app/ServiceCompat.java
index f644501..491fa3b 100644
--- a/v4/java/android/support/v4/app/ServiceCompat.java
+++ b/v4/java/android/support/v4/app/ServiceCompat.java
@@ -20,7 +20,7 @@
  * Helper for accessing features in {@link android.app.Service}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ServiceCompat {
+public final class ServiceCompat {
 
     private ServiceCompat() {
         /* Hide constructor */
diff --git a/v4/java/android/support/v4/app/ShareCompat.java b/v4/java/android/support/v4/app/ShareCompat.java
index 87ebc49..95fb99f 100644
--- a/v4/java/android/support/v4/app/ShareCompat.java
+++ b/v4/java/android/support/v4/app/ShareCompat.java
@@ -56,7 +56,7 @@
  * Social apps that enable sharing content are encouraged to use this information
  * to call out the app that the content was shared from.
  */
-public class ShareCompat {
+public final class ShareCompat {
     /**
      * Intent extra that stores the name of the calling package for an ACTION_SEND intent.
      * When an activity is started using startActivityForResult this is redundant info.
@@ -158,6 +158,8 @@
         }
     }
 
+    private ShareCompat() {}
+
     /**
      * Retrieve the name of the package that launched calledActivity from a share intent.
      * Apps that provide social sharing functionality can use this to provide attribution
diff --git a/v4/java/android/support/v4/app/TaskStackBuilder.java b/v4/java/android/support/v4/app/TaskStackBuilder.java
index 9146872..17197bb 100644
--- a/v4/java/android/support/v4/app/TaskStackBuilder.java
+++ b/v4/java/android/support/v4/app/TaskStackBuilder.java
@@ -66,7 +66,7 @@
  * from the design guide.
  * </div>
  */
-public class TaskStackBuilder implements Iterable<Intent> {
+public final class TaskStackBuilder implements Iterable<Intent> {
     private static final String TAG = "TaskStackBuilder";
 
     public interface SupportParentable {
diff --git a/v4/java/android/support/v4/content/ContentResolverCompat.java b/v4/java/android/support/v4/content/ContentResolverCompat.java
index 3c7f4de..7efe79e 100644
--- a/v4/java/android/support/v4/content/ContentResolverCompat.java
+++ b/v4/java/android/support/v4/content/ContentResolverCompat.java
@@ -27,7 +27,7 @@
  * Helper for accessing features in {@link android.content.ContentResolver}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ContentResolverCompat {
+public final class ContentResolverCompat {
     interface ContentResolverCompatImpl {
         Cursor query(ContentResolver resolver,
                 Uri uri, String[] projection, String selection, String[] selectionArgs,
diff --git a/v4/java/android/support/v4/content/ContextCompat.java b/v4/java/android/support/v4/content/ContextCompat.java
index 29629e7..293065b 100644
--- a/v4/java/android/support/v4/content/ContextCompat.java
+++ b/v4/java/android/support/v4/content/ContextCompat.java
@@ -451,4 +451,46 @@
         }
         return file;
     }
+
+    /**
+     * Return a new Context object for the current Context but whose storage
+     * APIs are backed by device-encrypted storage.
+     * <p>
+     * Data stored in device-encrypted storage is typically encrypted with a key
+     * tied to the physical device, and it can be accessed when the device has
+     * booted successfully, both <em>before and after</em> the user has
+     * authenticated with their credentials (such as a lock pattern or PIN).
+     * Because device-encrypted data is available before user authentication,
+     * you should carefully consider what data you store using this Context.
+     * <p>
+     * Each call to this method returns a new instance of a Context object;
+     * Context objects are not shared, however common state (ClassLoader, other
+     * Resources for the same configuration) may be so the Context itself can be
+     * fairly lightweight.
+     *
+     * @return new Context or {@code null} if device-encrypted storage is not
+     *         supported or available on this device.
+     * @see ContextCompat#isDeviceEncryptedStorage(Context)
+     */
+    public static Context createDeviceEncryptedStorageContext(Context context) {
+        if ("N".equals(Build.VERSION.CODENAME)) {
+            return ContextCompatApi24.createDeviceEncryptedStorageContext(context);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Indicates if the storage APIs of this Context are backed by
+     * device-encrypted storage.
+     *
+     * @see ContextCompat#createDeviceEncryptedStorageContext(Context)
+     */
+    public static boolean isDeviceEncryptedStorage(Context context) {
+        if ("N".equals(Build.VERSION.CODENAME)) {
+            return ContextCompatApi24.isDeviceEncryptedStorage(context);
+        } else {
+            return false;
+        }
+    }
 }
diff --git a/v4/java/android/support/v4/content/FileProvider.java b/v4/java/android/support/v4/content/FileProvider.java
index 515ce1c..9d6d803 100644
--- a/v4/java/android/support/v4/content/FileProvider.java
+++ b/v4/java/android/support/v4/content/FileProvider.java
@@ -365,7 +365,7 @@
      *
      * @param context A {@link Context} for the current component.
      * @param authority The authority of a {@link FileProvider} defined in a
-     *            {@code &lt;provider&gt;} element in your app's manifest.
+     *            {@code <provider>} element in your app's manifest.
      * @param file A {@link File} pointing to the filename for which you want a
      * <code>content</code> {@link Uri}.
      * @return A content URI for the file.
@@ -547,7 +547,7 @@
 
     /**
      * Parse and return {@link PathStrategy} for given authority as defined in
-     * {@link #META_DATA_FILE_PROVIDER_PATHS} {@code &lt;meta-data>}.
+     * {@link #META_DATA_FILE_PROVIDER_PATHS} {@code <meta-data>}.
      *
      * @see #getPathStrategy(Context, String)
      */
diff --git a/v4/java/android/support/v4/content/IntentCompat.java b/v4/java/android/support/v4/content/IntentCompat.java
index 11d3334..97489cd 100644
--- a/v4/java/android/support/v4/content/IntentCompat.java
+++ b/v4/java/android/support/v4/content/IntentCompat.java
@@ -25,7 +25,7 @@
  * Helper for accessing features in {@link android.content.Intent}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class IntentCompat {
+public final class IntentCompat {
 
     interface IntentCompatImpl {
         Intent makeMainActivity(ComponentName componentName);
diff --git a/v4/java/android/support/v4/content/LocalBroadcastManager.java b/v4/java/android/support/v4/content/LocalBroadcastManager.java
index 7a7c50f..299bc8e 100644
--- a/v4/java/android/support/v4/content/LocalBroadcastManager.java
+++ b/v4/java/android/support/v4/content/LocalBroadcastManager.java
@@ -43,7 +43,7 @@
  * system.
  * </ul>
  */
-public class LocalBroadcastManager {
+public final class LocalBroadcastManager {
     private static class ReceiverRecord {
         final IntentFilter filter;
         final BroadcastReceiver receiver;
diff --git a/v4/java/android/support/v4/content/ParallelExecutorCompat.java b/v4/java/android/support/v4/content/ParallelExecutorCompat.java
index c23470b..20ef3d5 100644
--- a/v4/java/android/support/v4/content/ParallelExecutorCompat.java
+++ b/v4/java/android/support/v4/content/ParallelExecutorCompat.java
@@ -24,7 +24,7 @@
  * Helper for accessing a shared parallel Executor instance
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ParallelExecutorCompat {
+public final class ParallelExecutorCompat {
     public static Executor getParallelExecutor() {
         if (Build.VERSION.SDK_INT >= 11) {
             // From API 11 onwards, return AsyncTask.THREAD_POOL_EXECUTOR
@@ -33,4 +33,6 @@
             return ModernAsyncTask.THREAD_POOL_EXECUTOR;
         }
     }
+
+    private ParallelExecutorCompat() {}
 }
diff --git a/v4/java/android/support/v4/content/SharedPreferencesCompat.java b/v4/java/android/support/v4/content/SharedPreferencesCompat.java
index dca99a8..da5f1fb 100644
--- a/v4/java/android/support/v4/content/SharedPreferencesCompat.java
+++ b/v4/java/android/support/v4/content/SharedPreferencesCompat.java
@@ -20,9 +20,9 @@
 import android.os.Build;
 import android.support.annotation.NonNull;
 
-public class SharedPreferencesCompat {
+public final class SharedPreferencesCompat {
 
-    public static class EditorCompat {
+    public final static class EditorCompat {
 
         private static EditorCompat sInstance;
 
@@ -68,4 +68,6 @@
         }
     }
 
+    private SharedPreferencesCompat() {}
+
 }
diff --git a/v4/java/android/support/v4/content/pm/ActivityInfoCompat.java b/v4/java/android/support/v4/content/pm/ActivityInfoCompat.java
index 5c27923..4014404 100644
--- a/v4/java/android/support/v4/content/pm/ActivityInfoCompat.java
+++ b/v4/java/android/support/v4/content/pm/ActivityInfoCompat.java
@@ -20,7 +20,7 @@
  * Helper for accessing features in {@link android.content.pm.ActivityInfo}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ActivityInfoCompat {
+public final class ActivityInfoCompat {
 
     private ActivityInfoCompat() {
         /* Hide constructor */
diff --git a/v4/java/android/support/v4/content/res/ResourcesCompat.java b/v4/java/android/support/v4/content/res/ResourcesCompat.java
index ce5f658..0f4b800 100644
--- a/v4/java/android/support/v4/content/res/ResourcesCompat.java
+++ b/v4/java/android/support/v4/content/res/ResourcesCompat.java
@@ -33,7 +33,7 @@
  * Helper for accessing features in {@link android.content.res.Resources}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ResourcesCompat {
+public final class ResourcesCompat {
     /**
      * Return a drawable object associated with a particular resource ID and
      * styled for the specified theme. Various types of objects will be
@@ -155,4 +155,6 @@
             return res.getColorStateList(id);
         }
     }
+
+    private ResourcesCompat() {}
 }
diff --git a/v4/java/android/support/v4/content/res/TypedArrayUtils.java b/v4/java/android/support/v4/content/res/TypedArrayUtils.java
index 79e4ac8..0cc5885 100644
--- a/v4/java/android/support/v4/content/res/TypedArrayUtils.java
+++ b/v4/java/android/support/v4/content/res/TypedArrayUtils.java
@@ -15,10 +15,12 @@
  */
 package android.support.v4.content.res;
 
+import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.AnyRes;
 import android.support.annotation.StyleableRes;
+import android.util.TypedValue;
 
 /**
  * Compat methods for accessing TypedArray values.
@@ -70,4 +72,13 @@
         }
         return val;
     }
+
+    public static int getAttr(Context context, int attr, int fallbackAttr) {
+        TypedValue value = new TypedValue();
+        context.getTheme().resolveAttribute(attr, value, true);
+        if (value.resourceId != 0) {
+            return attr;
+        }
+        return fallbackAttr;
+    }
 }
diff --git a/v4/java/android/support/v4/database/DatabaseUtilsCompat.java b/v4/java/android/support/v4/database/DatabaseUtilsCompat.java
index 9a825e8..dd53ced 100644
--- a/v4/java/android/support/v4/database/DatabaseUtilsCompat.java
+++ b/v4/java/android/support/v4/database/DatabaseUtilsCompat.java
@@ -22,7 +22,7 @@
  * Helper for accessing features in {@link android.database.DatabaseUtils}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class DatabaseUtilsCompat {
+public final class DatabaseUtilsCompat {
 
     private DatabaseUtilsCompat() {
         /* Hide constructor */
diff --git a/v4/java/android/support/v4/graphics/BitmapCompat.java b/v4/java/android/support/v4/graphics/BitmapCompat.java
index 5b1cb68..b01c4f5 100644
--- a/v4/java/android/support/v4/graphics/BitmapCompat.java
+++ b/v4/java/android/support/v4/graphics/BitmapCompat.java
@@ -21,7 +21,7 @@
  * Helper for accessing features in {@link android.graphics.Bitmap}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class BitmapCompat {
+public final class BitmapCompat {
     /**
      * Interface for the full API.
      */
@@ -108,4 +108,6 @@
     public static int getAllocationByteCount(Bitmap bitmap) {
         return IMPL.getAllocationByteCount(bitmap);
     }
+
+    private BitmapCompat() {}
 }
\ No newline at end of file
diff --git a/v4/java/android/support/v4/graphics/ColorUtils.java b/v4/java/android/support/v4/graphics/ColorUtils.java
index 4d9d9b2..7fef657 100644
--- a/v4/java/android/support/v4/graphics/ColorUtils.java
+++ b/v4/java/android/support/v4/graphics/ColorUtils.java
@@ -25,7 +25,7 @@
 /**
  * A set of color-related utility methods, building upon those available in {@code Color}.
  */
-public class ColorUtils {
+public final class ColorUtils {
 
     private static final int MIN_ALPHA_SEARCH_MAX_ITERATIONS = 10;
     private static final int MIN_ALPHA_SEARCH_PRECISION = 1;
diff --git a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java b/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
index 64ae075..97545ef 100644
--- a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
+++ b/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
@@ -19,13 +19,16 @@
 import android.content.res.ColorStateList;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.view.ViewCompat;
 
 /**
  * Helper for accessing features in {@link android.graphics.drawable.Drawable}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class DrawableCompat {
+public final class DrawableCompat {
     /**
      * Interface for the full API.
      */
@@ -238,7 +241,7 @@
      *
      * @param drawable The Drawable against which to invoke the method.
      */
-    public static void jumpToCurrentState(Drawable drawable) {
+    public static void jumpToCurrentState(@NonNull Drawable drawable) {
         IMPL.jumpToCurrentState(drawable);
     }
 
@@ -254,7 +257,7 @@
      * @param mirrored Set to true if the Drawable should be mirrored, false if
      *            not.
      */
-    public static void setAutoMirrored(Drawable drawable, boolean mirrored) {
+    public static void setAutoMirrored(@NonNull Drawable drawable, boolean mirrored) {
         IMPL.setAutoMirrored(drawable, mirrored);
     }
 
@@ -269,7 +272,7 @@
      * @return boolean Returns true if this Drawable will be automatically
      *         mirrored.
      */
-    public static boolean isAutoMirrored(Drawable drawable) {
+    public static boolean isAutoMirrored(@NonNull Drawable drawable) {
         return IMPL.isAutoMirrored(drawable);
     }
 
@@ -280,7 +283,7 @@
      * @param x The X coordinate of the center of the hotspot
      * @param y The Y coordinate of the center of the hotspot
      */
-    public static void setHotspot(Drawable drawable, float x, float y) {
+    public static void setHotspot(@NonNull Drawable drawable, float x, float y) {
         IMPL.setHotspot(drawable, x, y);
     }
 
@@ -290,7 +293,7 @@
      *
      * @param drawable The Drawable against which to invoke the method.
      */
-    public static void setHotspotBounds(Drawable drawable, int left, int top,
+    public static void setHotspotBounds(@NonNull Drawable drawable, int left, int top,
             int right, int bottom) {
         IMPL.setHotspotBounds(drawable, left, top, right, bottom);
     }
@@ -301,7 +304,7 @@
      * @param drawable The Drawable against which to invoke the method.
      * @param tint     Color to use for tinting this drawable
      */
-    public static void setTint(Drawable drawable, int tint) {
+    public static void setTint(@NonNull Drawable drawable, @ColorInt int tint) {
         IMPL.setTint(drawable, tint);
     }
 
@@ -311,7 +314,7 @@
      * @param drawable The Drawable against which to invoke the method.
      * @param tint     Color state list to use for tinting this drawable, or null to clear the tint
      */
-    public static void setTintList(Drawable drawable, ColorStateList tint) {
+    public static void setTintList(@NonNull Drawable drawable, @Nullable ColorStateList tint) {
         IMPL.setTintList(drawable, tint);
     }
 
@@ -321,7 +324,7 @@
      * @param drawable The Drawable against which to invoke the method.
      * @param tintMode A Porter-Duff blending mode
      */
-    public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+    public static void setTintMode(@NonNull Drawable drawable, @Nullable PorterDuff.Mode tintMode) {
         IMPL.setTintMode(drawable, tintMode);
     }
 
@@ -340,7 +343,7 @@
      * @see #setTintMode(Drawable, PorterDuff.Mode)
      * @see #unwrap(Drawable)
      */
-    public static Drawable wrap(Drawable drawable) {
+    public static Drawable wrap(@NonNull Drawable drawable) {
         return IMPL.wrap(drawable);
     }
 
@@ -354,7 +357,7 @@
      *
      * @see #wrap(Drawable)
      */
-    public static <T extends Drawable> T unwrap(Drawable drawable) {
+    public static <T extends Drawable> T unwrap(@NonNull Drawable drawable) {
         if (drawable instanceof DrawableWrapper) {
             return (T) ((DrawableWrapper) drawable).getWrappedDrawable();
         }
@@ -371,7 +374,7 @@
      *                        or {@link ViewCompat#LAYOUT_DIRECTION_RTL}
      * @see #getLayoutDirection(Drawable)
      */
-    public static void setLayoutDirection(Drawable drawable, int layoutDirection) {
+    public static void setLayoutDirection(@NonNull Drawable drawable, int layoutDirection) {
         IMPL.setLayoutDirection(drawable, layoutDirection);
     }
 
@@ -382,7 +385,9 @@
      *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
      * @see #setLayoutDirection(Drawable, int)
      */
-    public static int getLayoutDirection(Drawable drawable) {
+    public static int getLayoutDirection(@NonNull Drawable drawable) {
         return IMPL.getLayoutDirection(drawable);
     }
+
+    private DrawableCompat() {}
 }
diff --git a/v4/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java b/v4/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
index ad1aedc..5efc74b 100644
--- a/v4/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
+++ b/v4/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
@@ -30,7 +30,7 @@
  * Constructs {@link RoundedBitmapDrawable RoundedBitmapDrawable} objects,
  * either from Bitmaps directly, or from streams and files.
  */
-public class RoundedBitmapDrawableFactory {
+public final class RoundedBitmapDrawableFactory {
     private static final String TAG = "RoundedBitmapDrawableFactory";
 
     private static class DefaultRoundedBitmapDrawable extends RoundedBitmapDrawable {
@@ -95,4 +95,6 @@
         return drawable;
     }
 
+    private RoundedBitmapDrawableFactory() {}
+
 }
diff --git a/v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java b/v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
index dc7bb74..10663a2 100644
--- a/v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
+++ b/v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
@@ -34,7 +34,7 @@
  * On platforms before {@link android.os.Build.VERSION_CODES#M}, this class behaves as there would
  * be no fingerprint hardware available.
  */
-public class FingerprintManagerCompat {
+public final class FingerprintManagerCompat {
 
     private Context mContext;
 
diff --git a/v4/java/android/support/v4/media/MediaDescriptionCompat.java b/v4/java/android/support/v4/media/MediaDescriptionCompat.java
index 9d12713..898b264 100644
--- a/v4/java/android/support/v4/media/MediaDescriptionCompat.java
+++ b/v4/java/android/support/v4/media/MediaDescriptionCompat.java
@@ -185,6 +185,7 @@
             dest.writeParcelable(mIcon, flags);
             dest.writeParcelable(mIconUri, flags);
             dest.writeBundle(mExtras);
+            dest.writeParcelable(mMediaUri, flags);
         } else {
             MediaDescriptionCompatApi21.writeToParcel(getMediaDescription(), dest, flags);
         }
diff --git a/v4/java/android/support/v4/media/session/MediaSessionCompat.java b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
index d35ada6..4980a9f 100644
--- a/v4/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -25,6 +25,7 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Bundle;
@@ -1303,8 +1304,42 @@
             }
         }
 
+        /**
+         * Clones the given {@link MediaMetadataCompat}, deep-copying bitmaps in the metadata if
+         * they exist. If there is no bitmap in the metadata, this method just returns the given
+         * metadata.
+         *
+         * @param metadata A {@link MediaMetadataCompat} to be cloned.
+         * @return A newly cloned metadata if it contains bitmaps. Otherwise, the given metadata
+         *         will be returned.
+         */
+        private MediaMetadataCompat cloneMetadataIfNeeded(MediaMetadataCompat metadata) {
+            if (metadata == null) {
+                return null;
+            } else if (!metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ART)
+                    && !metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ALBUM_ART)) {
+                return metadata;
+            }
+            MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(metadata);
+            Bitmap artBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ART);
+            if (artBitmap != null) {
+                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART,
+                        artBitmap.copy(artBitmap.getConfig(), false));
+            }
+            Bitmap albumArtBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART);
+            if (albumArtBitmap != null) {
+                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
+                        albumArtBitmap.copy(albumArtBitmap.getConfig(), false));
+            }
+            return builder.build();
+        }
+
         @Override
         public void setMetadata(MediaMetadataCompat metadata) {
+            if (android.os.Build.VERSION.SDK_INT >= 14 && metadata != null) {
+                // Clone bitmaps in metadata for protecting them to be recycled by RCC.
+                metadata = cloneMetadataIfNeeded(metadata);
+            }
             synchronized (mLock) {
                 mMetadata = metadata;
             }
diff --git a/v4/java/android/support/v4/net/ConnectivityManagerCompat.java b/v4/java/android/support/v4/net/ConnectivityManagerCompat.java
index 14f150a..785a8f3 100644
--- a/v4/java/android/support/v4/net/ConnectivityManagerCompat.java
+++ b/v4/java/android/support/v4/net/ConnectivityManagerCompat.java
@@ -28,7 +28,7 @@
  * Helper for accessing features in {@link ConnectivityManager} introduced after
  * API level 16 in a backwards compatible fashion.
  */
-public class ConnectivityManagerCompat {
+public final class ConnectivityManagerCompat {
 
     interface ConnectivityManagerCompatImpl {
         boolean isActiveNetworkMetered(ConnectivityManager cm);
@@ -118,4 +118,6 @@
             return null;
         }
     }
+
+    private ConnectivityManagerCompat() {}
 }
diff --git a/v4/java/android/support/v4/net/TrafficStatsCompat.java b/v4/java/android/support/v4/net/TrafficStatsCompat.java
index cfc5c0d..57b8a7e 100644
--- a/v4/java/android/support/v4/net/TrafficStatsCompat.java
+++ b/v4/java/android/support/v4/net/TrafficStatsCompat.java
@@ -18,6 +18,7 @@
 
 import android.os.Build;
 
+import java.net.DatagramSocket;
 import java.net.Socket;
 import java.net.SocketException;
 
@@ -25,7 +26,7 @@
  * Helper for accessing features in TrafficStats introduced after API level 14
  * in a backwards compatible fashion.
  */
-public class TrafficStatsCompat {
+public final class TrafficStatsCompat {
 
     interface TrafficStatsCompatImpl {
         void clearThreadStatsTag();
@@ -35,6 +36,8 @@
         void setThreadStatsTag(int tag);
         void tagSocket(Socket socket) throws SocketException;
         void untagSocket(Socket socket) throws SocketException;
+        void tagDatagramSocket(DatagramSocket socket) throws SocketException;
+        void untagDatagramSocket(DatagramSocket socket) throws SocketException;
     }
 
     static class BaseTrafficStatsCompatImpl implements TrafficStatsCompatImpl {
@@ -79,6 +82,14 @@
         @Override
         public void untagSocket(Socket socket) {
         }
+
+        @Override
+        public void tagDatagramSocket(DatagramSocket socket) {
+        }
+
+        @Override
+        public void untagDatagramSocket(DatagramSocket socket) {
+        }
     }
 
     static class IcsTrafficStatsCompatImpl implements TrafficStatsCompatImpl {
@@ -116,12 +127,36 @@
         public void untagSocket(Socket socket) throws SocketException {
             TrafficStatsCompatIcs.untagSocket(socket);
         }
+
+        @Override
+        public void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+            TrafficStatsCompatIcs.tagDatagramSocket(socket);
+        }
+
+        @Override
+        public void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+            TrafficStatsCompatIcs.untagDatagramSocket(socket);
+        }
+    }
+
+    static class Api24TrafficStatsCompatImpl extends IcsTrafficStatsCompatImpl {
+        @Override
+        public void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+            TrafficStatsCompatApi24.tagDatagramSocket(socket);
+        }
+
+        @Override
+        public void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+            TrafficStatsCompatApi24.untagDatagramSocket(socket);
+        }
     }
 
     private static final TrafficStatsCompatImpl IMPL;
 
     static {
-        if (Build.VERSION.SDK_INT >= 14) {
+        if ("N".equals(Build.VERSION.CODENAME)) {
+            IMPL = new Api24TrafficStatsCompatImpl();
+        } else if (Build.VERSION.SDK_INT >= 14) {
             IMPL = new IcsTrafficStatsCompatImpl();
         } else {
             IMPL = new BaseTrafficStatsCompatImpl();
@@ -200,4 +235,26 @@
     public static void untagSocket(Socket socket) throws SocketException {
         IMPL.untagSocket(socket);
     }
+
+    /**
+     * Tag the given {@link DatagramSocket} with any statistics parameters
+     * active for the current thread. Subsequent calls always replace any
+     * existing parameters. When finished, call
+     * {@link #untagDatagramSocket(DatagramSocket)} to remove statistics
+     * parameters.
+     *
+     * @see #setThreadStatsTag(int)
+     */
+    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+        IMPL.tagDatagramSocket(socket);
+    }
+
+    /**
+     * Remove any statistics parameters from the given {@link DatagramSocket}.
+     */
+    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+        IMPL.untagDatagramSocket(socket);
+    }
+
+    private TrafficStatsCompat() {}
 }
diff --git a/v4/java/android/support/v4/os/AsyncTaskCompat.java b/v4/java/android/support/v4/os/AsyncTaskCompat.java
index 2af8905..2423c73 100644
--- a/v4/java/android/support/v4/os/AsyncTaskCompat.java
+++ b/v4/java/android/support/v4/os/AsyncTaskCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link android.os.AsyncTask}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class AsyncTaskCompat {
+public final class AsyncTaskCompat {
 
     /**
      * Executes the task with the specified parameters, allowing multiple tasks to run in parallel
@@ -51,4 +51,6 @@
         return task;
     }
 
+    private AsyncTaskCompat() {}
+
 }
diff --git a/v4/java/android/support/v4/os/EnvironmentCompat.java b/v4/java/android/support/v4/os/EnvironmentCompat.java
index 66a2a8e..454065d 100644
--- a/v4/java/android/support/v4/os/EnvironmentCompat.java
+++ b/v4/java/android/support/v4/os/EnvironmentCompat.java
@@ -27,7 +27,7 @@
  * Helper for accessing features in {@link Environment} introduced after API
  * level 4 in a backwards compatible fashion.
  */
-public class EnvironmentCompat {
+public final class EnvironmentCompat {
     private static final String TAG = "EnvironmentCompat";
 
     /**
@@ -72,4 +72,6 @@
 
         return MEDIA_UNKNOWN;
     }
+
+    private EnvironmentCompat() {}
 }
diff --git a/v4/java/android/support/v4/os/ParcelableCompat.java b/v4/java/android/support/v4/os/ParcelableCompat.java
index fbb064f..10c03b5 100644
--- a/v4/java/android/support/v4/os/ParcelableCompat.java
+++ b/v4/java/android/support/v4/os/ParcelableCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link android.os.Parcelable}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ParcelableCompat {
+public final class ParcelableCompat {
 
     /**
      * Factory method for {@link Parcelable.Creator}.
@@ -56,4 +56,6 @@
             return mCallbacks.newArray(size);
         }
     }
+
+    private ParcelableCompat() {}
 }
diff --git a/v4/java/android/support/v4/os/TraceCompat.java b/v4/java/android/support/v4/os/TraceCompat.java
index 82b0fd5..a8b62ab 100644
--- a/v4/java/android/support/v4/os/TraceCompat.java
+++ b/v4/java/android/support/v4/os/TraceCompat.java
@@ -26,7 +26,7 @@
  * href="{@docRoot}tools/debugging/systrace.html">Analyzing Display and Performance
  * with Systrace</a>.
  */
-public class TraceCompat {
+public final class TraceCompat {
     /**
      * Writes a trace message to indicate that a given section of code has begun. This call must
      * be followed by a corresponding call to {@link #endSection()} on the same thread.
@@ -57,4 +57,6 @@
             TraceJellybeanMR2.endSection();
         }
     }
+
+    private TraceCompat() {}
 }
diff --git a/v4/java/android/support/v4/os/UserManagerCompat.java b/v4/java/android/support/v4/os/UserManagerCompat.java
new file mode 100644
index 0000000..dde0ee9
--- /dev/null
+++ b/v4/java/android/support/v4/os/UserManagerCompat.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.os;
+
+import android.content.Context;
+import android.os.Build;
+
+/**
+ * Helper for accessing features in {@link android.os.UserManager}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class UserManagerCompat {
+    /**
+     * Return whether the calling user is running in a "locked" state. A user is
+     * unlocked only after they've entered their credentials (such as a lock
+     * pattern or PIN), and credential-encrypted private app data storage is
+     * available.
+     */
+    public static boolean isUserRunningAndLocked(Context context) {
+        if ("N".equals(Build.VERSION.CODENAME)) {
+            return UserManagerCompatApi24.isUserRunningAndLocked(context);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Return whether the calling user is running in an "unlocked" state. A user
+     * is unlocked only after they've entered their credentials (such as a lock
+     * pattern or PIN), and credential-encrypted private app data storage is
+     * available.
+     */
+    public static boolean isUserRunningAndUnlocked(Context context) {
+        if ("N".equals(Build.VERSION.CODENAME)) {
+            return UserManagerCompatApi24.isUserRunningAndUnlocked(context);
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/text/ICUCompat.java b/v4/java/android/support/v4/text/ICUCompat.java
index 43ada52..0632513 100644
--- a/v4/java/android/support/v4/text/ICUCompat.java
+++ b/v4/java/android/support/v4/text/ICUCompat.java
@@ -20,7 +20,7 @@
 
 import java.util.Locale;
 
-public class ICUCompat {
+public final class ICUCompat {
 
     interface ICUCompatImpl {
         public String maximizeAndGetScript(Locale locale);
@@ -86,4 +86,6 @@
     public static String maximizeAndGetScript(Locale locale) {
         return IMPL.maximizeAndGetScript(locale);
     }
+
+    private ICUCompat() {}
 }
diff --git a/v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java b/v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
index 1fddfd1..b0ede87 100644
--- a/v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
+++ b/v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
@@ -25,7 +25,7 @@
  * Some objects that implement TextDirectionHeuristic.
  *
  */
-public class TextDirectionHeuristicsCompat {
+public final class TextDirectionHeuristicsCompat {
 
     /**
      * Always decides that the direction is left to right.
@@ -254,4 +254,6 @@
         public static final TextDirectionHeuristicLocale INSTANCE =
                 new TextDirectionHeuristicLocale();
     }
+
+    private TextDirectionHeuristicsCompat() {}
 }
diff --git a/v4/java/android/support/v4/text/TextUtilsCompat.java b/v4/java/android/support/v4/text/TextUtilsCompat.java
index 72b6408..c8207e4 100644
--- a/v4/java/android/support/v4/text/TextUtilsCompat.java
+++ b/v4/java/android/support/v4/text/TextUtilsCompat.java
@@ -23,7 +23,7 @@
 
 import java.util.Locale;
 
-public class TextUtilsCompat {
+public final class TextUtilsCompat {
     private static class TextUtilsCompatImpl {
         @NonNull
         public String htmlEncode(@NonNull String s) {
@@ -147,4 +147,6 @@
 
     private static String ARAB_SCRIPT_SUBTAG = "Arab";
     private static String HEBR_SCRIPT_SUBTAG = "Hebr";
+
+    private TextUtilsCompat() {}
 }
diff --git a/v4/java/android/support/v4/util/SimpleArrayMap.java b/v4/java/android/support/v4/util/SimpleArrayMap.java
index 1b1577a..c7d4b5d 100644
--- a/v4/java/android/support/v4/util/SimpleArrayMap.java
+++ b/v4/java/android/support/v4/util/SimpleArrayMap.java
@@ -522,17 +522,42 @@
     /**
      * {@inheritDoc}
      *
-     * <p>This implementation returns false if the object is not a map, or
-     * if the maps have different sizes. Otherwise, for each key in this map,
-     * values of both maps are compared. If the values for any key are not
-     * equal, the method returns false, otherwise it returns true.
+     * <p>This implementation returns false if the object is not a Map or
+     * SimpleArrayMap, or if the maps have different sizes. Otherwise, for each
+     * key in this map, values of both maps are compared. If the values for any
+     * key are not equal, the method returns false, otherwise it returns true.
      */
     @Override
     public boolean equals(Object object) {
         if (this == object) {
             return true;
         }
-        if (object instanceof Map) {
+        if (object instanceof SimpleArrayMap) {
+            SimpleArrayMap<?, ?> map = (SimpleArrayMap<?, ?>) object;
+            if (size() != map.size()) {
+                return false;
+            }
+
+            try {
+                for (int i=0; i<mSize; i++) {
+                    K key = keyAt(i);
+                    V mine = valueAt(i);
+                    Object theirs = map.get(key);
+                    if (mine == null) {
+                        if (theirs != null || !map.containsKey(key)) {
+                            return false;
+                        }
+                    } else if (!mine.equals(theirs)) {
+                        return false;
+                    }
+                }
+            } catch (NullPointerException ignored) {
+                return false;
+            } catch (ClassCastException ignored) {
+                return false;
+            }
+            return true;
+        } else if (object instanceof Map) {
             Map<?, ?> map = (Map<?, ?>) object;
             if (size() != map.size()) {
                 return false;
diff --git a/v4/java/android/support/v4/util/TimeUtils.java b/v4/java/android/support/v4/util/TimeUtils.java
index a57c94c..36a1964 100644
--- a/v4/java/android/support/v4/util/TimeUtils.java
+++ b/v4/java/android/support/v4/util/TimeUtils.java
@@ -24,7 +24,7 @@
  *
  * @hide
  */
-public class TimeUtils {
+public final class TimeUtils {
     /** @hide Field length that can hold 999 days of time */
     public static final int HUNDRED_DAY_FIELD_LEN = 19;
     
@@ -172,4 +172,6 @@
         }
         formatDuration(time-now, pw, 0);
     }
+
+    private TimeUtils() {}
 }
diff --git a/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java b/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java
index 0ea755e..4d0281e 100644
--- a/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java
+++ b/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java
@@ -27,6 +27,18 @@
 /**
  * Helper for accessing {@link View.AccessibilityDelegate} introduced after
  * API level 4 in a backwards compatible fashion.
+ * <p>
+ * <strong>Note:</strong> On platform versions prior to
+ * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
+ * views in the {@code android.widget.*} package are called <i>before</i>
+ * host methods. This prevents certain properties such as class name from
+ * being modified by overriding
+ * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
+ * as any changes will be overwritten by the host class.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
+ * methods are called <i>after</i> host methods, which all properties to be
+ * modified without being overwritten by the host class.
  */
 public class AccessibilityDelegateCompat {
 
diff --git a/v4/java/android/support/v4/view/AsyncLayoutInflater.java b/v4/java/android/support/v4/view/AsyncLayoutInflater.java
new file mode 100644
index 0000000..6e88f59
--- /dev/null
+++ b/v4/java/android/support/v4/view/AsyncLayoutInflater.java
@@ -0,0 +1,222 @@
+/*
+ * 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.view;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Handler.Callback;
+import android.os.Looper;
+import android.os.Message;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
+import android.support.v4.util.Pools.SynchronizedPool;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * <p>Helper class for inflating layouts asynchronously. To use, construct
+ * an instance of {@link AsyncLayoutInflater} on the UI thread and call
+ * {@link #inflate(int, ViewGroup, OnInflateFinishedListener)}. The
+ * {@link OnInflateFinishedListener} will be invoked on the UI thread
+ * when the inflate request has completed.
+ *
+ * <p>This is intended for parts of the UI that are created lazily or in
+ * response to user interactions. This allows the UI thread to continue
+ * to be responsive & animate while the relatively heavy inflate
+ * is being performed.
+ *
+ * <p>For a layout to be inflated asynchronously it needs to have a parent
+ * whose {@link ViewGroup#generateLayoutParams(AttributeSet)} is thread-safe
+ * and all the Views being constructed as part of inflation must not create
+ * any {@link Handler}s or otherwise call {@link Looper#myLooper()}. If the
+ * layout that is trying to be inflated cannot be constructed
+ * asynchronously for whatever reason, {@link AsyncLayoutInflater} will
+ * automatically fall back to inflating on the UI thread.
+ *
+ * <p>NOTE that the inflated View hierarchy is NOT added to the parent. It is
+ * equivalent to calling {@link LayoutInflater#inflate(int, ViewGroup, boolean)}
+ * with attachToRoot set to false. Callers will likely want to call
+ * {@link ViewGroup#addView(View)} in the {@link OnInflateFinishedListener}
+ * callback at a minimum.
+ *
+ * <p>This inflater does not support setting a {@link LayoutInflater.Factory}
+ * nor {@link LayoutInflater.Factory2}. Similarly it does not support inflating
+ * layouts that contain fragments.
+ */
+public final class AsyncLayoutInflater {
+    private static final String TAG = "AsyncLayoutInflater";
+
+    private LayoutInflater mInflater;
+    private Handler mHandler;
+    private InflateThread mInflateThread;
+
+    public AsyncLayoutInflater(@NonNull Context context) {
+        mInflater = new BasicInflater(context);
+        mHandler = new Handler(mHandlerCallback);
+        mInflateThread = InflateThread.getInstance();
+    }
+
+    @UiThread
+    public void inflate(@LayoutRes int resid, @Nullable ViewGroup parent,
+            @NonNull OnInflateFinishedListener callback) {
+        if (callback == null) {
+            throw new NullPointerException("callback argument may not be null!");
+        }
+        InflateRequest request = mInflateThread.obtainRequest();
+        request.inflater = this;
+        request.resid = resid;
+        request.parent = parent;
+        request.callback = callback;
+        mInflateThread.enqueue(request);
+    }
+
+    private Callback mHandlerCallback = new Callback() {
+        @Override
+        public boolean handleMessage(Message msg) {
+            InflateRequest request = (InflateRequest) msg.obj;
+            if (request.view == null) {
+                request.view = mInflater.inflate(
+                        request.resid, request.parent, false);
+            }
+            request.callback.onInflateFinished(
+                    request.view, request.resid, request.parent);
+            mInflateThread.releaseRequest(request);
+            return true;
+        }
+    };
+
+    public interface OnInflateFinishedListener {
+        public void onInflateFinished(View view, int resid, ViewGroup parent);
+    }
+
+    private static class InflateRequest {
+        AsyncLayoutInflater inflater;
+        ViewGroup parent;
+        int resid;
+        View view;
+        OnInflateFinishedListener callback;
+    }
+
+    private static class BasicInflater extends LayoutInflater {
+        private static final String[] sClassPrefixList = {
+            "android.widget.",
+            "android.webkit.",
+            "android.app."
+        };
+
+        public BasicInflater(Context context) {
+            super(context);
+        }
+
+        @Override
+        public LayoutInflater cloneInContext(Context newContext) {
+            return new BasicInflater(newContext);
+        }
+
+        @Override
+        protected View onCreateView(String name, AttributeSet attrs) throws ClassNotFoundException {
+            for (String prefix : sClassPrefixList) {
+                try {
+                    View view = createView(name, prefix, attrs);
+                    if (view != null) {
+                        return view;
+                    }
+                } catch (ClassNotFoundException e) {
+                    // In this case we want to let the base class take a crack
+                    // at it.
+                }
+            }
+
+            return super.onCreateView(name, attrs);
+        }
+    }
+
+    private static class InflateThread extends Thread {
+        private static final InflateThread sInstance;
+        static {
+            sInstance = new InflateThread();
+            sInstance.start();
+        }
+
+        public static InflateThread getInstance() {
+            return sInstance;
+        }
+
+        private ArrayBlockingQueue<InflateRequest> mQueue
+                = new ArrayBlockingQueue<>(10);
+        private SynchronizedPool<InflateRequest> mRequestPool
+                = new SynchronizedPool<>(10);
+
+        @Override
+        public void run() {
+            while (true) {
+                InflateRequest request;
+                try {
+                    request = mQueue.take();
+                } catch (InterruptedException ex) {
+                    // Odd, just continue
+                    Log.w(TAG, ex);
+                    continue;
+                }
+
+                try {
+                    request.view = request.inflater.mInflater.inflate(
+                            request.resid, request.parent, false);
+                } catch (RuntimeException ex) {
+                    // Probably a Looper failure, retry on the UI thread
+                    Log.w(TAG, "Failed to inflate resource in the background! Retrying on the UI thread",
+                            ex);
+                }
+                Message.obtain(request.inflater.mHandler, 0, request)
+                        .sendToTarget();
+            }
+        }
+
+        public InflateRequest obtainRequest() {
+            InflateRequest obj = mRequestPool.acquire();
+            if (obj == null) {
+                obj = new InflateRequest();
+            }
+            return obj;
+        }
+
+        public void releaseRequest(InflateRequest obj) {
+            obj.callback = null;
+            obj.inflater = null;
+            obj.parent = null;
+            obj.resid = 0;
+            obj.view = null;
+            mRequestPool.release(obj);
+        }
+
+        public void enqueue(InflateRequest request) {
+            try {
+                mQueue.put(request);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(
+                        "Failed to enqueue async inflate request", e);
+            }
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/view/GestureDetectorCompat.java b/v4/java/android/support/v4/view/GestureDetectorCompat.java
index bcd1a0a..9d9ddb9 100644
--- a/v4/java/android/support/v4/view/GestureDetectorCompat.java
+++ b/v4/java/android/support/v4/view/GestureDetectorCompat.java
@@ -45,7 +45,7 @@
  *          will be executed when the events occur.
  * </ul>
  */
-public class GestureDetectorCompat {
+public final class GestureDetectorCompat {
     interface GestureDetectorCompatImpl {
         boolean isLongpressEnabled();
         boolean onTouchEvent(MotionEvent ev);
diff --git a/v4/java/android/support/v4/view/GravityCompat.java b/v4/java/android/support/v4/view/GravityCompat.java
index 0e8558e..cfcdd50 100644
--- a/v4/java/android/support/v4/view/GravityCompat.java
+++ b/v4/java/android/support/v4/view/GravityCompat.java
@@ -24,7 +24,7 @@
 /**
  * Compatibility shim for accessing newer functionality from {@link android.view.Gravity}.
  */
-public class GravityCompat {
+public final class GravityCompat {
     interface GravityCompatImpl {
         int getAbsoluteGravity(int gravity, int layoutDirection);
         void apply(int gravity, int w, int h, Rect container, Rect outRect, int layoutDirection);
@@ -200,4 +200,6 @@
     public static int getAbsoluteGravity(int gravity, int layoutDirection) {
         return IMPL.getAbsoluteGravity(gravity, layoutDirection);
     }
+
+    private GravityCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/InputDeviceCompat.java b/v4/java/android/support/v4/view/InputDeviceCompat.java
index 7a202cd..6db92e8 100644
--- a/v4/java/android/support/v4/view/InputDeviceCompat.java
+++ b/v4/java/android/support/v4/view/InputDeviceCompat.java
@@ -19,7 +19,7 @@
 /**
  * Helper class for accessing values in {@link android.view.InputDevice}.
  */
-public class InputDeviceCompat {
+public final class InputDeviceCompat {
 
     /**
      * A mask for input source classes.
@@ -208,4 +208,6 @@
      * to match devices that provide any type of input source.
      */
     public static final int SOURCE_ANY = 0xffffff00;
+
+    private InputDeviceCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/KeyEventCompat.java b/v4/java/android/support/v4/view/KeyEventCompat.java
index fc0ee2e..02b6622 100644
--- a/v4/java/android/support/v4/view/KeyEventCompat.java
+++ b/v4/java/android/support/v4/view/KeyEventCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link KeyEvent} introduced after
  * API level 4 in a backwards compatible fashion.
  */
-public class KeyEventCompat {
+public final class KeyEventCompat {
     /**
      * Interface for the full API.
      */
@@ -208,4 +208,6 @@
                 Object target) {
         return IMPL.dispatch(event, receiver, state, target);
     }
+
+    private KeyEventCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/LayoutInflaterCompat.java b/v4/java/android/support/v4/view/LayoutInflaterCompat.java
index d67a739..f93dace 100644
--- a/v4/java/android/support/v4/view/LayoutInflaterCompat.java
+++ b/v4/java/android/support/v4/view/LayoutInflaterCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link android.view.LayoutInflater}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class LayoutInflaterCompat {
+public final class LayoutInflaterCompat {
 
     interface LayoutInflaterCompatImpl {
         public void setFactory(LayoutInflater layoutInflater, LayoutInflaterFactory factory);
diff --git a/v4/java/android/support/v4/view/MarginLayoutParamsCompat.java b/v4/java/android/support/v4/view/MarginLayoutParamsCompat.java
index 86072c0..4e5851e 100644
--- a/v4/java/android/support/v4/view/MarginLayoutParamsCompat.java
+++ b/v4/java/android/support/v4/view/MarginLayoutParamsCompat.java
@@ -24,7 +24,7 @@
  * Helper for accessing API features in
  * {@link android.view.ViewGroup.MarginLayoutParams MarginLayoutParams} added after API 4.
  */
-public class MarginLayoutParamsCompat {
+public final class MarginLayoutParamsCompat {
     interface MarginLayoutParamsCompatImpl {
         int getMarginStart(ViewGroup.MarginLayoutParams lp);
         int getMarginEnd(ViewGroup.MarginLayoutParams lp);
@@ -202,13 +202,20 @@
     }
 
     /**
-     * Retuns the layout direction. Can be either {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
+     * Returns the layout direction. Can be either {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
      * {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
      *
      * @return the layout direction.
      */
     public static int getLayoutDirection(ViewGroup.MarginLayoutParams lp) {
-        return IMPL.getLayoutDirection(lp);
+        int result = IMPL.getLayoutDirection(lp);
+        if ((result != ViewCompat.LAYOUT_DIRECTION_LTR)
+                && (result != ViewCompat.LAYOUT_DIRECTION_RTL)) {
+            // This can happen on older platform releases where the default (unset) layout direction
+            // is -1
+            result = ViewCompat.LAYOUT_DIRECTION_LTR;
+        }
+        return result;
     }
 
     /**
@@ -230,4 +237,6 @@
             int layoutDirection) {
         IMPL.resolveLayoutDirection(lp, layoutDirection);
     }
+
+    private MarginLayoutParamsCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/MenuCompat.java b/v4/java/android/support/v4/view/MenuCompat.java
index 73c26ee..a03207f 100644
--- a/v4/java/android/support/v4/view/MenuCompat.java
+++ b/v4/java/android/support/v4/view/MenuCompat.java
@@ -22,7 +22,7 @@
  * Helper for accessing features in {@link android.view.Menu}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class MenuCompat {
+public final class MenuCompat {
     /**
      * Call {@link MenuItem#setShowAsAction(int) MenuItem.setShowAsAction()}.
      *
@@ -33,4 +33,6 @@
     public static void setShowAsAction(MenuItem item, int actionEnum) {
         MenuItemCompat.setShowAsAction(item, actionEnum);
     }
+
+    private MenuCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/MenuItemCompat.java b/v4/java/android/support/v4/view/MenuItemCompat.java
index 8a52e9e..1467754 100644
--- a/v4/java/android/support/v4/view/MenuItemCompat.java
+++ b/v4/java/android/support/v4/view/MenuItemCompat.java
@@ -29,7 +29,7 @@
  * android.view.MenuItem}, but take a {@link android.view.MenuItem} object as an additional
  * argument.</p>
  */
-public class MenuItemCompat {
+public final class MenuItemCompat {
     private static final String TAG = "MenuItemCompat";
 
     /**
@@ -437,4 +437,6 @@
         }
         return IMPL.setOnActionExpandListener(item, listener);
     }
+
+    private MenuItemCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/MotionEventCompat.java b/v4/java/android/support/v4/view/MotionEventCompat.java
index 8c7d07d..964a669 100644
--- a/v4/java/android/support/v4/view/MotionEventCompat.java
+++ b/v4/java/android/support/v4/view/MotionEventCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link MotionEvent} introduced
  * after API level 4 in a backwards compatible fashion.
  */
-public class MotionEventCompat {
+public final class MotionEventCompat {
     /**
      * Interface for the full API.
      */
@@ -516,4 +516,6 @@
     public static float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
         return IMPL.getAxisValue(event, axis, pointerIndex);
     }
+
+    private MotionEventCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java b/v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java
index ba8d0ec..fe24cc7 100644
--- a/v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java
+++ b/v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java
@@ -20,7 +20,7 @@
  * Helper for accessing features in <code>ScaleGestureDetector</code> introduced
  * after API level 19 (KitKat) in a backwards compatible fashion.
  */
-public class ScaleGestureDetectorCompat {
+public final class ScaleGestureDetectorCompat {
     static final ScaleGestureDetectorImpl IMPL;
 
     interface ScaleGestureDetectorImpl {
diff --git a/v4/java/android/support/v4/view/VelocityTrackerCompat.java b/v4/java/android/support/v4/view/VelocityTrackerCompat.java
index 99286d0..3a02c37 100644
--- a/v4/java/android/support/v4/view/VelocityTrackerCompat.java
+++ b/v4/java/android/support/v4/view/VelocityTrackerCompat.java
@@ -22,7 +22,7 @@
  * Helper for accessing features in {@link VelocityTracker}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class VelocityTrackerCompat {
+public final class VelocityTrackerCompat {
     /**
      * Interface for the full API.
      */
@@ -90,4 +90,6 @@
     public static float getYVelocity(VelocityTracker tracker, int pointerId) {
         return IMPL.getYVelocity(tracker, pointerId);
     }
+
+    private VelocityTrackerCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/ViewCompat.java b/v4/java/android/support/v4/view/ViewCompat.java
index b88d7e5..52dc9c3 100644
--- a/v4/java/android/support/v4/view/ViewCompat.java
+++ b/v4/java/android/support/v4/view/ViewCompat.java
@@ -50,9 +50,24 @@
  * Helper for accessing features in {@link View} introduced after API
  * level 4 in a backwards compatible fashion.
  */
-public class ViewCompat {
+public final class ViewCompat {
     private static final String TAG = "ViewCompat";
 
+    /** @hide */
+    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN,
+            View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusDirection {}
+
+    /** @hide */
+    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusRealDirection {}
+
+    /** @hide */
+    @IntDef({View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusRelativeDirection {}
 
     /** @hide */
     @IntDef({OVER_SCROLL_ALWAYS, OVER_SCROLL_IF_CONTENT_SCROLLS, OVER_SCROLL_NEVER})
@@ -293,36 +308,36 @@
     /**
      * Scroll indicator direction for the top edge of the view.
      *
-     * @see #setScrollIndicators(int)
-     * @see #setScrollIndicators(int, int)
-     * @see #getScrollIndicators()
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
      */
     public static final int SCROLL_INDICATOR_TOP = 0x1;
 
     /**
      * Scroll indicator direction for the bottom edge of the view.
      *
-     * @see #setScrollIndicators(int)
-     * @see #setScrollIndicators(int, int)
-     * @see #getScrollIndicators()
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
      */
     public static final int SCROLL_INDICATOR_BOTTOM = 0x2;
 
     /**
      * Scroll indicator direction for the left edge of the view.
      *
-     * @see #setScrollIndicators(int)
-     * @see #setScrollIndicators(int, int)
-     * @see #getScrollIndicators()
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
      */
     public static final int SCROLL_INDICATOR_LEFT = 0x4;
 
     /**
      * Scroll indicator direction for the right edge of the view.
      *
-     * @see #setScrollIndicators(int)
-     * @see #setScrollIndicators(int, int)
-     * @see #getScrollIndicators()
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
      */
     public static final int SCROLL_INDICATOR_RIGHT = 0x8;
 
@@ -338,93 +353,93 @@
     /**
      * Scroll indicator direction for the ending edge of the view.
      *
-     * @see #setScrollIndicators(int)
-     * @see #setScrollIndicators(int, int)
-     * @see #getScrollIndicators()
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
      */
     public static final int SCROLL_INDICATOR_END = 0x20;
 
     interface ViewCompatImpl {
-        public boolean canScrollHorizontally(View v, int direction);
-        public boolean canScrollVertically(View v, int direction);
-        public int getOverScrollMode(View v);
-        public void setOverScrollMode(View v, int mode);
-        public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
-        public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
-        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
-        public void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
-        public boolean hasAccessibilityDelegate(View v);
-        public boolean hasTransientState(View view);
-        public void setHasTransientState(View view, boolean hasTransientState);
-        public void postInvalidateOnAnimation(View view);
-        public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
-        public void postOnAnimation(View view, Runnable action);
-        public void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
-        public int getImportantForAccessibility(View view);
-        public void setImportantForAccessibility(View view, int mode);
-        public boolean isImportantForAccessibility(View view);
-        public boolean performAccessibilityAction(View view, int action, Bundle arguments);
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
-        public float getAlpha(View view);
-        public void setLayerType(View view, int layerType, Paint paint);
-        public int getLayerType(View view);
-        public int getLabelFor(View view);
-        public void setLabelFor(View view, int id);
-        public void setLayerPaint(View view, Paint paint);
-        public int getLayoutDirection(View view);
-        public void setLayoutDirection(View view, int layoutDirection);
-        public ViewParent getParentForAccessibility(View view);
-        public boolean isOpaque(View view);
-        public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
-        public int getMeasuredWidthAndState(View view);
-        public int getMeasuredHeightAndState(View view);
-        public int getMeasuredState(View view);
-        public int getAccessibilityLiveRegion(View view);
-        public void setAccessibilityLiveRegion(View view, int mode);
-        public int getPaddingStart(View view);
-        public int getPaddingEnd(View view);
-        public void setPaddingRelative(View view, int start, int top, int end, int bottom);
-        public void dispatchStartTemporaryDetach(View view);
-        public void dispatchFinishTemporaryDetach(View view);
-        public float getX(View view);
-        public float getY(View view);
-        public float getRotation(View view);
-        public float getRotationX(View view);
-        public float getRotationY(View view);
-        public float getScaleX(View view);
-        public float getScaleY(View view);
-        public float getTranslationX(View view);
-        public float getTranslationY(View view);
-        public int getMinimumWidth(View view);
-        public int getMinimumHeight(View view);
-        public ViewPropertyAnimatorCompat animate(View view);
-        public void setRotation(View view, float value);
-        public void setRotationX(View view, float value);
-        public void setRotationY(View view, float value);
-        public void setScaleX(View view, float value);
-        public void setScaleY(View view, float value);
-        public void setTranslationX(View view, float value);
-        public void setTranslationY(View view, float value);
-        public void setX(View view, float value);
-        public void setY(View view, float value);
-        public void setAlpha(View view, float value);
-        public void setPivotX(View view, float value);
-        public void setPivotY(View view, float value);
-        public float getPivotX(View view);
-        public float getPivotY(View view);
-        public void setElevation(View view, float elevation);
-        public float getElevation(View view);
-        public void setTranslationZ(View view, float translationZ);
-        public float getTranslationZ(View view);
-        public void setClipBounds(View view, Rect clipBounds);
-        public Rect getClipBounds(View view);
-        public void setTransitionName(View view, String transitionName);
-        public String getTransitionName(View view);
-        public int getWindowSystemUiVisibility(View view);
-        public void requestApplyInsets(View view);
-        public void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled);
-        public boolean getFitsSystemWindows(View view);
-        public boolean hasOverlappingRendering(View view);
+        boolean canScrollHorizontally(View v, int direction);
+        boolean canScrollVertically(View v, int direction);
+        int getOverScrollMode(View v);
+        void setOverScrollMode(View v, int mode);
+        void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
+        void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
+        void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
+        void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
+        boolean hasAccessibilityDelegate(View v);
+        boolean hasTransientState(View view);
+        void setHasTransientState(View view, boolean hasTransientState);
+        void postInvalidateOnAnimation(View view);
+        void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
+        void postOnAnimation(View view, Runnable action);
+        void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
+        int getImportantForAccessibility(View view);
+        void setImportantForAccessibility(View view, int mode);
+        boolean isImportantForAccessibility(View view);
+        boolean performAccessibilityAction(View view, int action, Bundle arguments);
+        AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
+        float getAlpha(View view);
+        void setLayerType(View view, int layerType, Paint paint);
+        int getLayerType(View view);
+        int getLabelFor(View view);
+        void setLabelFor(View view, int id);
+        void setLayerPaint(View view, Paint paint);
+        int getLayoutDirection(View view);
+        void setLayoutDirection(View view, int layoutDirection);
+        ViewParent getParentForAccessibility(View view);
+        boolean isOpaque(View view);
+        int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
+        int getMeasuredWidthAndState(View view);
+        int getMeasuredHeightAndState(View view);
+        int getMeasuredState(View view);
+        int getAccessibilityLiveRegion(View view);
+        void setAccessibilityLiveRegion(View view, int mode);
+        int getPaddingStart(View view);
+        int getPaddingEnd(View view);
+        void setPaddingRelative(View view, int start, int top, int end, int bottom);
+        void dispatchStartTemporaryDetach(View view);
+        void dispatchFinishTemporaryDetach(View view);
+        float getX(View view);
+        float getY(View view);
+        float getRotation(View view);
+        float getRotationX(View view);
+        float getRotationY(View view);
+        float getScaleX(View view);
+        float getScaleY(View view);
+        float getTranslationX(View view);
+        float getTranslationY(View view);
+        int getMinimumWidth(View view);
+        int getMinimumHeight(View view);
+        ViewPropertyAnimatorCompat animate(View view);
+        void setRotation(View view, float value);
+        void setRotationX(View view, float value);
+        void setRotationY(View view, float value);
+        void setScaleX(View view, float value);
+        void setScaleY(View view, float value);
+        void setTranslationX(View view, float value);
+        void setTranslationY(View view, float value);
+        void setX(View view, float value);
+        void setY(View view, float value);
+        void setAlpha(View view, float value);
+        void setPivotX(View view, float value);
+        void setPivotY(View view, float value);
+        float getPivotX(View view);
+        float getPivotY(View view);
+        void setElevation(View view, float elevation);
+        float getElevation(View view);
+        void setTranslationZ(View view, float translationZ);
+        float getTranslationZ(View view);
+        void setClipBounds(View view, Rect clipBounds);
+        Rect getClipBounds(View view);
+        void setTransitionName(View view, String transitionName);
+        String getTransitionName(View view);
+        int getWindowSystemUiVisibility(View view);
+        void requestApplyInsets(View view);
+        void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled);
+        boolean getFitsSystemWindows(View view);
+        boolean hasOverlappingRendering(View view);
         void setFitsSystemWindows(View view, boolean fitSystemWindows);
         void jumpDrawablesToCurrentState(View v);
         void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener);
@@ -450,12 +465,12 @@
         boolean dispatchNestedPreFling(View view, float velocityX, float velocityY);
         boolean isLaidOut(View view);
         int combineMeasuredStates(int curState, int newState);
-        public float getZ(View view);
-        public boolean isAttachedToWindow(View view);
-        public boolean hasOnClickListeners(View view);
-        public void setScrollIndicators(View view, int indicators);
-        public void setScrollIndicators(View view, int indicators, int mask);
-        public int getScrollIndicators(View view);
+        float getZ(View view);
+        boolean isAttachedToWindow(View view);
+        boolean hasOnClickListeners(View view);
+        void setScrollIndicators(View view, int indicators);
+        void setScrollIndicators(View view, int indicators, int mask);
+        int getScrollIndicators(View view);
     }
 
     static class BaseViewCompatImpl implements ViewCompatImpl {
@@ -1297,8 +1312,7 @@
         @Override
         public ViewPropertyAnimatorCompat animate(View view) {
             if (mViewPropertyAnimatorCompatMap == null) {
-                mViewPropertyAnimatorCompatMap =
-                        new WeakHashMap<View, ViewPropertyAnimatorCompat>();
+                mViewPropertyAnimatorCompatMap = new WeakHashMap<>();
             }
             ViewPropertyAnimatorCompat vpa = mViewPropertyAnimatorCompatMap.get(view);
             if (vpa == null) {
@@ -1706,6 +1720,7 @@
      */
     @OverScroll
     public static int getOverScrollMode(View v) {
+        //noinspection ResourceType
         return IMPL.getOverScrollMode(v);
     }
 
@@ -1742,10 +1757,9 @@
      *     event.getText().add(selectedDateUtterance);
      * }</pre>
      * <p>
-     * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
-     * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
-     * {@link android.view.View.AccessibilityDelegate#onPopulateAccessibilityEvent(View,
-     *  AccessibilityEvent)}
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+     * {@link AccessibilityDelegateCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)}
      * is responsible for handling this call.
      * </p>
      * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
@@ -1775,15 +1789,10 @@
      *     event.setPassword(true);
      * }</pre>
      * <p>
-     * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
-     * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
-     * {@link android.view.View.AccessibilityDelegate#onInitializeAccessibilityEvent(View,
-     *  AccessibilityEvent)}
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)}
      * is responsible for handling this call.
-     * </p>
-     * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
-     * information to the event, in case the default implementation has basic information to add.
-     * </p>
      *
      * @param v The View against which to invoke the method.
      * @param event The event to initialize.
@@ -1796,33 +1805,27 @@
     }
 
     /**
-     * Initializes an {@link android.view.accessibility.AccessibilityNodeInfo} with information
+     * Initializes an {@link AccessibilityNodeInfoCompat} with information
      * about this view. The base implementation sets:
      * <ul>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setParent(View)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInParent(Rect)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInScreen(Rect)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setPackageName(CharSequence)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setClassName(CharSequence)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setContentDescription(CharSequence)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setEnabled(boolean)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setClickable(boolean)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setFocusable(boolean)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setFocused(boolean)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setLongClickable(boolean)},</li>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setSelected(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setParent(View)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInParent(Rect)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInScreen(Rect)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setPackageName(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setClassName(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setContentDescription(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setEnabled(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setClickable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setFocusable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setFocused(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setLongClickable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setSelected(boolean)},</li>
      * </ul>
      * <p>
-     * Subclasses should override this method, call the super implementation,
-     * and set additional attributes.
-     * </p>
-     * <p>
-     * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
-     * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
-     * {@link android.view.View.AccessibilityDelegate#onInitializeAccessibilityNodeInfo(View,
-     *  android.view.accessibility.AccessibilityNodeInfo)}
-     * is responsible for handling this call.
-     * </p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)}
+     * method is responsible for handling this call.
      *
      * @param v The View against which to invoke the method.
      * @param info The instance to initialize.
@@ -1832,15 +1835,27 @@
     }
 
     /**
-     * Sets a delegate for implementing accessibility support via compositon as
-     * opposed to inheritance. The delegate's primary use is for implementing
-     * backwards compatible widgets. For more details see
-     * {@link android.view.View.AccessibilityDelegate}.
+     * Sets a delegate for implementing accessibility support via composition
+     * (as opposed to inheritance). For more details, see
+     * {@link AccessibilityDelegateCompat}.
+     * <p>
+     * On platform versions prior to API 14, this method is a no-op.
+     * <p>
+     * <strong>Note:</strong> On platform versions prior to
+     * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
+     * views in the {@code android.widget.*} package are called <i>before</i>
+     * host methods. This prevents certain properties such as class name from
+     * being modified by overriding
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
+     * as any changes will be overwritten by the host class.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
+     * methods are called <i>after</i> host methods, which all properties to be
+     * modified without being overwritten by the host class.
      *
-     * @param v The View against which to invoke the method.
-     * @param delegate The delegate instance.
-     *
-     * @see android.view.View.AccessibilityDelegate
+     * @param delegate the object to which accessibility method calls should be
+     *                 delegated
+     * @see AccessibilityDelegateCompat
      */
     public static void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
         IMPL.setAccessibilityDelegate(v, delegate);
@@ -1956,6 +1971,7 @@
      */
     @ImportantForAccessibility
     public static int getImportantForAccessibility(View view) {
+        //noinspection ResourceType
         return IMPL.getImportantForAccessibility(view);
     }
 
@@ -2063,13 +2079,6 @@
      * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware}
      * for more information on when and how to use layers.</p>
      *
-     * @param layerType The ype of layer to use with this view, must be one of
-     *        {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
-     *        {@link #LAYER_TYPE_HARDWARE}
-     * @param paint The paint used to compose the layer. This argument is optional
-     *        and can be null. It is ignored when the layer type is
-     *        {@link #LAYER_TYPE_NONE}
-     *
      * @param view View to set the layer type for
      * @param layerType The type of layer to use with this view, must be one of
      *        {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
@@ -2100,6 +2109,7 @@
      */
     @LayerType
     public static int getLayerType(View view) {
+        //noinspection ResourceType
         return IMPL.getLayerType(view);
     }
 
@@ -2171,6 +2181,7 @@
      */
     @ResolvedLayoutDirectionMode
     public static int getLayoutDirection(View view) {
+        //noinspection ResourceType
         return IMPL.getLayoutDirection(view);
     }
 
@@ -2297,6 +2308,7 @@
      */
     @AccessibilityLiveRegion
     public static int getAccessibilityLiveRegion(View view) {
+        //noinspection ResourceType
         return IMPL.getAccessibilityLiveRegion(view);
     }
 
@@ -3277,4 +3289,6 @@
     public static int getScrollIndicators(@NonNull View view) {
         return IMPL.getScrollIndicators(view);
     }
+
+    private ViewCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/ViewConfigurationCompat.java b/v4/java/android/support/v4/view/ViewConfigurationCompat.java
index 86d19bb..c51eb41 100644
--- a/v4/java/android/support/v4/view/ViewConfigurationCompat.java
+++ b/v4/java/android/support/v4/view/ViewConfigurationCompat.java
@@ -22,7 +22,7 @@
  * Helper for accessing features in {@link ViewConfiguration}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ViewConfigurationCompat {
+public final class ViewConfigurationCompat {
     /**
      * Interface for the full API.
      */
@@ -112,4 +112,6 @@
     public static boolean hasPermanentMenuKey(ViewConfiguration config) {
         return IMPL.hasPermanentMenuKey(config);
     }
+
+    private ViewConfigurationCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/ViewGroupCompat.java b/v4/java/android/support/v4/view/ViewGroupCompat.java
index 2254c4a..fbb75c7 100644
--- a/v4/java/android/support/v4/view/ViewGroupCompat.java
+++ b/v4/java/android/support/v4/view/ViewGroupCompat.java
@@ -25,7 +25,7 @@
  * Helper for accessing features in {@link ViewGroup}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ViewGroupCompat {
+public final class ViewGroupCompat {
 
     /**
      * This constant is a {@link #setLayoutMode(ViewGroup, int) layoutMode}.
@@ -155,9 +155,7 @@
     /*
      * Hide the constructor.
      */
-    private ViewGroupCompat() {
-
-    }
+    private ViewGroupCompat() {}
 
     /**
      * Called when a child has requested sending an {@link AccessibilityEvent} and
diff --git a/v4/java/android/support/v4/view/ViewParentCompat.java b/v4/java/android/support/v4/view/ViewParentCompat.java
index b95b332..ec97988 100644
--- a/v4/java/android/support/v4/view/ViewParentCompat.java
+++ b/v4/java/android/support/v4/view/ViewParentCompat.java
@@ -30,7 +30,7 @@
  * Helper for accessing features in {@link ViewParent}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class ViewParentCompat {
+public final class ViewParentCompat {
 
     interface ViewParentCompatImpl {
         public boolean requestSendAccessibilityEvent(
@@ -215,9 +215,7 @@
     /*
      * Hide the constructor.
      */
-    private ViewParentCompat() {
-
-    }
+    private ViewParentCompat() {}
 
     /**
      * Called by a child to request from its parent to send an {@link AccessibilityEvent}.
diff --git a/v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java b/v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
index c4a2145..a629855 100644
--- a/v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
+++ b/v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
@@ -21,7 +21,7 @@
 import java.lang.ref.WeakReference;
 import java.util.WeakHashMap;
 
-public class ViewPropertyAnimatorCompat {
+public final class ViewPropertyAnimatorCompat {
     private static final String TAG = "ViewAnimatorCompat";
     private WeakReference<View> mView;
     private Runnable mStartAction = null;
@@ -31,7 +31,6 @@
     // internally and apps should use ids higher than it
     static final int LISTENER_TAG_ID = 0x7e000000;
 
-
     ViewPropertyAnimatorCompat(View view) {
         mView = new WeakReference<View>(view);
     }
diff --git a/v4/java/android/support/v4/view/WindowCompat.java b/v4/java/android/support/v4/view/WindowCompat.java
index 15fe715..9a0773e 100644
--- a/v4/java/android/support/v4/view/WindowCompat.java
+++ b/v4/java/android/support/v4/view/WindowCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link Window} introduced after API
  * level 4 in a backwards compatible fashion.
  */
-public class WindowCompat {
+public final class WindowCompat {
     /**
      * Flag for enabling the Action Bar.
      * This is enabled by default for some devices. The Action Bar
@@ -58,4 +58,6 @@
      * If overlay is enabled, the action mode UI will be allowed to cover existing window content.
      */
     public static final int FEATURE_ACTION_MODE_OVERLAY = 10;
+
+    private WindowCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
index 297d646..7032f39 100644
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
+++ b/v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in {@link AccessibilityEvent}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class AccessibilityEventCompat {
+public final class AccessibilityEventCompat {
 
     static interface AccessibilityEventVersionImpl {
         int getRecordCount(AccessibilityEvent event);
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
index ee2da33..19d893d 100644
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
+++ b/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
@@ -28,7 +28,7 @@
  * Helper for accessing features in {@link AccessibilityManager}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class AccessibilityManagerCompat {
+public final class AccessibilityManagerCompat {
 
     interface AccessibilityManagerVersionImpl {
         public Object newAccessiblityStateChangeListener(
@@ -213,4 +213,6 @@
          */
         public abstract void onAccessibilityStateChanged(boolean enabled);
     }
+
+    private AccessibilityManagerCompat() {}
 }
diff --git a/v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java b/v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java
index 2e06132..3451fe0 100644
--- a/v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java
+++ b/v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java
@@ -25,7 +25,7 @@
  * platform implementation will be used and on older platforms a compatible alternative
  * implementation will be used.
  */
-public class PathInterpolatorCompat {
+public final class PathInterpolatorCompat {
 
     private PathInterpolatorCompat() {
         // prevent instantiation
diff --git a/v4/java/android/support/v4/widget/EdgeEffectCompat.java b/v4/java/android/support/v4/widget/EdgeEffectCompat.java
index 55b1319..7d78c13 100644
--- a/v4/java/android/support/v4/widget/EdgeEffectCompat.java
+++ b/v4/java/android/support/v4/widget/EdgeEffectCompat.java
@@ -28,7 +28,7 @@
  * be used by views that wish to use the standard Android visual effects at the edges       
  * of scrolling containers.
  */
-public class EdgeEffectCompat {
+public final class EdgeEffectCompat {
     private Object mEdgeEffect;
 
     private static final EdgeEffectImpl IMPL;
diff --git a/v4/java/android/support/v4/widget/ExploreByTouchHelper.java b/v4/java/android/support/v4/widget/ExploreByTouchHelper.java
index 64f6634..ddfc5d6 100644
--- a/v4/java/android/support/v4/widget/ExploreByTouchHelper.java
+++ b/v4/java/android/support/v4/widget/ExploreByTouchHelper.java
@@ -19,7 +19,11 @@
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.SparseArrayCompat;
 import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.KeyEventCompat;
 import android.support.v4.view.MotionEventCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewParentCompat;
@@ -28,15 +32,22 @@
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
 import android.support.v4.view.accessibility.AccessibilityRecordCompat;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewParent;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
+import android.support.v4.view.ViewCompat.FocusDirection;
+import android.support.v4.view.ViewCompat.FocusRealDirection;
+
+import static android.support.v4.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+import static android.support.v4.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES;
+
 /**
  * ExploreByTouchHelper is a utility class for implementing accessibility
  * support in custom {@link View}s that represent a collection of View-like
@@ -47,8 +58,36 @@
  * <p>
  * Clients should override abstract methods on this class and attach it to the
  * host view using {@link ViewCompat#setAccessibilityDelegate}:
- *
+ * <p>
  * <pre>
+ * class MyCustomView extends View {
+ *     private MyVirtualViewHelper mVirtualViewHelper;
+ *
+ *     public MyCustomView(Context context, ...) {
+ *         ...
+ *         mVirtualViewHelper = new MyVirtualViewHelper(this);
+ *         ViewCompat.setAccessibilityDelegate(this, mVirtualViewHelper);
+ *     }
+ *
+ *     &#64;Override
+ *     public boolean dispatchHoverEvent(MotionEvent event) {
+ *       return mHelper.dispatchHoverEvent(this, event)
+ *           || super.dispatchHoverEvent(event);
+ *     }
+ *
+ *     &#64;Override
+ *     public boolean dispatchKeyEvent(KeyEvent event) {
+ *       return mHelper.dispatchKeyEvent(event)
+ *           || super.dispatchKeyEvent(event);
+ *     }
+ *
+ *     &#64;Override
+ *     public boolean onFocusChanged(boolean gainFocus, int direction,
+ *         Rect previouslyFocusedRect) {
+ *       super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+ *       mHelper.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+ *     }
+ * }
  * mAccessHelper = new MyExploreByTouchHelper(someView);
  * ViewCompat.setAccessibilityDelegate(someView, mAccessHelper);
  * </pre>
@@ -61,7 +100,7 @@
     public static final int HOST_ID = View.NO_ID;
 
     /** Default class name used for virtual views. */
-    private static final String DEFAULT_CLASS_NAME = View.class.getName();
+    private static final String DEFAULT_CLASS_NAME = "android.view.View";
 
     // Temporary, reusable data structures.
     private final Rect mTempScreenRect = new Rect();
@@ -69,70 +108,79 @@
     private final Rect mTempVisibleRect = new Rect();
     private final int[] mTempGlobalRect = new int[2];
 
+    /** Cache of accessibility nodes. This is populated on-demand. */
+    private final SparseArrayCompat<AccessibilityNodeInfoCompat> mCachedNodes =
+            new SparseArrayCompat<>();
+
     /** System accessibility manager, used to check state and send events. */
     private final AccessibilityManager mManager;
 
     /** View whose internal structure is exposed through this helper. */
-    private final View mView;
+    private final View mHost;
 
-    /** Node provider that handles creating nodes and performing actions. */
-    private ExploreByTouchNodeProvider mNodeProvider;
+    /** Virtual node provider used to expose logical structure to services. */
+    private MyNodeProvider mNodeProvider;
 
-    /** Virtual view id for the currently focused logical item. */
-    private int mFocusedVirtualViewId = INVALID_ID;
+    /** Identifier for the virtual view that holds accessibility focus. */
+    private int mAccessibilityFocusedVirtualViewId = INVALID_ID;
 
-    /** Virtual view id for the currently hovered logical item. */
+    /** Identifier for the virtual view that holds keyboard focus. */
+    private int mKeyboardFocusedVirtualViewId = INVALID_ID;
+
+    /** Identifier for the virtual view that is currently hovered. */
     private int mHoveredVirtualViewId = INVALID_ID;
 
     /**
-     * Factory method to create a new {@link ExploreByTouchHelper}.
+     * Constructs a new helper that can expose a virtual view hierarchy for the
+     * specified host view.
      *
-     * @param forView View whose logical children are exposed by this helper.
+     * @param host view whose virtual view hierarchy is exposed by this helper
      */
-    public ExploreByTouchHelper(View forView) {
-        if (forView == null) {
+    public ExploreByTouchHelper(View host) {
+        if (host == null) {
             throw new IllegalArgumentException("View may not be null");
         }
 
-        mView = forView;
-        final Context context = forView.getContext();
+        mHost = host;
+
+        final Context context = host.getContext();
         mManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
+
+        // Host view must be focusable so that we can delegate to virtual
+        // views.
+        host.setFocusable(true);
+        if (ViewCompat.getImportantForAccessibility(host) == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+            ViewCompat.setImportantForAccessibility(host, IMPORTANT_FOR_ACCESSIBILITY_YES);
+        }
     }
 
-    /**
-     * Returns the {@link AccessibilityNodeProviderCompat} for this helper.
-     *
-     * @param host View whose logical children are exposed by this helper.
-     * @return The accessibility node provider for this helper.
-     */
     @Override
     public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
         if (mNodeProvider == null) {
-            mNodeProvider = new ExploreByTouchNodeProvider();
+            mNodeProvider = new MyNodeProvider();
         }
         return mNodeProvider;
     }
 
     /**
+     * Delegates hover events from the host view.
+     * <p>
      * Dispatches hover {@link MotionEvent}s to the virtual view hierarchy when
      * the Explore by Touch feature is enabled.
      * <p>
-     * This method should be called by overriding
-     * {@link View#dispatchHoverEvent}:
-     *
+     * This method should be called by overriding the host view's
+     * {@link View#dispatchHoverEvent(MotionEvent)} method:
      * <pre>&#64;Override
      * public boolean dispatchHoverEvent(MotionEvent event) {
-     *   if (mHelper.dispatchHoverEvent(this, event) {
-     *     return true;
-     *   }
-     *   return super.dispatchHoverEvent(event);
+     *   return mHelper.dispatchHoverEvent(this, event)
+     *       || super.dispatchHoverEvent(event);
      * }
      * </pre>
      *
      * @param event The hover event to dispatch to the virtual view hierarchy.
      * @return Whether the hover event was handled.
      */
-    public boolean dispatchHoverEvent(MotionEvent event) {
+    public final boolean dispatchHoverEvent(@NonNull MotionEvent event) {
         if (!mManager.isEnabled()
                 || !AccessibilityManagerCompat.isTouchExplorationEnabled(mManager)) {
             return false;
@@ -145,7 +193,7 @@
                 updateHoveredVirtualView(virtualViewId);
                 return (virtualViewId != INVALID_ID);
             case MotionEventCompat.ACTION_HOVER_EXIT:
-                if (mFocusedVirtualViewId != INVALID_ID) {
+                if (mAccessibilityFocusedVirtualViewId != INVALID_ID) {
                     updateHoveredVirtualView(INVALID_ID);
                     return true;
                 }
@@ -156,78 +204,412 @@
     }
 
     /**
+     * Delegates key events from the host view.
+     * <p>
+     * This method should be called by overriding the host view's
+     * {@link View#dispatchKeyEvent(KeyEvent)} method:
+     * <pre>&#64;Override
+     * public boolean dispatchKeyEvent(KeyEvent event) {
+     *   return mHelper.dispatchKeyEvent(event)
+     *       || super.dispatchKeyEvent(event);
+     * }
+     * </pre>
+     */
+    public final boolean dispatchKeyEvent(@NonNull KeyEvent event) {
+        boolean handled = false;
+
+        final int action = event.getAction();
+        if (action != KeyEvent.ACTION_UP) {
+            final int keyCode = event.getKeyCode();
+            switch (keyCode) {
+                case KeyEvent.KEYCODE_DPAD_LEFT:
+                case KeyEvent.KEYCODE_DPAD_UP:
+                case KeyEvent.KEYCODE_DPAD_RIGHT:
+                case KeyEvent.KEYCODE_DPAD_DOWN:
+                    if (KeyEventCompat.hasNoModifiers(event)) {
+                        final int direction = keyToDirection(keyCode);
+                        final int count = 1 + event.getRepeatCount();
+                        for (int i = 0; i < count; i++) {
+                            if (moveFocus(direction, null)) {
+                                handled = true;
+                            } else {
+                                break;
+                            }
+                        }
+                    }
+                    break;
+                case KeyEvent.KEYCODE_DPAD_CENTER:
+                case KeyEvent.KEYCODE_ENTER:
+                    if (KeyEventCompat.hasNoModifiers(event)) {
+                        if (event.getRepeatCount() == 0) {
+                            clickKeyboardFocusedVirtualView();
+                            handled = true;
+                        }
+                    }
+                    break;
+                case KeyEvent.KEYCODE_TAB:
+                    if (KeyEventCompat.hasNoModifiers(event)) {
+                        handled = moveFocus(View.FOCUS_FORWARD, null);
+                    } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
+                        handled = moveFocus(View.FOCUS_BACKWARD, null);
+                    }
+                    break;
+            }
+        }
+
+        return handled;
+    }
+
+    /**
+     * Delegates focus changes from the host view.
+     * <p>
+     * This method should be called by overriding the host view's
+     * {@link View#onFocusChanged(boolean, int, Rect)} method:
+     * <pre>&#64;Override
+     * public boolean onFocusChanged(boolean gainFocus, int direction,
+     *     Rect previouslyFocusedRect) {
+     *   super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+     *   mHelper.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+     * }
+     * </pre>
+     */
+    public final void onFocusChanged(boolean gainFocus, int direction,
+            @Nullable Rect previouslyFocusedRect) {
+        if (mKeyboardFocusedVirtualViewId != INVALID_ID) {
+            clearKeyboardFocusForVirtualView(mKeyboardFocusedVirtualViewId);
+        }
+
+        if (gainFocus) {
+            moveFocus(direction, previouslyFocusedRect);
+        }
+    }
+
+    /**
+     * @return the identifier of the virtual view that has accessibility focus
+     *         or {@link #INVALID_ID} if no virtual view has accessibility
+     *         focus
+     */
+    public final int getAccessibilityFocusedVirtualViewId() {
+        return mAccessibilityFocusedVirtualViewId;
+    }
+
+    /**
+     * @return the identifier of the virtual view that has keyboard focus
+     *         or {@link #INVALID_ID} if no virtual view has keyboard focus
+     */
+    public final int getKeyboardFocusedVirtualViewId() {
+        return mKeyboardFocusedVirtualViewId;
+    }
+
+    /**
+     * Maps key event codes to focus directions.
+     *
+     * @param keyCode the key event code
+     * @return the corresponding focus direction
+     */
+    @FocusRealDirection
+    private static int keyToDirection(int keyCode) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                return View.FOCUS_LEFT;
+            case KeyEvent.KEYCODE_DPAD_UP:
+                return View.FOCUS_UP;
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                return View.FOCUS_RIGHT;
+            default:
+                return View.FOCUS_DOWN;
+        }
+    }
+
+    /**
+     * Obtains the bounds for the specified virtual view.
+     *
+     * @param virtualViewId the identifier of the virtual view
+     * @param outBounds the rect to populate with virtual view bounds
+     */
+    private void getBoundsInParent(int virtualViewId, Rect outBounds) {
+        final AccessibilityNodeInfoCompat node = obtainAccessibilityNodeInfo(virtualViewId);
+        node.getBoundsInParent(outBounds);
+    }
+
+    /**
+     * Adapts AccessibilityNodeInfoCompat for obtaining bounds.
+     */
+    private static final FocusStrategy.BoundsAdapter<AccessibilityNodeInfoCompat> NODE_ADAPTER =
+            new FocusStrategy.BoundsAdapter<AccessibilityNodeInfoCompat>() {
+                @Override
+                public void obtainBounds(AccessibilityNodeInfoCompat node, Rect outBounds) {
+                    node.getBoundsInParent(outBounds);
+                }
+            };
+
+    /**
+     * Adapts SparseArrayCompat for iterating through values.
+     */
+    private static final FocusStrategy.CollectionAdapter<SparseArrayCompat<
+            AccessibilityNodeInfoCompat>, AccessibilityNodeInfoCompat> SPARSE_VALUES_ADAPTER =
+            new FocusStrategy.CollectionAdapter<SparseArrayCompat<
+                    AccessibilityNodeInfoCompat>, AccessibilityNodeInfoCompat>() {
+                @Override
+                public AccessibilityNodeInfoCompat get(
+                        SparseArrayCompat<AccessibilityNodeInfoCompat> collection, int index) {
+                    return collection.valueAt(index);
+                }
+
+                @Override
+                public int size(SparseArrayCompat<AccessibilityNodeInfoCompat> collection) {
+                    return collection.size();
+                }
+            };
+
+    /**
+     * Attempts to move keyboard focus in the specified direction.
+     *
+     * @param direction the direction in which to move keyboard focus
+     * @param previouslyFocusedRect the bounds of the previously focused item,
+     *                              or {@code null} if not available
+     * @return {@code true} if keyboard focus moved to a virtual view managed
+     *         by this helper, or {@code false} otherwise
+     */
+    private boolean moveFocus(@FocusDirection int direction, @Nullable Rect previouslyFocusedRect) {
+        final int focusedNodeId = mKeyboardFocusedVirtualViewId;
+        final AccessibilityNodeInfoCompat focusedNode =
+                focusedNodeId == INVALID_ID ? null : mCachedNodes.get(focusedNodeId);
+
+        final AccessibilityNodeInfoCompat nextFocusedNode;
+        switch (direction) {
+            case View.FOCUS_FORWARD:
+            case View.FOCUS_BACKWARD:
+                final boolean isLayoutRtl =
+                        ViewCompat.getLayoutDirection(mHost) == ViewCompat.LAYOUT_DIRECTION_RTL;
+                nextFocusedNode = FocusStrategy.findNextFocusInRelativeDirection(mCachedNodes,
+                        SPARSE_VALUES_ADAPTER, NODE_ADAPTER, focusedNode, direction, isLayoutRtl,
+                        false);
+                break;
+            case View.FOCUS_LEFT:
+            case View.FOCUS_UP:
+            case View.FOCUS_RIGHT:
+            case View.FOCUS_DOWN:
+                final Rect selectedRect = new Rect();
+                if (mKeyboardFocusedVirtualViewId != INVALID_ID) {
+                    // Focus is moving from a virtual view within the host.
+                    getBoundsInParent(mKeyboardFocusedVirtualViewId, selectedRect);
+                } else if (previouslyFocusedRect != null) {
+                    // Focus is moving from a real view outside the host.
+                    selectedRect.set(previouslyFocusedRect);
+                } else {
+                    // Focus is moving from... somewhere? Make a guess.
+                    // Usually this happens when another view was too lazy
+                    // to pass the previously focused rect (ex. ScrollView
+                    // when moving UP or DOWN).
+                    guessPreviouslyFocusedRect(mHost, direction, selectedRect);
+                }
+                nextFocusedNode = FocusStrategy.findNextFocusInAbsoluteDirection(mCachedNodes,
+                        SPARSE_VALUES_ADAPTER, NODE_ADAPTER, focusedNode, selectedRect, direction);
+                break;
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_FORWARD, FOCUS_BACKWARD, FOCUS_UP, FOCUS_DOWN, "
+                        + "FOCUS_LEFT, FOCUS_RIGHT}.");
+        }
+
+        final int nextFocusedNodeId;
+        if (nextFocusedNode == null) {
+            nextFocusedNodeId = INVALID_ID;
+        } else {
+            final int index = mCachedNodes.indexOfValue(nextFocusedNode);
+            nextFocusedNodeId = mCachedNodes.keyAt(index);
+        }
+
+        return requestKeyboardFocusForVirtualView(nextFocusedNodeId);
+    }
+
+    /**
+     * Obtains a best guess for the previously focused rect for keyboard focus
+     * moving in the specified direction.
+     *
+     * @param host the view into which focus is moving
+     * @param direction the absolute direction in which focus is moving
+     * @param outBounds the rect to populate with the best-guess bounds for the
+     *                  previous focus rect
+     */
+    private static Rect guessPreviouslyFocusedRect(@NonNull View host,
+            @FocusRealDirection int direction, @NonNull Rect outBounds) {
+        final int w = host.getWidth();
+        final int h = host.getHeight();
+
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                outBounds.set(w, 0, w, h);
+                break;
+            case View.FOCUS_UP:
+                outBounds.set(0, h, w, h);
+                break;
+            case View.FOCUS_RIGHT:
+                outBounds.set(-1, 0, -1, h);
+                break;
+            case View.FOCUS_DOWN:
+                outBounds.set(0, -1, w, -1);
+                break;
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+        }
+
+        return outBounds;
+    }
+
+    /**
+     * Performs a click action on the keyboard focused virtual view, if any.
+     *
+     * @return {@code true} if the click action was performed successfully or
+     *         {@code false} otherwise
+     */
+    private boolean clickKeyboardFocusedVirtualView() {
+        return mKeyboardFocusedVirtualViewId != INVALID_ID && onPerformActionForVirtualView(
+                mKeyboardFocusedVirtualViewId, AccessibilityNodeInfoCompat.ACTION_CLICK, null);
+    }
+
+    /**
      * Populates an event of the specified type with information about an item
      * and attempts to send it up through the view hierarchy.
      * <p>
      * You should call this method after performing a user action that normally
      * fires an accessibility event, such as clicking on an item.
-     *
+     * <p>
      * <pre>public void performItemClick(T item) {
      *   ...
      *   sendEventForVirtualViewId(item.id, AccessibilityEvent.TYPE_VIEW_CLICKED);
      * }
      * </pre>
      *
-     * @param virtualViewId The virtual view id for which to send an event.
-     * @param eventType The type of event to send.
-     * @return true if the event was sent successfully.
+     * @param virtualViewId the identifier of the virtual view for which to
+     *                      send an event
+     * @param eventType the type of event to send
+     * @return {@code true} if the event was sent successfully, {@code false}
+     *         otherwise
      */
-    public boolean sendEventForVirtualView(int virtualViewId, int eventType) {
+    public final boolean sendEventForVirtualView(int virtualViewId, int eventType) {
         if ((virtualViewId == INVALID_ID) || !mManager.isEnabled()) {
             return false;
         }
 
-        final ViewParent parent = mView.getParent();
+        final ViewParent parent = mHost.getParent();
         if (parent == null) {
             return false;
         }
 
         final AccessibilityEvent event = createEvent(virtualViewId, eventType);
-        return ViewParentCompat.requestSendAccessibilityEvent(parent, mView, event);
+        return ViewParentCompat.requestSendAccessibilityEvent(parent, mHost, event);
     }
 
     /**
      * Notifies the accessibility framework that the properties of the parent
      * view have changed.
      * <p>
-     * You <b>must</b> call this method after adding or removing items from the
-     * parent view.
+     * You <strong>must</strong> call this method after adding or removing
+     * items from the parent view.
      */
-    public void invalidateRoot() {
-        invalidateVirtualView(HOST_ID);
+    public final void invalidateRoot() {
+        invalidateVirtualView(HOST_ID, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE);
     }
 
     /**
      * Notifies the accessibility framework that the properties of a particular
      * item have changed.
      * <p>
-     * You <b>must</b> call this method after changing any of the properties set
-     * in {@link #onPopulateNodeForVirtualView}.
+     * You <strong>must</strong> call this method after changing any of the
+     * properties set in
+     * {@link #onPopulateNodeForVirtualView(int, AccessibilityNodeInfoCompat)}.
      *
-     * @param virtualViewId The virtual view id to invalidate.
+     * @param virtualViewId the virtual view id to invalidate, or
+     *                      {@link #HOST_ID} to invalidate the root view
+     * @see #invalidateVirtualView(int, int)
      */
-    public void invalidateVirtualView(int virtualViewId) {
-        sendEventForVirtualView(
-                virtualViewId, AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
+    public final void invalidateVirtualView(int virtualViewId) {
+        invalidateVirtualView(virtualViewId,
+                AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED);
     }
 
     /**
-     * Returns the virtual view id for the currently focused item,
+     * Notifies the accessibility framework that the properties of a particular
+     * item have changed.
+     * <p>
+     * You <strong>must</strong> call this method after changing any of the
+     * properties set in
+     * {@link #onPopulateNodeForVirtualView(int, AccessibilityNodeInfoCompat)}.
      *
-     * @return A virtual view id, or {@link #INVALID_ID} if no item is
-     *         currently focused.
+     * @param virtualViewId the virtual view id to invalidate, or
+     *                      {@link #HOST_ID} to invalidate the root view
+     * @param changeTypes the bit mask of change types. May be {@code 0} for the
+     *                    default (undefined) change type or one or more of:
+     *         <ul>
+     *         <li>{@link AccessibilityEventCompat#CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION}
+     *         <li>{@link AccessibilityEventCompat#CONTENT_CHANGE_TYPE_SUBTREE}
+     *         <li>{@link AccessibilityEventCompat#CONTENT_CHANGE_TYPE_TEXT}
+     *         <li>{@link AccessibilityEventCompat#CONTENT_CHANGE_TYPE_UNDEFINED}
+     *         </ul>
      */
+    public final void invalidateVirtualView(int virtualViewId, int changeTypes) {
+        final SparseArrayCompat<AccessibilityNodeInfoCompat> cachedNodes = mCachedNodes;
+        if (virtualViewId == HOST_ID
+                && (changeTypes & AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE) != 0) {
+            for (int i = 0, count = cachedNodes.size(); i < count; i++) {
+                cachedNodes.valueAt(i).recycle();
+            }
+            cachedNodes.clear();
+        } else {
+            final int index = cachedNodes.indexOfKey(virtualViewId);
+            if (index >= 0) {
+                cachedNodes.valueAt(index).recycle();
+                cachedNodes.removeAt(index);
+            }
+        }
+
+        if (virtualViewId != INVALID_ID && mManager.isEnabled()) {
+            final ViewParent parent = mHost.getParent();
+            if (parent != null) {
+                // Send events up the hierarchy so they can be coalesced.
+                final AccessibilityEvent event = createEvent(virtualViewId,
+                        AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
+                AccessibilityEventCompat.setContentChangeTypes(event, changeTypes);
+                ViewParentCompat.requestSendAccessibilityEvent(parent, mHost, event);
+            }
+        }
+    }
+
+    /**
+     * Returns the virtual view ID for the currently accessibility focused
+     * item.
+     *
+     * @return the identifier of the virtual view that has accessibility focus
+     *         or {@link #INVALID_ID} if no virtual view has accessibility
+     *         focus
+     * @deprecated Use {@link #getAccessibilityFocusedVirtualViewId()}.
+     */
+    @Deprecated
     public int getFocusedVirtualView() {
-        return mFocusedVirtualViewId;
+        return getAccessibilityFocusedVirtualViewId();
+    }
+
+    /**
+     * Called when the focus state of a virtual view changes.
+     *
+     * @param virtualViewId the virtual view identifier
+     * @param hasFocus      {@code true} if the view has focus, {@code false}
+     *                      otherwise
+     */
+    protected void onVirtualViewKeyboardFocusChanged(int virtualViewId, boolean hasFocus) {
+        // Stub method.
     }
 
     /**
      * Sets the currently hovered item, sending hover accessibility events as
      * necessary to maintain the correct state.
      *
-     * @param virtualViewId The virtual view id for the item currently being
-     *            hovered, or {@link #INVALID_ID} if no item is hovered within
-     *            the parent view.
+     * @param virtualViewId the virtual view id for the item currently being
+     *                      hovered, or {@link #INVALID_ID} if no item is
+     *                      hovered within the parent view
      */
     private void updateHoveredVirtualView(int virtualViewId) {
         if (mHoveredVirtualViewId == virtualViewId) {
@@ -248,11 +630,11 @@
      * Constructs and returns an {@link AccessibilityEvent} for the specified
      * virtual view id, which includes the host view ({@link #HOST_ID}).
      *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct an event.
-     * @param eventType The type of event to construct.
-     * @return An {@link AccessibilityEvent} populated with information about
-     *         the specified item.
+     * @param virtualViewId the virtual view id for the item for which to
+     *                      construct an event
+     * @param eventType the type of event to construct
+     * @return an {@link AccessibilityEvent} populated with information about
+     *         the specified item
      */
     private AccessibilityEvent createEvent(int virtualViewId, int eventType) {
         switch (virtualViewId) {
@@ -266,13 +648,17 @@
     /**
      * Constructs and returns an {@link AccessibilityEvent} for the host node.
      *
-     * @param eventType The type of event to construct.
-     * @return An {@link AccessibilityEvent} populated with information about
-     *         the specified item.
+     * @param eventType the type of event to construct
+     * @return an {@link AccessibilityEvent} populated with information about
+     *         the specified item
      */
     private AccessibilityEvent createEventForHost(int eventType) {
         final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
-        ViewCompat.onInitializeAccessibilityEvent(mView, event);
+        ViewCompat.onInitializeAccessibilityEvent(mHost, event);
+
+        // Allow the client to populate the event.
+        onPopulateEventForHost(event);
+
         return event;
     }
 
@@ -280,16 +666,24 @@
      * Constructs and returns an {@link AccessibilityEvent} populated with
      * information about the specified item.
      *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct an event.
-     * @param eventType The type of event to construct.
-     * @return An {@link AccessibilityEvent} populated with information about
-     *         the specified item.
+     * @param virtualViewId the virtual view id for the item for which to
+     *                      construct an event
+     * @param eventType the type of event to construct
+     * @return an {@link AccessibilityEvent} populated with information about
+     *         the specified item
      */
     private AccessibilityEvent createEventForChild(int virtualViewId, int eventType) {
         final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
-        event.setEnabled(true);
-        event.setClassName(DEFAULT_CLASS_NAME);
+        final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
+        final AccessibilityNodeInfoCompat node = obtainAccessibilityNodeInfo(virtualViewId);
+
+        // Allow the client to override these properties,
+        record.getText().add(node.getText());
+        record.setContentDescription(node.getContentDescription());
+        record.setScrollable(node.isScrollable());
+        record.setPassword(node.isPassword());
+        record.setEnabled(node.isEnabled());
+        record.setChecked(node.isChecked());
 
         // Allow the client to populate the event.
         onPopulateEventForVirtualView(virtualViewId, event);
@@ -301,52 +695,66 @@
         }
 
         // Don't allow the client to override these properties.
-        event.setPackageName(mView.getContext().getPackageName());
-
-        final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
-        record.setSource(mView, virtualViewId);
+        record.setClassName(node.getClassName());
+        record.setSource(mHost, virtualViewId);
+        event.setPackageName(mHost.getContext().getPackageName());
 
         return event;
     }
 
     /**
-     * Constructs and returns an {@link AccessibilityNodeInfoCompat} for the
-     * specified virtual view id, which includes the host view
-     * ({@link #HOST_ID}).
+     * Obtains a populated {@link AccessibilityNodeInfoCompat} for the
+     * virtual view with the specified identifier.
+     * <p>
+     * This method may be called with identifier {@link #HOST_ID} to obtain a
+     * node for the host view.
      *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct a node.
-     * @return An {@link AccessibilityNodeInfoCompat} populated with information
-     *         about the specified item.
+     * @param virtualViewId the identifier of the virtual view for which to
+     *                      construct a node
+     * @return an {@link AccessibilityNodeInfoCompat} populated with information
+     *         about the specified item
      */
-    private AccessibilityNodeInfoCompat createNode(int virtualViewId) {
-        switch (virtualViewId) {
-            case HOST_ID:
-                return createNodeForHost();
-            default:
-                return createNodeForChild(virtualViewId);
+    @NonNull
+    private AccessibilityNodeInfoCompat obtainAccessibilityNodeInfo(int virtualViewId) {
+        final AccessibilityNodeInfoCompat node;
+        final int cacheIndex = mCachedNodes.indexOfKey(virtualViewId);
+        if (cacheIndex >= 0) {
+            node = mCachedNodes.valueAt(cacheIndex);
+        } else if (virtualViewId == HOST_ID) {
+            node = createNodeForHost();
+        } else {
+            node = createNodeForChild(virtualViewId);
         }
+
+        mCachedNodes.put(virtualViewId, node);
+
+        return node;
     }
 
     /**
      * Constructs and returns an {@link AccessibilityNodeInfoCompat} for the
      * host view populated with its virtual descendants.
      *
-     * @return An {@link AccessibilityNodeInfoCompat} for the parent node.
+     * @return an {@link AccessibilityNodeInfoCompat} for the parent node
      */
+    @NonNull
     private AccessibilityNodeInfoCompat createNodeForHost() {
-        final AccessibilityNodeInfoCompat node = AccessibilityNodeInfoCompat.obtain(mView);
-        ViewCompat.onInitializeAccessibilityNodeInfo(mView, node);
+        final AccessibilityNodeInfoCompat node = AccessibilityNodeInfoCompat.obtain(mHost);
+        ViewCompat.onInitializeAccessibilityNodeInfo(mHost, node);
+        final int realNodeCount = node.getChildCount();
 
         // Allow the client to populate the host node.
         onPopulateNodeForHost(node);
 
         // Add the virtual descendants.
-        final LinkedList<Integer> virtualViewIds = new LinkedList<Integer>();
+        final ArrayList<Integer> virtualViewIds = new ArrayList<>();
         getVisibleVirtualViews(virtualViewIds);
+        if (realNodeCount > 0 && virtualViewIds.size() > 0) {
+            throw new RuntimeException("Views cannot have both real and virtual children");
+        }
 
-        for (Integer childVirtualViewId : virtualViewIds) {
-            node.addChild(mView, childVirtualViewId);
+        for (int i = 0, count = virtualViewIds.size(); i < count; i++) {
+            node.addChild(mHost, virtualViewIds.get(i));
         }
 
         return node;
@@ -376,15 +784,17 @@
      * <li>{@link AccessibilityNodeInfoCompat#setBoundsInParent}
      * </ul>
      *
-     * @param virtualViewId The virtual view id for item for which to construct
-     *            a node.
-     * @return An {@link AccessibilityNodeInfoCompat} for the specified item.
+     * @param virtualViewId the virtual view id for item for which to construct
+     *                      a node
+     * @return an {@link AccessibilityNodeInfoCompat} for the specified item
      */
+    @NonNull
     private AccessibilityNodeInfoCompat createNodeForChild(int virtualViewId) {
         final AccessibilityNodeInfoCompat node = AccessibilityNodeInfoCompat.obtain();
 
         // Ensure the client has good defaults.
         node.setEnabled(true);
+        node.setFocusable(true);
         node.setClassName(DEFAULT_CLASS_NAME);
 
         // Allow the client to populate the node.
@@ -413,12 +823,12 @@
         }
 
         // Don't allow the client to override these properties.
-        node.setPackageName(mView.getContext().getPackageName());
-        node.setSource(mView, virtualViewId);
-        node.setParent(mView);
+        node.setPackageName(mHost.getContext().getPackageName());
+        node.setSource(mHost, virtualViewId);
+        node.setParent(mHost);
 
         // Manage internal accessibility focus state.
-        if (mFocusedVirtualViewId == virtualViewId) {
+        if (mAccessibilityFocusedVirtualViewId == virtualViewId) {
             node.setAccessibilityFocused(true);
             node.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
         } else {
@@ -426,6 +836,15 @@
             node.addAction(AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS);
         }
 
+        // Manage internal keyboard focus state.
+        final boolean isFocused = mKeyboardFocusedVirtualViewId == virtualViewId;
+        if (isFocused) {
+            node.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS);
+        } else if (node.isFocusable()) {
+            node.addAction(AccessibilityNodeInfoCompat.ACTION_FOCUS);
+        }
+        node.setFocused(isFocused);
+
         // Set the visibility based on the parent bound.
         if (intersectVisibleToUser(mTempParentRect)) {
             node.setVisibleToUser(true);
@@ -433,7 +852,7 @@
         }
 
         // Calculate screen-relative bound.
-        mView.getLocationOnScreen(mTempGlobalRect);
+        mHost.getLocationOnScreen(mTempGlobalRect);
         final int offsetX = mTempGlobalRect[0];
         final int offsetY = mTempGlobalRect[1];
         mTempScreenRect.set(mTempParentRect);
@@ -453,27 +872,21 @@
     }
 
     private boolean performActionForHost(int action, Bundle arguments) {
-        return ViewCompat.performAccessibilityAction(mView, action, arguments);
+        return ViewCompat.performAccessibilityAction(mHost, action, arguments);
     }
 
     private boolean performActionForChild(int virtualViewId, int action, Bundle arguments) {
         switch (action) {
             case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS:
-            case AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
-                return manageFocusForChild(virtualViewId, action, arguments);
-            default:
-                return onPerformActionForVirtualView(virtualViewId, action, arguments);
-        }
-    }
-
-    private boolean manageFocusForChild(int virtualViewId, int action, Bundle arguments) {
-        switch (action) {
-            case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS:
                 return requestAccessibilityFocus(virtualViewId);
             case AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
                 return clearAccessibilityFocus(virtualViewId);
+            case AccessibilityNodeInfoCompat.ACTION_FOCUS:
+                return requestKeyboardFocusForVirtualView(virtualViewId);
+            case AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS:
+                return clearKeyboardFocusForVirtualView(virtualViewId);
             default:
-                return false;
+                return onPerformActionForVirtualView(virtualViewId, action, arguments);
         }
     }
 
@@ -482,8 +895,8 @@
      * portion of its parent {@link View}. Modifies {@code localRect} to contain
      * only the visible portion.
      *
-     * @param localRect A rectangle in local (parent) coordinates.
-     * @return Whether the specified {@link Rect} is visible on the screen.
+     * @param localRect a rectangle in local (parent) coordinates
+     * @return whether the specified {@link Rect} is visible on the screen
      */
     private boolean intersectVisibleToUser(Rect localRect) {
         // Missing or empty bounds mean this view is not visible.
@@ -492,12 +905,12 @@
         }
 
         // Attached to invisible window means this view is not visible.
-        if (mView.getWindowVisibility() != View.VISIBLE) {
+        if (mHost.getWindowVisibility() != View.VISIBLE) {
             return false;
         }
 
         // An invisible predecessor means that this view is not visible.
-        ViewParent viewParent = mView.getParent();
+        ViewParent viewParent = mHost.getParent();
         while (viewParent instanceof View) {
             final View view = (View) viewParent;
             if ((ViewCompat.getAlpha(view) <= 0) || (view.getVisibility() != View.VISIBLE)) {
@@ -512,7 +925,7 @@
         }
 
         // If no portion of the parent is visible, this view is not visible.
-        if (!mView.getLocalVisibleRect(mTempVisibleRect)) {
+        if (!mHost.getLocalVisibleRect(mTempVisibleRect)) {
             return false;
         }
 
@@ -521,15 +934,6 @@
     }
 
     /**
-     * Returns whether this virtual view is accessibility focused.
-     *
-     * @return True if the view is accessibility focused.
-     */
-    private boolean isAccessibilityFocused(int virtualViewId) {
-        return (mFocusedVirtualViewId == virtualViewId);
-    }
-
-    /**
      * Attempts to give accessibility focus to a virtual view.
      * <p>
      * A virtual view will not actually take focus if
@@ -537,9 +941,9 @@
      * {@link AccessibilityManager#isTouchExplorationEnabled()} returns false,
      * or the view already has accessibility focus.
      *
-     * @param virtualViewId The id of the virtual view on which to place
-     *            accessibility focus.
-     * @return Whether this virtual view actually took accessibility focus.
+     * @param virtualViewId the identifier of the virtual view on which to
+     *                      place accessibility focus
+     * @return whether this virtual view actually took accessibility focus
      */
     private boolean requestAccessibilityFocus(int virtualViewId) {
         if (!mManager.isEnabled()
@@ -547,18 +951,17 @@
             return false;
         }
         // TODO: Check virtual view visibility.
-        if (!isAccessibilityFocused(virtualViewId)) {
+        if (mAccessibilityFocusedVirtualViewId != virtualViewId) {
             // Clear focus from the previously focused view, if applicable.
-            if (mFocusedVirtualViewId != INVALID_ID) {
-                sendEventForVirtualView(mFocusedVirtualViewId,
-                        AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
+            if (mAccessibilityFocusedVirtualViewId != INVALID_ID) {
+                clearAccessibilityFocus(mAccessibilityFocusedVirtualViewId);
             }
 
             // Set focus on the new view.
-            mFocusedVirtualViewId = virtualViewId;
+            mAccessibilityFocusedVirtualViewId = virtualViewId;
 
             // TODO: Only invalidate virtual view bounds.
-            mView.invalidate();
+            mHost.invalidate();
             sendEventForVirtualView(virtualViewId,
                     AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
             return true;
@@ -569,14 +972,14 @@
     /**
      * Attempts to clear accessibility focus from a virtual view.
      *
-     * @param virtualViewId The id of the virtual view from which to clear
-     *            accessibility focus.
-     * @return Whether this virtual view actually cleared accessibility focus.
+     * @param virtualViewId the identifier of the virtual view from which to
+     *                      clear accessibility focus
+     * @return whether this virtual view actually cleared accessibility focus
      */
     private boolean clearAccessibilityFocus(int virtualViewId) {
-        if (isAccessibilityFocused(virtualViewId)) {
-            mFocusedVirtualViewId = INVALID_ID;
-            mView.invalidate();
+        if (mAccessibilityFocusedVirtualViewId == virtualViewId) {
+            mAccessibilityFocusedVirtualViewId = INVALID_ID;
+            mHost.invalidate();
             sendEventForVirtualView(virtualViewId,
                     AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
             return true;
@@ -585,6 +988,57 @@
     }
 
     /**
+     * Attempts to give keyboard focus to a virtual view.
+     *
+     * @param virtualViewId the identifier of the virtual view on which to
+     *                      place keyboard focus
+     * @return whether this virtual view actually took keyboard focus
+     */
+    public final boolean requestKeyboardFocusForVirtualView(int virtualViewId) {
+        if (!mHost.isFocused() && !mHost.requestFocus()) {
+            // Host must have real keyboard focus.
+            return false;
+        }
+
+        if (mKeyboardFocusedVirtualViewId == virtualViewId) {
+            // The virtual view already has focus.
+            return false;
+        }
+
+        if (mKeyboardFocusedVirtualViewId != INVALID_ID) {
+            clearKeyboardFocusForVirtualView(mKeyboardFocusedVirtualViewId);
+        }
+
+        mKeyboardFocusedVirtualViewId = virtualViewId;
+
+        onVirtualViewKeyboardFocusChanged(virtualViewId, true);
+        sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_FOCUSED);
+
+        return true;
+    }
+
+    /**
+     * Attempts to clear keyboard focus from a virtual view.
+     *
+     * @param virtualViewId the identifier of the virtual view from which to
+     *                      clear keyboard focus
+     * @return whether this virtual view actually cleared keyboard focus
+     */
+    public final boolean clearKeyboardFocusForVirtualView(int virtualViewId) {
+        if (mKeyboardFocusedVirtualViewId != virtualViewId) {
+            // The virtual view is not focused.
+            return false;
+        }
+
+        mKeyboardFocusedVirtualViewId = INVALID_ID;
+
+        onVirtualViewKeyboardFocusChanged(virtualViewId, false);
+        sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_FOCUSED);
+
+        return true;
+    }
+
+    /**
      * Provides a mapping between view-relative coordinates and logical
      * items.
      *
@@ -609,22 +1063,25 @@
      * Populates an {@link AccessibilityEvent} with information about the
      * specified item.
      * <p>
-     * Implementations <b>must</b> populate the following required fields:
+     * The helper class automatically populates the following fields based on
+     * the values set by
+     * {@link #onPopulateNodeForVirtualView(int, AccessibilityNodeInfoCompat)},
+     * but implementations may optionally override them:
      * <ul>
-     * <li>event text, see {@link AccessibilityEvent#getText} or
-     * {@link AccessibilityEvent#setContentDescription}
-     * </ul>
-     * <p>
-     * The helper class automatically populates the following fields with
-     * default values, but implementations may optionally override them:
-     * <ul>
-     * <li>item class name, set to android.view.View, see
-     * {@link AccessibilityEvent#setClassName}
+     * <li>event text, see {@link AccessibilityEvent#getText()}
+     * <li>content description, see
+     * {@link AccessibilityEvent#setContentDescription(CharSequence)}
+     * <li>scrollability, see {@link AccessibilityEvent#setScrollable(boolean)}
+     * <li>password state, see {@link AccessibilityEvent#setPassword(boolean)}
+     * <li>enabled state, see {@link AccessibilityEvent#setEnabled(boolean)}
+     * <li>checked state, see {@link AccessibilityEvent#setChecked(boolean)}
      * </ul>
      * <p>
      * The following required fields are automatically populated by the
      * helper class and may not be overridden:
      * <ul>
+     * <li>item class name, set to the value used in
+     * {@link #onPopulateNodeForVirtualView(int, AccessibilityNodeInfoCompat)}
      * <li>package name, set to the package of the host view's
      * {@link Context}, see {@link AccessibilityEvent#setPackageName}
      * <li>event source, set to the host view and virtual view identifier,
@@ -635,55 +1092,76 @@
      *            populate the event
      * @param event The event to populate
      */
-    protected abstract void onPopulateEventForVirtualView(
-            int virtualViewId, AccessibilityEvent event);
+    protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+        // Default implementation is no-op.
+    }
+
+    /**
+     * Populates an {@link AccessibilityEvent} with information about the host
+     * view.
+     * <p>
+     * The default implementation is a no-op.
+     *
+     * @param event the event to populate with information about the host view
+     */
+    protected void onPopulateEventForHost(AccessibilityEvent event) {
+        // Default implementation is no-op.
+    }
 
     /**
      * Populates an {@link AccessibilityNodeInfoCompat} with information
      * about the specified item.
      * <p>
-     * Implementations <b>must</b> populate the following required fields:
+     * Implementations <strong>must</strong> populate the following required
+     * fields:
      * <ul>
-     * <li>event text, see {@link AccessibilityNodeInfoCompat#setText} or
-     * {@link AccessibilityNodeInfoCompat#setContentDescription}
+     * <li>event text, see
+     * {@link AccessibilityNodeInfoCompat#setText(CharSequence)} or
+     * {@link AccessibilityNodeInfoCompat#setContentDescription(CharSequence)}
      * <li>bounds in parent coordinates, see
-     * {@link AccessibilityNodeInfoCompat#setBoundsInParent}
+     * {@link AccessibilityNodeInfoCompat#setBoundsInParent(Rect)}
      * </ul>
      * <p>
      * The helper class automatically populates the following fields with
      * default values, but implementations may optionally override them:
      * <ul>
-     * <li>enabled state, set to true, see
-     * {@link AccessibilityNodeInfoCompat#setEnabled}
-     * <li>item class name, identical to the class name set by
-     * {@link #onPopulateEventForVirtualView}, see
-     * {@link AccessibilityNodeInfoCompat#setClassName}
+     * <li>enabled state, set to {@code true}, see
+     * {@link AccessibilityNodeInfoCompat#setEnabled(boolean)}
+     * <li>keyboard focusability, set to {@code true}, see
+     * {@link AccessibilityNodeInfoCompat#setFocusable(boolean)}
+     * <li>item class name, set to {@code android.view.View}, see
+     * {@link AccessibilityNodeInfoCompat#setClassName(CharSequence)}
      * </ul>
      * <p>
      * The following required fields are automatically populated by the
      * helper class and may not be overridden:
      * <ul>
      * <li>package name, identical to the package name set by
-     * {@link #onPopulateEventForVirtualView}, see
+     * {@link #onPopulateEventForVirtualView(int, AccessibilityEvent)}, see
      * {@link AccessibilityNodeInfoCompat#setPackageName}
      * <li>node source, identical to the event source set in
-     * {@link #onPopulateEventForVirtualView}, see
+     * {@link #onPopulateEventForVirtualView(int, AccessibilityEvent)}, see
      * {@link AccessibilityNodeInfoCompat#setSource(View, int)}
      * <li>parent view, set to the host view, see
      * {@link AccessibilityNodeInfoCompat#setParent(View)}
      * <li>visibility, computed based on parent-relative bounds, see
-     * {@link AccessibilityNodeInfoCompat#setVisibleToUser}
+     * {@link AccessibilityNodeInfoCompat#setVisibleToUser(boolean)}
      * <li>accessibility focus, computed based on internal helper state, see
-     * {@link AccessibilityNodeInfoCompat#setAccessibilityFocused}
+     * {@link AccessibilityNodeInfoCompat#setAccessibilityFocused(boolean)}
+     * <li>keyboard focus, computed based on internal helper state, see
+     * {@link AccessibilityNodeInfoCompat#setFocused(boolean)}
      * <li>bounds in screen coordinates, computed based on host view bounds,
-     * see {@link AccessibilityNodeInfoCompat#setBoundsInScreen}
+     * see {@link AccessibilityNodeInfoCompat#setBoundsInScreen(Rect)}
      * </ul>
      * <p>
-     * Additionally, the helper class automatically handles accessibility
-     * focus management by adding the appropriate
-     * {@link AccessibilityNodeInfoCompat#ACTION_ACCESSIBILITY_FOCUS} or
+     * Additionally, the helper class automatically handles keyboard focus and
+     * accessibility focus management by adding the appropriate
+     * {@link AccessibilityNodeInfoCompat#ACTION_FOCUS},
+     * {@link AccessibilityNodeInfoCompat#ACTION_CLEAR_FOCUS},
+     * {@link AccessibilityNodeInfoCompat#ACTION_ACCESSIBILITY_FOCUS}, or
      * {@link AccessibilityNodeInfoCompat#ACTION_CLEAR_ACCESSIBILITY_FOCUS}
-     * action. Implementations must <b>never</b> manually add these actions.
+     * actions. Implementations must <strong>never</strong> manually add these
+     * actions.
      * <p>
      * The helper class also automatically modifies parent- and
      * screen-relative bounds to reflect the portion of the item visible
@@ -700,10 +1178,11 @@
      * Populates an {@link AccessibilityNodeInfoCompat} with information
      * about the host view.
      * <p>
-     * The following required fields are automatically populated by the
-     * helper class and may not be overridden:
+     * The default implementation is a no-op.
+     *
+     * @param node the node to populate with information about the host view
      */
-    public void onPopulateNodeForHost(AccessibilityNodeInfoCompat node) {
+    protected void onPopulateNodeForHost(AccessibilityNodeInfoCompat node) {
         // Default implementation is no-op.
     }
 
@@ -713,8 +1192,9 @@
      * {@link AccessibilityNodeInfoCompat#performAction(int, Bundle)} for
      * more information.
      * <p>
-     * Implementations <b>must</b> handle any actions added manually in
-     * {@link #onPopulateNodeForVirtualView}.
+     * Implementations <strong>must</strong> handle any actions added manually
+     * in
+     * {@link #onPopulateNodeForVirtualView(int, AccessibilityNodeInfoCompat)}.
      * <p>
      * The helper class automatically handles focus management resulting
      * from {@link AccessibilityNodeInfoCompat#ACTION_ACCESSIBILITY_FOCUS}
@@ -733,13 +1213,16 @@
             int virtualViewId, int action, Bundle arguments);
 
     /**
-     * Exposes a virtual view hierarchy to the accessibility framework. Only
-     * used in API 16+.
+     * Exposes a virtual view hierarchy to the accessibility framework.
      */
-    private class ExploreByTouchNodeProvider extends AccessibilityNodeProviderCompat {
+    private class MyNodeProvider extends AccessibilityNodeProviderCompat {
         @Override
         public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) {
-            return ExploreByTouchHelper.this.createNode(virtualViewId);
+            // The caller takes ownership of the node and is expected to
+            // recycle it when done, so always return a copy.
+            final AccessibilityNodeInfoCompat node =
+                    ExploreByTouchHelper.this.obtainAccessibilityNodeInfo(virtualViewId);
+            return AccessibilityNodeInfoCompat.obtain(node);
         }
 
         @Override
diff --git a/v4/java/android/support/v4/widget/FocusStrategy.java b/v4/java/android/support/v4/widget/FocusStrategy.java
new file mode 100644
index 0000000..8be9f1a
--- /dev/null
+++ b/v4/java/android/support/v4/widget/FocusStrategy.java
@@ -0,0 +1,454 @@
+/*
+ * 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.widget;
+
+import android.graphics.Rect;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import android.support.v4.view.ViewCompat.FocusRealDirection;
+import android.support.v4.view.ViewCompat.FocusRelativeDirection;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+/**
+ * Implements absolute and relative focus movement strategies. Adapted from
+ * android.view.FocusFinder to work with generic collections of bounded items.
+ */
+class FocusStrategy {
+    public static <L,T> T findNextFocusInRelativeDirection(@NonNull L focusables,
+            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
+            @Nullable T focused, @FocusRelativeDirection int direction, boolean isLayoutRtl,
+            boolean wrap) {
+        final int count = collectionAdapter.size(focusables);
+        final ArrayList<T> sortedFocusables = new ArrayList<>(count);
+        for (int i = 0; i < count; i++) {
+            sortedFocusables.add(collectionAdapter.get(focusables, i));
+        }
+
+        final SequentialComparator<T> comparator = new SequentialComparator<>(isLayoutRtl, adapter);
+        Collections.sort(sortedFocusables, comparator);
+
+        switch (direction) {
+            case View.FOCUS_FORWARD:
+                return getNextFocusable(focused, sortedFocusables, wrap);
+            case View.FOCUS_BACKWARD:
+                return getPreviousFocusable(focused, sortedFocusables, wrap);
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_FORWARD, FOCUS_BACKWARD}.");
+        }
+    }
+
+    private static <T> T getNextFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
+        final int count = focusables.size();
+
+        // The position of the next focusable item, which is the first item if
+        // no item is currently focused.
+        final int position = (focused == null ? -1 : focusables.lastIndexOf(focused)) + 1;
+        if (position < count) {
+            return focusables.get(position);
+        } else if (wrap && count > 0) {
+            return focusables.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    private static <T> T getPreviousFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
+        final int count = focusables.size();
+
+        // The position of the previous focusable item, which is the last item
+        // if no item is currently focused.
+        final int position = (focused == null ? count : focusables.indexOf(focused)) - 1;
+        if (position >= 0) {
+            return focusables.get(position);
+        } else if (wrap && count > 0) {
+            return focusables.get(count - 1);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Sorts views according to their visual layout and geometry for default tab order.
+     * This is used for sequential focus traversal.
+     */
+    private static class SequentialComparator<T> implements Comparator<T> {
+        private final Rect mTemp1 = new Rect();
+        private final Rect mTemp2 = new Rect();
+
+        private final boolean mIsLayoutRtl;
+        private final BoundsAdapter<T> mAdapter;
+
+        public SequentialComparator(boolean isLayoutRtl, BoundsAdapter<T> adapter) {
+            mIsLayoutRtl = isLayoutRtl;
+            mAdapter = adapter;
+        }
+
+        public int compare(T first, T second) {
+            final Rect firstRect = mTemp1;
+            final Rect secondRect = mTemp2;
+
+            mAdapter.obtainBounds(first, firstRect);
+            mAdapter.obtainBounds(second, secondRect);
+
+            if (firstRect.top < secondRect.top) {
+                return -1;
+            } else if (firstRect.top > secondRect.top) {
+                return 1;
+            } else if (firstRect.left < secondRect.left) {
+                return mIsLayoutRtl ? 1 : -1;
+            } else if (firstRect.left > secondRect.left) {
+                return mIsLayoutRtl ? -1 : 1;
+            } else if (firstRect.bottom < secondRect.bottom) {
+                return -1;
+            } else if (firstRect.bottom > secondRect.bottom) {
+                return 1;
+            } else if (firstRect.right < secondRect.right) {
+                return mIsLayoutRtl ? 1 : -1;
+            } else if (firstRect.right > secondRect.right) {
+                return mIsLayoutRtl ? -1 : 1;
+            } else {
+                // The view are distinct but completely coincident so we
+                // consider them equal for our purposes. Since the sort is
+                // stable, this means that the views will retain their
+                // layout order relative to one another.
+                return 0;
+            }
+        }
+    }
+
+    public static <L,T> T findNextFocusInAbsoluteDirection(@NonNull L focusables,
+            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
+            @Nullable T focused, @NonNull Rect focusedRect, int direction) {
+        // Initialize the best candidate to something impossible so that
+        // the first plausible view will become the best choice.
+        final Rect bestCandidateRect = new Rect(focusedRect);
+
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                bestCandidateRect.offset(focusedRect.width() + 1, 0);
+                break;
+            case View.FOCUS_RIGHT:
+                bestCandidateRect.offset(-(focusedRect.width() + 1), 0);
+                break;
+            case View.FOCUS_UP:
+                bestCandidateRect.offset(0, focusedRect.height() + 1);
+                break;
+            case View.FOCUS_DOWN:
+                bestCandidateRect.offset(0, -(focusedRect.height() + 1));
+                break;
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+        }
+
+        T closest = null;
+
+        final int count = collectionAdapter.size(focusables);
+        final Rect focusableRect = new Rect();
+        for (int i = 0; i < count; i++) {
+            final T focusable = collectionAdapter.get(focusables, i);
+            if (focusable == focused) {
+                continue;
+            }
+
+            // get focus bounds of other view
+            adapter.obtainBounds(focusable, focusableRect);
+            if (isBetterCandidate(direction, focusedRect, focusableRect, bestCandidateRect)) {
+                bestCandidateRect.set(focusableRect);
+                closest = focusable;
+            }
+        }
+
+        return closest;
+    }
+
+    /**
+     * Is candidate a better candidate than currentBest for a focus search
+     * in a particular direction from a source rect? This is the core
+     * routine that determines the order of focus searching.
+     *
+     * @param direction   the direction (up, down, left, right)
+     * @param source      the source from which we are searching
+     * @param candidate   the candidate rectangle
+     * @param currentBest the current best rectangle
+     * @return {@code true} if the candidate rectangle is a better than the
+     * current best rectangle, {@code false} otherwise
+     */
+    private static boolean isBetterCandidate(
+            @FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect candidate, @NonNull Rect currentBest) {
+        // To be a better candidate, need to at least be a candidate in the
+        // first place. :)
+        if (!isCandidate(source, candidate, direction)) {
+            return false;
+        }
+
+        // We know that candidateRect is a candidate. If currentBest is not
+        // a candidate, candidateRect is better.
+        if (!isCandidate(source, currentBest, direction)) {
+            return true;
+        }
+
+        // If candidateRect is better by beam, it wins.
+        if (beamBeats(direction, source, candidate, currentBest)) {
+            return true;
+        }
+
+        // If currentBest is better, then candidateRect cant' be. :)
+        if (beamBeats(direction, source, currentBest, candidate)) {
+            return false;
+        }
+
+        // Otherwise, do fudge-tastic comparison of the major and minor
+        // axis.
+        final int candidateDist = getWeightedDistanceFor(
+                majorAxisDistance(direction, source, candidate),
+                minorAxisDistance(direction, source, candidate));
+        final int currentBestDist = getWeightedDistanceFor(
+                majorAxisDistance(direction, source, currentBest),
+                minorAxisDistance(direction, source, currentBest));
+        return candidateDist < currentBestDist;
+    }
+
+    /**
+     * One rectangle may be another candidate than another by virtue of
+     * being exclusively in the beam of the source rect.
+     *
+     * @return whether rect1 is a better candidate than rect2 by virtue of
+     * it being in source's beam
+     */
+    private static boolean beamBeats(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect rect1, @NonNull Rect rect2) {
+        final boolean rect1InSrcBeam = beamsOverlap(direction, source, rect1);
+        final boolean rect2InSrcBeam = beamsOverlap(direction, source, rect2);
+
+        // If rect1 isn't exclusively in the src beam, it doesn't win.
+        if (rect2InSrcBeam || !rect1InSrcBeam) {
+            return false;
+        }
+
+        // We know rect1 is in the beam, and rect2 is not.
+
+        // If rect1 is to the direction of, and rect2 is not, rect1 wins.
+        // For example, for direction left, if rect1 is to the left of the
+        // source and rect2 is below, then we always prefer the in beam
+        // rect1, since rect2 could be reached by going down.
+        if (!isToDirectionOf(direction, source, rect2)) {
+            return true;
+        }
+
+        // For horizontal directions, being exclusively in beam always
+        // wins.
+        if (direction == View.FOCUS_LEFT || direction == View.FOCUS_RIGHT) {
+            return true;
+        }
+
+        // For vertical directions, beams only beat up to a point: now, as
+        // long as rect2 isn't completely closer, rect1 wins, e.g. for
+        // direction down, completely closer means for rect2's top edge to
+        // be closer to the source's top edge than rect1's bottom edge.
+        return majorAxisDistance(direction, source, rect1)
+                < majorAxisDistanceToFarEdge(direction, source, rect2);
+    }
+
+    /**
+     * Fudge-factor opportunity: how to calculate distance given major and
+     * minor axis distances.
+     * <p/>
+     * Warning: this fudge factor is finely tuned, be sure to run all focus
+     * tests if you dare tweak it.
+     */
+    private static int getWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance) {
+        return 13 * majorAxisDistance * majorAxisDistance
+                + minorAxisDistance * minorAxisDistance;
+    }
+
+    /**
+     * Is destRect a candidate for the next focus given the direction? This
+     * checks whether the dest is at least partially to the direction of
+     * (e.g. left of) from source.
+     * <p/>
+     * Includes an edge case for an empty rect,which is used in some cases
+     * when searching from a point on the screen.
+     */
+    private static boolean isCandidate(@NonNull Rect srcRect, @NonNull Rect destRect,
+            @FocusRealDirection int direction) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return (srcRect.right > destRect.right || srcRect.left >= destRect.right)
+                        && srcRect.left > destRect.left;
+            case View.FOCUS_RIGHT:
+                return (srcRect.left < destRect.left || srcRect.right <= destRect.left)
+                        && srcRect.right < destRect.right;
+            case View.FOCUS_UP:
+                return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom)
+                        && srcRect.top > destRect.top;
+            case View.FOCUS_DOWN:
+                return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top)
+                        && srcRect.bottom < destRect.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+
+    /**
+     * Do the "beams" w.r.t the given direction's axis of rect1 and rect2 overlap?
+     *
+     * @param direction the direction (up, down, left, right)
+     * @param rect1     the first rectangle
+     * @param rect2     the second rectangle
+     * @return whether the beams overlap
+     */
+    private static boolean beamsOverlap(@FocusRealDirection int direction,
+            @NonNull Rect rect1, @NonNull Rect rect2) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+            case View.FOCUS_RIGHT:
+                return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom);
+            case View.FOCUS_UP:
+            case View.FOCUS_DOWN:
+                return (rect2.right >= rect1.left) && (rect2.left <= rect1.right);
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * e.g for left, is 'to left of'
+     */
+    private static boolean isToDirectionOf(@FocusRealDirection int direction,
+            @NonNull Rect src, @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return src.left >= dest.right;
+            case View.FOCUS_RIGHT:
+                return src.right <= dest.left;
+            case View.FOCUS_UP:
+                return src.top >= dest.bottom;
+            case View.FOCUS_DOWN:
+                return src.bottom <= dest.top;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * @return the distance from the edge furthest in the given direction
+     * of source to the edge nearest in the given direction of
+     * dest. If the dest is not in the direction from source,
+     * returns 0.
+     */
+    private static int majorAxisDistance(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        return Math.max(0, majorAxisDistanceRaw(direction, source, dest));
+    }
+
+    private static int majorAxisDistanceRaw(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return source.left - dest.right;
+            case View.FOCUS_RIGHT:
+                return dest.left - source.right;
+            case View.FOCUS_UP:
+                return source.top - dest.bottom;
+            case View.FOCUS_DOWN:
+                return dest.top - source.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * @return the distance along the major axis w.r.t the direction from
+     * the edge of source to the far edge of dest. If the dest is
+     * not in the direction from source, returns 1 to break ties
+     * with {@link #majorAxisDistance}.
+     */
+    private static int majorAxisDistanceToFarEdge(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        return Math.max(1, majorAxisDistanceToFarEdgeRaw(direction, source, dest));
+    }
+
+    private static int majorAxisDistanceToFarEdgeRaw(
+            @FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return source.left - dest.left;
+            case View.FOCUS_RIGHT:
+                return dest.right - source.right;
+            case View.FOCUS_UP:
+                return source.top - dest.top;
+            case View.FOCUS_DOWN:
+                return dest.bottom - source.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * Finds the distance on the minor axis w.r.t the direction to the
+     * nearest edge of the destination rectangle.
+     *
+     * @param direction the direction (up, down, left, right)
+     * @param source the source rect
+     * @param dest the destination rect
+     * @return the distance
+     */
+    private static int minorAxisDistance(@FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+            case View.FOCUS_RIGHT:
+                // the distance between the center verticals
+                return Math.abs(
+                        ((source.top + source.height() / 2) -
+                                ((dest.top + dest.height() / 2))));
+            case View.FOCUS_UP:
+            case View.FOCUS_DOWN:
+                // the distance between the center horizontals
+                return Math.abs(
+                        ((source.left + source.width() / 2) -
+                                ((dest.left + dest.width() / 2))));
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * Adapter used to obtain bounds from a generic data type.
+     */
+    public interface BoundsAdapter<T> {
+        void obtainBounds(T data, Rect outBounds);
+    }
+
+    /**
+     * Adapter used to obtain items from a generic collection type.
+     */
+    public interface CollectionAdapter<T, V> {
+        V get(T collection, int index);
+        int size(T collection);
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ListPopupWindowCompat.java b/v4/java/android/support/v4/widget/ListPopupWindowCompat.java
index 44222bc..8d34312 100644
--- a/v4/java/android/support/v4/widget/ListPopupWindowCompat.java
+++ b/v4/java/android/support/v4/widget/ListPopupWindowCompat.java
@@ -23,7 +23,7 @@
  * Helper for accessing features in ListPopupWindow introduced after API level 4
  * in a backwards compatible fashion.
  */
-public class ListPopupWindowCompat {
+public final class ListPopupWindowCompat {
     /**
      * Interface for the full API.
      */
diff --git a/v4/java/android/support/v4/widget/NestedScrollView.java b/v4/java/android/support/v4/widget/NestedScrollView.java
index 27e4307..778624f 100644
--- a/v4/java/android/support/v4/widget/NestedScrollView.java
+++ b/v4/java/android/support/v4/widget/NestedScrollView.java
@@ -46,7 +46,6 @@
 import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewConfiguration;
-import android.view.ViewDebug;
 import android.view.ViewGroup;
 import android.view.ViewParent;
 import android.view.accessibility.AccessibilityEvent;
@@ -355,7 +354,7 @@
     }
 
     private void initScrollView() {
-        mScroller = new ScrollerCompat(getContext(), null);
+        mScroller = ScrollerCompat.create(getContext(), null);
         setFocusable(true);
         setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
         setWillNotDraw(false);
@@ -683,10 +682,12 @@
                 initOrResetVelocityTracker();
                 mVelocityTracker.addMovement(ev);
                 /*
-                * If being flinged and user touches the screen, initiate drag;
-                * otherwise don't.  mScroller.isFinished should be false when
-                * being flinged.
+                 * If being flinged and user touches the screen, initiate drag;
+                 * otherwise don't. mScroller.isFinished should be false when
+                 * being flinged. We need to call computeScrollOffset() first so that
+                 * isFinished() is correct.
                 */
+                mScroller.computeScrollOffset();
                 mIsBeingDragged = !mScroller.isFinished();
                 startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
                 break;
diff --git a/v4/java/android/support/v4/widget/PopupMenuCompat.java b/v4/java/android/support/v4/widget/PopupMenuCompat.java
index db0e2c9..1202cbf 100644
--- a/v4/java/android/support/v4/widget/PopupMenuCompat.java
+++ b/v4/java/android/support/v4/widget/PopupMenuCompat.java
@@ -22,7 +22,7 @@
  * Helper for accessing features in PopupMenu introduced after API level 4 in a
  * backwards compatible fashion.
  */
-public class PopupMenuCompat {
+public final class PopupMenuCompat {
     /**
      * Interface for the full API.
      */
diff --git a/v4/java/android/support/v4/widget/PopupWindowCompat.java b/v4/java/android/support/v4/widget/PopupWindowCompat.java
index 7f4c828..17fc95b 100644
--- a/v4/java/android/support/v4/widget/PopupWindowCompat.java
+++ b/v4/java/android/support/v4/widget/PopupWindowCompat.java
@@ -24,7 +24,7 @@
  * Helper for accessing features in PopupWindow introduced after API level 4
  * in a backwards compatible fashion.
  */
-public class PopupWindowCompat {
+public final class PopupWindowCompat {
     /**
      * Interface for the full API.
      */
diff --git a/v4/java/android/support/v4/widget/ScrollerCompat.java b/v4/java/android/support/v4/widget/ScrollerCompat.java
index 3115a41..693346c 100644
--- a/v4/java/android/support/v4/widget/ScrollerCompat.java
+++ b/v4/java/android/support/v4/widget/ScrollerCompat.java
@@ -29,7 +29,7 @@
  * current device's preferred scroll physics and fling behavior. It offers a subset of
  * the APIs from Scroller or OverScroller.</p>
  */
-public class ScrollerCompat {
+public final class ScrollerCompat {
     private static final String TAG = "ScrollerCompat";
 
     Object mScroller;
@@ -262,12 +262,7 @@
     }
 
     public static ScrollerCompat create(Context context, Interpolator interpolator) {
-        return new ScrollerCompat(context, interpolator);
-    }
-
-    ScrollerCompat(Context context, Interpolator interpolator) {
-        this(Build.VERSION.SDK_INT, context, interpolator);
-
+        return new ScrollerCompat(Build.VERSION.SDK_INT, context, interpolator);
     }
 
     /**
diff --git a/v4/java/android/support/v4/widget/SearchViewCompat.java b/v4/java/android/support/v4/widget/SearchViewCompat.java
index c51ecf2..297ee84 100644
--- a/v4/java/android/support/v4/widget/SearchViewCompat.java
+++ b/v4/java/android/support/v4/widget/SearchViewCompat.java
@@ -27,7 +27,7 @@
  * Helper for accessing features in {@link android.widget.SearchView}
  * introduced after API level 4 in a backwards compatible fashion.
  */
-public class SearchViewCompat {
+public final class SearchViewCompat {
 
     interface SearchViewCompatImpl {
         View newSearchView(Context context);
diff --git a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java b/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
index 06db6f2..bbe0f32 100644
--- a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ b/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -918,24 +918,26 @@
             ViewCompat.setScaleX(mCircleView, 1f);
             ViewCompat.setScaleY(mCircleView, 1f);
         }
+
+        if (mScale) {
+            setAnimationProgress(Math.min(1f, overscrollTop / mTotalDragDistance));
+        }
         if (overscrollTop < mTotalDragDistance) {
-            if (mScale) {
-                setAnimationProgress(overscrollTop / mTotalDragDistance);
-            }
             if (mProgress.getAlpha() > STARTING_PROGRESS_ALPHA
                     && !isAnimationRunning(mAlphaStartAnimation)) {
                 // Animate the alpha
                 startProgressAlphaStartAnimation();
             }
-            float strokeStart = adjustedPercent * .8f;
-            mProgress.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart));
-            mProgress.setArrowScale(Math.min(1f, adjustedPercent));
         } else {
             if (mProgress.getAlpha() < MAX_ALPHA && !isAnimationRunning(mAlphaMaxAnimation)) {
                 // Animate the alpha
                 startProgressAlphaMaxAnimation();
             }
         }
+        float strokeStart = adjustedPercent * .8f;
+        mProgress.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart));
+        mProgress.setArrowScale(Math.min(1f, adjustedPercent));
+
         float rotation = (-0.25f + .4f * adjustedPercent + tensionPercent * 2) * .5f;
         mProgress.setProgressRotation(rotation);
         setTargetOffsetTopAndBottom(targetY - mCurrentTargetOffsetTop, true /* requires update */);
diff --git a/v4/java/android/support/v4/widget/TextViewCompat.java b/v4/java/android/support/v4/widget/TextViewCompat.java
index 621ee66..5df1ae6 100644
--- a/v4/java/android/support/v4/widget/TextViewCompat.java
+++ b/v4/java/android/support/v4/widget/TextViewCompat.java
@@ -27,7 +27,7 @@
  * Helper for accessing features in {@link TextView} introduced after API level
  * 4 in a backwards compatible fashion.
  */
-public class TextViewCompat {
+public final class TextViewCompat {
 
     // Hide constructor
     private TextViewCompat() {}
diff --git a/v4/tests/AndroidManifest.xml b/v4/tests/AndroidManifest.xml
index 556c885..f99c5d1 100644
--- a/v4/tests/AndroidManifest.xml
+++ b/v4/tests/AndroidManifest.xml
@@ -17,13 +17,30 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v4.test">
-    <uses-sdk android:minSdkVersion="4" tools:overrideLibrary="android.support.test,
-            android.support.test.espresso, android.support.test.espresso.idling"/>
+    <uses-sdk
+            android:minSdkVersion="4"
+            android:targetSdkVersion="23"
+            tools:overrideLibrary="android.support.test,android.support.test.espresso, android.support.test.espresso.idling"/>
 
-    <application>
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
+    <application android:supportsRtl="true">
         <uses-library android:name="android.test.runner" />
         <activity android:name="android.support.v4.widget.test.TextViewTestActivity"/>
+
+        <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
+
+        <activity android:name="android.support.v4.view.ViewPagerWithTabStripActivity"/>
+
         <activity android:name="android.support.v4.widget.TestActivity"/>
+
+        <activity
+            android:name="android.support.v4.ThemedYellowActivity"
+            android:theme="@style/YellowTheme" />
+        <activity android:name="android.support.v4.app.test.FragmentTestActivity"/>
     </application>
 
     <instrumentation android:name="android.test.InstrumentationTestRunner"
diff --git a/v4/tests/NO_DOCS b/v4/tests/NO_DOCS
new file mode 100644
index 0000000..0c81e4a
--- /dev/null
+++ b/v4/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/v4/tests/java/android/support/v4/ThemedYellowActivity.java b/v4/tests/java/android/support/v4/ThemedYellowActivity.java
new file mode 100644
index 0000000..e256251
--- /dev/null
+++ b/v4/tests/java/android/support/v4/ThemedYellowActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+public class ThemedYellowActivity extends Activity {
+    FrameLayout mContainer;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mContainer = new FrameLayout(this);
+
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(mContainer);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java b/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java
new file mode 100644
index 0000000..2c58ad5
--- /dev/null
+++ b/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java
@@ -0,0 +1,421 @@
+/*
+ * 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.app;
+
+import android.os.SystemClock;
+import android.support.v4.app.test.FragmentTestActivity;
+import android.support.v4.app.test.FragmentTestActivity.OnTransitionListener;
+import android.support.v4.app.test.FragmentTestActivity.TestFragment;
+import android.support.v4.test.R;
+import android.support.v4.view.ViewCompat;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+
+public class FragmentTransitionTest extends
+        ActivityInstrumentationTestCase2<FragmentTestActivity> {
+    private TestFragment mStartFragment;
+    private TestFragment mMidFragment;
+    private TestFragment mEndFragment;
+    private FragmentTestActivity mActivity;
+
+    public FragmentTransitionTest() {
+        super(FragmentTestActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mStartFragment = null;
+        mMidFragment = null;
+        mEndFragment = null;
+        mActivity = getActivity();
+    }
+
+    public void testFragmentTransition() throws Throwable {
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View sharedElement = mActivity.findViewById(R.id.hello);
+                assertEquals("source", ViewCompat.getTransitionName(sharedElement));
+
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .addSharedElement(sharedElement, "destination")
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.SHARED_ELEMENT_ENTER));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View textView = mActivity.findViewById(R.id.hello);
+                assertEquals("destination", ViewCompat.getTransitionName(textView));
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mStartFragment, TestFragment.REENTER);
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER));
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+    }
+
+    public void testFirstOutLastInTransition() throws Throwable {
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        mStartFragment.clearNotifications();
+        mEndFragment.clearNotifications();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.RETURN);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testPopTwo() throws Throwable {
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mMidFragment, TestFragment.ENTER);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertTrue(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        mStartFragment.clearNotifications();
+        mMidFragment.clearNotifications();
+        mEndFragment.clearNotifications();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FragmentManager fm = mActivity.getSupportFragmentManager();
+                int id = fm.getBackStackEntryAt(0).getId();
+                fm.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+                fm.executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.RETURN);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testNullTransition() throws Throwable {
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mStartFragment = TestFragment.create(R.layout.fragment_start);
+                mStartFragment.clearTransitions();
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mStartFragment)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.ENTER);
+        // No transitions
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mEndFragment.clearTransitions();
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mEndFragment, TestFragment.ENTER);
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mEndFragment, TestFragment.RETURN);
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testRemoveAdded() throws Throwable {
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .replace(R.id.content, mStartFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mStartFragment, TestFragment.REENTER);
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER));
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+    }
+
+    public void testAddRemoved() throws Throwable {
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .replace(R.id.content, mStartFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.ENTER);
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.EXIT));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.REENTER);
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    private void launchStartFragment() throws Throwable {
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mStartFragment = TestFragment.create(R.layout.fragment_start);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mStartFragment)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mStartFragment, TestFragment.ENTER);
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        mStartFragment.clearNotifications();
+    }
+
+    private boolean waitForStart(TestFragment fragment, int key) throws InterruptedException {
+        final boolean started;
+        WaitForTransition listener = new WaitForTransition(key, true);
+        fragment.setOnTransitionListener(listener);
+        final long endTime = SystemClock.uptimeMillis() + 100;
+        synchronized (listener) {
+            long waitTime;
+            while ((waitTime = endTime - SystemClock.uptimeMillis()) > 0 &&
+                    !listener.isDone()) {
+                listener.wait(waitTime);
+            }
+            started = listener.isDone();
+        }
+        fragment.setOnTransitionListener(null);
+        getInstrumentation().waitForIdleSync();
+        return started;
+    }
+
+    private boolean waitForEnd(TestFragment fragment, int key) throws InterruptedException {
+        if (!waitForStart(fragment, key)) {
+            return false;
+        }
+        final boolean ended;
+        WaitForTransition listener = new WaitForTransition(key, false);
+        fragment.setOnTransitionListener(listener);
+        final long endTime = SystemClock.uptimeMillis() + 400;
+        synchronized (listener) {
+            long waitTime;
+            while ((waitTime = endTime - SystemClock.uptimeMillis()) > 0 &&
+                    !listener.isDone()) {
+                listener.wait(waitTime);
+            }
+            ended = listener.isDone();
+        }
+        fragment.setOnTransitionListener(null);
+        getInstrumentation().waitForIdleSync();
+        return ended;
+    }
+
+    private static class WaitForTransition implements OnTransitionListener {
+        final int key;
+        final boolean isStart;
+        boolean isDone;
+
+        public WaitForTransition(int key, boolean isStart) {
+            this.key = key;
+            this.isStart = isStart;
+        }
+
+        protected boolean isComplete(TestFragment fragment) {
+            if (isStart) {
+                return fragment.wasStartCalled(key);
+            } else {
+                return fragment.wasEndCalled(key);
+            }
+        }
+
+        public synchronized boolean isDone() {
+            return isDone;
+        }
+
+        @Override
+        public synchronized void onTransition(TestFragment fragment) {
+            isDone = isComplete(fragment);
+            if (isDone) {
+                notifyAll();
+            }
+        }
+    }
+
+}
diff --git a/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java b/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java
new file mode 100644
index 0000000..1bcb1a2
--- /dev/null
+++ b/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java
@@ -0,0 +1,198 @@
+/*
+ * 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.app.test;
+
+import android.app.Activity;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.test.R;
+import android.transition.Transition;
+import android.transition.Transition.TransitionListener;
+import android.transition.TransitionInflater;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A simple activity used for Fragment Transitions
+ */
+public class FragmentTestActivity extends FragmentActivity {
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.activity_content);
+    }
+
+    public static class TestFragment extends Fragment {
+        public static final int ENTER = 0;
+        public static final int RETURN = 1;
+        public static final int EXIT = 2;
+        public static final int REENTER = 3;
+        public static final int SHARED_ELEMENT_ENTER = 4;
+        public static final int SHARED_ELEMENT_RETURN = 5;
+        private static final int TRANSITION_COUNT = 6;
+
+        private static final String LAYOUT_ID = "layoutId";
+        private static final String TRANSITION_KEY = "transition_";
+        private int mLayoutId = R.layout.fragment_start;
+        private final int[] mTransitionIds = new int[] {
+                android.R.transition.explode,
+                android.R.transition.explode,
+                android.R.transition.fade,
+                android.R.transition.fade,
+                android.R.transition.move,
+                android.R.transition.move,
+        };
+        private final TransitionCalledListener[] mListeners =
+                new TransitionCalledListener[TRANSITION_COUNT];
+        private OnTransitionListener mOnTransitionListener;
+
+        public TestFragment() {
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                mListeners[i] = new TransitionCalledListener();
+            }
+        }
+
+        public static TestFragment create(int layoutId) {
+            TestFragment testFragment = new TestFragment();
+            testFragment.mLayoutId = layoutId;
+            return testFragment;
+        }
+
+        public void clearTransitions() {
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                mTransitionIds[i] = 0;
+            }
+        }
+
+        public void clearNotifications() {
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                mListeners[i].transitionStarted = false;
+                mListeners[i].transitionEnded = false;
+            }
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (savedInstanceState != null) {
+                mLayoutId = savedInstanceState.getInt(LAYOUT_ID, mLayoutId);
+                for (int i = 0; i < TRANSITION_COUNT; i++) {
+                    String key = TRANSITION_KEY + i;
+                    mTransitionIds[i] = savedInstanceState.getInt(key, mTransitionIds[i]);
+                }
+            }
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putInt(LAYOUT_ID, mLayoutId);
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                String key = TRANSITION_KEY + i;
+                outState.putInt(key, mTransitionIds[i]);
+            }
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(mLayoutId, container, false);
+        }
+
+        @SuppressWarnings("deprecation")
+        @Override
+        public void onAttach(Activity activity) {
+            super.onAttach(activity);
+            if (VERSION.SDK_INT > VERSION_CODES.KITKAT) {
+                setEnterTransition(loadTransition(ENTER));
+                setReenterTransition(loadTransition(REENTER));
+                setExitTransition(loadTransition(EXIT));
+                setReturnTransition(loadTransition(RETURN));
+                setSharedElementEnterTransition(loadTransition(SHARED_ELEMENT_ENTER));
+                setSharedElementReturnTransition(loadTransition(SHARED_ELEMENT_RETURN));
+            }
+        }
+
+        public void setOnTransitionListener(OnTransitionListener listener) {
+            mOnTransitionListener = listener;
+        }
+
+        public boolean wasStartCalled(int transitionKey) {
+            return mListeners[transitionKey].transitionStarted;
+        }
+
+        public boolean wasEndCalled(int transitionKey) {
+            return mListeners[transitionKey].transitionEnded;
+        }
+
+        private Transition loadTransition(int key) {
+            final int id = mTransitionIds[key];
+            if (id == 0) {
+                return null;
+            }
+            Transition transition = TransitionInflater.from(getActivity()).inflateTransition(id);
+            transition.addListener(mListeners[key]);
+            return transition;
+        }
+
+        private void notifyTransition() {
+            if (mOnTransitionListener != null) {
+                mOnTransitionListener.onTransition(this);
+            }
+        }
+
+        private class TransitionCalledListener implements TransitionListener {
+            public boolean transitionStarted;
+            public boolean transitionEnded;
+
+            public TransitionCalledListener() {
+            }
+
+            @Override
+            public void onTransitionStart(Transition transition) {
+                transitionStarted = true;
+                notifyTransition();
+            }
+
+            @Override
+            public void onTransitionEnd(Transition transition) {
+                transitionEnded = true;
+                notifyTransition();
+            }
+
+            @Override
+            public void onTransitionCancel(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionPause(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionResume(Transition transition) {
+            }
+        }
+    }
+
+    public interface OnTransitionListener {
+        void onTransition(TestFragment fragment);
+    }
+
+}
diff --git a/v4/tests/java/android/support/v4/content/ContextCompatTest.java b/v4/tests/java/android/support/v4/content/ContextCompatTest.java
new file mode 100644
index 0000000..e2fc0b7
--- /dev/null
+++ b/v4/tests/java/android/support/v4/content/ContextCompatTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.content;
+
+import android.content.res.ColorStateList;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.v4.ThemedYellowActivity;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.test.R;
+import android.support.v4.testutils.TestUtils;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.TypedValue;
+
+public class ContextCompatTest extends ActivityInstrumentationTestCase2<ThemedYellowActivity> {
+    private static final String TAG = "ResourcesCompatTest";
+
+    public ContextCompatTest() {
+        super("android.support.v4.content", ThemedYellowActivity.class);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetColor() throws Throwable {
+        Context context = getActivity();
+
+        assertEquals("Unthemed color load", 0xFFFF8090,
+                ContextCompat.getColor(context, R.color.text_color));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following test is only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColor() in pre-v23 is undefined.
+            assertEquals("Themed yellow color load",
+                    ContextCompat.getColor(context, R.color.simple_themed_selector),
+                    0xFFF0B000);
+        }
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetColorStateList() throws Throwable {
+        Context context = getActivity();
+
+        ColorStateList unthemedColorStateList =
+                ContextCompat.getColorStateList(context, R.color.complex_unthemed_selector);
+        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
+                unthemedColorStateList.getDefaultColor());
+        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColorStateList() in pre-v23 is undefined.
+            ColorStateList themedYellowColorStateList =
+                    ContextCompat.getColorStateList(context, R.color.complex_themed_selector);
+            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
+                    themedYellowColorStateList.getDefaultColor());
+            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+        }
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetDrawable() throws Throwable {
+        Context context = getActivity();
+
+        Drawable unthemedDrawable =
+                ContextCompat.getDrawable(context, R.drawable.test_drawable_red);
+        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
+                unthemedDrawable, context.getResources().getColor(R.color.test_red));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following test is only expected to pass on v23+ devices. The result of
+            // calling theme-aware getDrawable() in pre-v23 is undefined.
+            Drawable themedYellowDrawable =
+                    ContextCompat.getDrawable(context, R.drawable.themed_drawable);
+            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
+                    themedYellowDrawable, 0xFFF0B000);
+        }
+    }
+
+
+    @UiThreadTest
+    @SmallTest
+    public void testCheckSelfPermission() throws Throwable {
+        Context context = getActivity();
+
+        try {
+            ContextCompat.checkSelfPermission(context, null);
+            fail("Should have thrown an exception on null parameter");
+        } catch (IllegalArgumentException iae) {
+            // This is the expected condition - just ignore and continue with the rest of the
+            // tests in this method.
+        }
+
+        assertEquals("Vibrate permission granted", PackageManager.PERMISSION_GRANTED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.VIBRATE));
+        assertEquals("Wake lock permission granted", PackageManager.PERMISSION_GRANTED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.WAKE_LOCK));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // As documented in http://developer.android.com/training/permissions/requesting.html
+            // starting in Android M (v23) dangerous permissions are not granted automactically
+            // to apps targeting SDK 23 even if those are defined in the manifest.
+            // This is why the following permissions are expected to be denied.
+            assertEquals("Read contacts permission granted", PackageManager.PERMISSION_DENIED,
+                    ContextCompat.checkSelfPermission(context,
+                            android.Manifest.permission.READ_CONTACTS));
+            assertEquals("Write contacts permission granted", PackageManager.PERMISSION_DENIED,
+                    ContextCompat.checkSelfPermission(context,
+                            android.Manifest.permission.WRITE_CONTACTS));
+        } else {
+            // And on older devices declared dangerous permissions are expected to be granted.
+            assertEquals("Read contacts permission denied", PackageManager.PERMISSION_GRANTED,
+                    ContextCompat.checkSelfPermission(context,
+                            android.Manifest.permission.READ_CONTACTS));
+            assertEquals("Write contacts permission denied", PackageManager.PERMISSION_GRANTED,
+                    ContextCompat.checkSelfPermission(context,
+                            android.Manifest.permission.WRITE_CONTACTS));
+        }
+
+        // The following permissions (normal and dangerous) are expected to be denied as they are
+        // not declared in our manifest.
+        assertEquals("Access network state permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.ACCESS_NETWORK_STATE));
+        assertEquals("Bluetooth permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.BLUETOOTH));
+        assertEquals("Call phone permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.CALL_PHONE));
+        assertEquals("Delete packages permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(context,
+                        android.Manifest.permission.DELETE_PACKAGES));
+    }
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
new file mode 100644
index 0000000..4efca5d
--- /dev/null
+++ b/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
@@ -0,0 +1,291 @@
+/*
+ * 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.content.res;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.v4.content.res.ResourcesCompat;
+import android.support.v4.test.R;
+import android.support.v4.testutils.TestUtils;
+import android.support.v4.widget.TestActivity;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+
+public class ResourcesCompatTest extends ActivityInstrumentationTestCase2<TestActivity> {
+    private static final String TAG = "ResourcesCompatTest";
+
+    public ResourcesCompatTest() {
+        super("android.support.v4.content.res", TestActivity.class);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetColor() throws Throwable {
+        final Resources res = getActivity().getResources();
+        assertEquals("Unthemed color load",
+                ResourcesCompat.getColor(res, R.color.text_color, null),
+                0xFFFF8090);
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColor() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = res.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            assertEquals("Themed yellow color load", 0xFFF0B000,
+                    ResourcesCompat.getColor(res, R.color.simple_themed_selector, yellowTheme));
+
+            final Resources.Theme lilacTheme = res.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            assertEquals("Themed lilac color load", 0xFFF080F0,
+                    ResourcesCompat.getColor(res, R.color.simple_themed_selector, lilacTheme));
+        }
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetColorStateList() throws Throwable {
+        final Resources res = getActivity().getResources();
+
+        final ColorStateList unthemedColorStateList =
+                ResourcesCompat.getColorStateList(res, R.color.complex_unthemed_selector, null);
+        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
+                unthemedColorStateList.getDefaultColor());
+        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColorStateList() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = res.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            final ColorStateList themedYellowColorStateList =
+                    ResourcesCompat.getColorStateList(res, R.color.complex_themed_selector,
+                            yellowTheme);
+            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
+                    themedYellowColorStateList.getDefaultColor());
+            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+
+            final Resources.Theme lilacTheme = res.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            final ColorStateList themedLilacColorStateList =
+                    ResourcesCompat.getColorStateList(res, R.color.complex_themed_selector,
+                            lilacTheme);
+            assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
+                    themedLilacColorStateList.getDefaultColor());
+            assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
+                    themedLilacColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
+                    themedLilacColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+        }
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetDrawable() throws Throwable {
+        final Resources res = getActivity().getResources();
+
+        final Drawable unthemedDrawable =
+                ResourcesCompat.getDrawable(res, R.drawable.test_drawable_red, null);
+        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
+                unthemedDrawable, res.getColor(R.color.test_red));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getDrawable() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = res.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            final Drawable themedYellowDrawable =
+                    ResourcesCompat.getDrawable(res, R.drawable.themed_drawable, yellowTheme);
+            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
+                    themedYellowDrawable, 0xFFF0B000);
+
+            final Resources.Theme lilacTheme = res.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            final Drawable themedLilacDrawable =
+                    ResourcesCompat.getDrawable(res, R.drawable.themed_drawable, lilacTheme);
+            TestUtils.assertAllPixelsOfColor("Themed lilac drawable load",
+                    themedLilacDrawable, 0xFFF080F0);
+        }
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetDrawableForDensityUnthemed() throws Throwable {
+        // Density-aware drawable loading for now only works on raw bitmap drawables.
+
+        final Resources res = getActivity().getResources();
+        final DisplayMetrics metrics = res.getDisplayMetrics();
+
+        // Different variants of density_aware_drawable are set up in the following way:
+        //    mdpi - 12x12 px which is 12x12 dip
+        //    hdpi - 21x21 px which is 14x14 dip
+        //   xhdpi - 32x32 px which is 16x16 dip
+        //  xxhdpi - 54x54 px which is 18x18 dip
+        // The tests below (on v15+ devices) are checking that an unthemed density-aware
+        // loading of raw bitmap drawables returns a drawable with matching intrinsic
+        // dimensions.
+
+        final Drawable unthemedDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_MEDIUM, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForMediumDensity = (Build.VERSION.SDK_INT < 15) ?
+                res.getDimensionPixelSize(R.dimen.density_aware_size) : 12;
+        assertEquals("Unthemed density-aware drawable load: medium width",
+                expectedSizeForMediumDensity, unthemedDrawableForMediumDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: medium height",
+                expectedSizeForMediumDensity,
+                unthemedDrawableForMediumDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_HIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                res.getDimensionPixelSize(R.dimen.density_aware_size) : 21;
+        assertEquals("Unthemed density-aware drawable load: high width",
+                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: high height",
+                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_XHIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForXHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                res.getDimensionPixelSize(R.dimen.density_aware_size) : 32;
+        assertEquals("Unthemed density-aware drawable load: xhigh width",
+                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: xhigh height",
+                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_XXHIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForXXHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                res.getDimensionPixelSize(R.dimen.density_aware_size) : 54;
+        assertEquals("Unthemed density-aware drawable load: xxhigh width",
+                expectedSizeForXXHighDensity, unthemedDrawableForXXHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: xxhigh height",
+                expectedSizeForXXHighDensity,
+                unthemedDrawableForXXHighDensity.getIntrinsicHeight());
+    }
+
+
+    @UiThreadTest
+    @SmallTest
+    public void testGetDrawableForDensityThemed() throws Throwable {
+        if (Build.VERSION.SDK_INT < 21) {
+            // The following tests are only expected to pass on v21+ devices. The result of
+            // calling theme-aware getDrawableForDensity() in pre-v21 is undefined.
+            return;
+        }
+
+        // Density- and theme-aware drawable loading for now only works partially. This test
+        // checks only for theming of a tinted bitmap XML drawable, but not correct scaling.
+
+        final Resources res = getActivity().getResources();
+        final DisplayMetrics metrics = res.getDisplayMetrics();
+
+        // Set up the two test themes, yellow and lilac.
+        final Resources.Theme yellowTheme = res.newTheme();
+        yellowTheme.applyStyle(R.style.YellowTheme, true);
+
+        final Resources.Theme lilacTheme = res.newTheme();
+        lilacTheme.applyStyle(R.style.LilacTheme, true);
+
+        Drawable themedYellowDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_MEDIUM, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : medium color",
+                themedYellowDrawableForMediumDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_MEDIUM, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : medium color",
+                themedLilacDrawableForMediumDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_HIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : high color",
+                themedYellowDrawableForHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_HIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : high color",
+                themedLilacDrawableForHighDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XHIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xhigh color",
+                themedYellowDrawableForXHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XHIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xhigh color",
+                themedLilacDrawableForXHighDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XXHIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xxhigh color",
+                themedYellowDrawableForXXHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(res, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XXHIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xxhigh color",
+                themedLilacDrawableForXXHighDensity, 0xFFF080F0);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtils.java b/v4/tests/java/android/support/v4/testutils/TestUtils.java
new file mode 100644
index 0000000..9b1acee
--- /dev/null
+++ b/v4/tests/java/android/support/v4/testutils/TestUtils.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.support.v4.testutils;
+
+import java.lang.IllegalArgumentException;
+import java.lang.RuntimeException;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+
+import junit.framework.Assert;
+
+public class TestUtils {
+    /**
+     * Converts the specified value from dips to pixels for use as view size.
+     */
+    public static int convertSizeDipsToPixels(DisplayMetrics displayMetrics, int dipValue) {
+        // Round to the nearest int value. This follows the logic in
+        // TypedValue.complexToDimensionPixelSize
+        final int res = (int) (dipValue * displayMetrics.density + 0.5f);
+        if (res != 0) {
+            return res;
+        }
+        if (dipValue == 0) {
+            return 0;
+        }
+        if (dipValue > 0) {
+            return 1;
+        }
+        return -1;
+    }
+
+    /**
+     * Converts the specified value from dips to pixels for use as view offset.
+     */
+    public static int convertOffsetDipsToPixels(DisplayMetrics displayMetrics, int dipValue) {
+        // Round to the nearest int value.
+        return (int) (dipValue * displayMetrics.density);
+    }
+
+
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     * If the passed <code>Drawable</code> does not have positive intrinsic dimensions set, this
+     * method will throw an <code>IllegalArgumentException</code>. If there is a color mismatch,
+     * this method will call <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            @ColorInt int color) {
+        int drawableWidth = drawable.getIntrinsicWidth();
+        int drawableHeight = drawable.getIntrinsicHeight();
+
+        if ((drawableWidth <= 0) || (drawableHeight <= 0)) {
+            throw new IllegalArgumentException("Drawable must be configured to have non-zero size");
+        }
+
+        assertAllPixelsOfColor(failMessagePrefix, drawable, drawableWidth, drawableHeight, color,
+                false);
+    }
+
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     *
+     * In case there is a color mismatch, the behavior of this method depends on the
+     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
+     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
+     * <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            int drawableWidth, int drawableHeight, @ColorInt int color,
+            boolean throwExceptionIfFails) {
+        // Create a bitmap
+        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
+        // Create a canvas that wraps the bitmap
+        Canvas canvas = new Canvas(bitmap);
+        // Configure the drawable to have bounds that match its intrinsic size
+        drawable.setBounds(0, 0, drawableWidth, drawableHeight);
+        // And ask the drawable to draw itself to the canvas / bitmap
+        drawable.draw(canvas);
+
+        try {
+            int[] rowPixels = new int[drawableWidth];
+            for (int row = 0; row < drawableHeight; row++) {
+                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
+                for (int column = 0; column < drawableWidth; column++) {
+                    if (rowPixels[column] != color) {
+                        String mismatchDescription = failMessagePrefix
+                                + ": expected all drawable colors to be ["
+                                + Color.red(color) + "," + Color.green(color) + ","
+                                + Color.blue(color)
+                                + "] but at position (" + row + "," + column + ") found ["
+                                + Color.red(rowPixels[column]) + ","
+                                + Color.green(rowPixels[column]) + ","
+                                + Color.blue(rowPixels[column]) + "]";
+                        if (throwExceptionIfFails) {
+                            throw new RuntimeException(mismatchDescription);
+                        } else {
+                            Assert.fail(mismatchDescription);
+                        }
+                    }
+                }
+            }
+        } finally {
+            bitmap.recycle();
+        }
+    }
+
+    /**
+     * Checks whether the specified rectangle matches the specified left / top / right /
+     * bottom bounds.
+     */
+    public static void assertRectangleBounds(String failMessagePrefix, @NonNull Rect rectangle,
+            int left, int top, int right, int bottom) {
+        Assert.assertEquals(failMessagePrefix + " left", rectangle.left, left);
+        Assert.assertEquals(failMessagePrefix + " top", rectangle.top, top);
+        Assert.assertEquals(failMessagePrefix + " right", rectangle.right, right);
+        Assert.assertEquals(failMessagePrefix + " bottom", rectangle.bottom, bottom);
+    }
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtilsAssertions.java b/v4/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
new file mode 100644
index 0000000..161c0c7
--- /dev/null
+++ b/v4/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
@@ -0,0 +1,64 @@
+/*
+ * 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.testutils;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import android.support.test.espresso.NoMatchingViewException;
+import android.support.test.espresso.ViewAssertion;
+
+import junit.framework.AssertionFailedError;
+
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+
+public class TestUtilsAssertions {
+
+    /**
+     * Returns an assertion that asserts that there is specified number of fully displayed
+     * children.
+     */
+    public static ViewAssertion hasDisplayedChildren(final int expectedCount) {
+        return new ViewAssertion() {
+            @Override
+            public void check(final View foundView, NoMatchingViewException noViewException) {
+                if (noViewException != null) {
+                    throw noViewException;
+                } else {
+                    if (!(foundView instanceof ViewGroup)) {
+                        throw new AssertionFailedError("View " +
+                                foundView.getClass().getSimpleName() + " is not a ViewGroup");
+                    }
+                    final ViewGroup foundGroup = (ViewGroup) foundView;
+
+                    final int childrenCount = foundGroup.getChildCount();
+                    int childrenDisplayedCount = 0;
+                    for (int i = 0; i < childrenCount; i++) {
+                        if (isDisplayed().matches(foundGroup.getChildAt(i))) {
+                            childrenDisplayedCount++;
+                        }
+                    }
+
+                    if (childrenDisplayedCount != expectedCount) {
+                        throw new AssertionFailedError("Expected " + expectedCount +
+                                " displayed children, but found " + childrenDisplayedCount);
+                    }
+                }
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtilsMatchers.java b/v4/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
new file mode 100644
index 0000000..f61fd0e
--- /dev/null
+++ b/v4/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
@@ -0,0 +1,231 @@
+/*
+ * 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.testutils;
+
+import java.lang.String;
+
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.test.espresso.matcher.BoundedMatcher;
+import android.support.v4.testutils.TestUtils;
+import android.support.v4.view.ViewCompat;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+import junit.framework.Assert;
+
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+public class TestUtilsMatchers {
+    /**
+     * Returns a matcher that matches views which have specific background color.
+     */
+    public static Matcher backgroundColor(@ColorInt final int backgroundColor) {
+        return new BoundedMatcher<View, View>(View.class) {
+            private String failedComparisonDescription;
+
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText("with background color: ");
+
+                description.appendText(failedComparisonDescription);
+            }
+
+            @Override
+            public boolean matchesSafely(final View view) {
+                Drawable actualBackgroundDrawable = view.getBackground();
+                if (actualBackgroundDrawable == null) {
+                    return false;
+                }
+
+                // One option is to check if we have a ColorDrawable and then call getColor
+                // but that API is v11+. Instead, we call our helper method that checks whether
+                // all pixels in a Drawable are of the same specified color. Here we pass
+                // hard-coded dimensions of 40x40 since we can't rely on the intrinsic dimensions
+                // being set on our drawable.
+                try {
+                    TestUtils.assertAllPixelsOfColor("", actualBackgroundDrawable,
+                            40, 40, backgroundColor, true);
+                    // If we are here, the color comparison has passed.
+                    failedComparisonDescription = null;
+                    return true;
+                } catch (Throwable t) {
+                    // If we are here, the color comparison has failed.
+                    failedComparisonDescription = t.getMessage();
+                    return false;
+                }
+            }
+        };
+    }
+
+    /**
+     * Returns a matcher that matches Views which are an instance of the provided class.
+     */
+    public static Matcher<View> isOfClass(final Class<? extends View> clazz) {
+        if (clazz == null) {
+            Assert.fail("Passed null Class instance");
+        }
+        return new TypeSafeMatcher<View>() {
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("is identical to class: " + clazz);
+            }
+
+            @Override
+            public boolean matchesSafely(View view) {
+                return clazz.equals(view.getClass());
+            }
+        };
+    }
+
+    /**
+     * Returns a matcher that matches Views that are aligned to the left / start edge of
+     * their parent.
+     */
+    public static Matcher<View> startAlignedToParent() {
+        return new BoundedMatcher<View, View>(View.class) {
+            private String failedCheckDescription;
+
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText(failedCheckDescription);
+            }
+
+            @Override
+            public boolean matchesSafely(final View view) {
+                final ViewParent parent = view.getParent();
+                if (!(parent instanceof ViewGroup)) {
+                    return false;
+                }
+                final ViewGroup parentGroup = (ViewGroup) parent;
+
+                final int parentLayoutDirection = ViewCompat.getLayoutDirection(parentGroup);
+                if (parentLayoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+                    if (view.getLeft() == 0) {
+                        return true;
+                    } else {
+                        failedCheckDescription =
+                                "not aligned to start (left) edge of parent : left=" +
+                                        view.getLeft();
+                        return false;
+                    }
+                } else {
+                    if (view.getRight() == parentGroup.getWidth()) {
+                        return true;
+                    } else {
+                        failedCheckDescription =
+                                "not aligned to start (right) edge of parent : right=" +
+                                        view.getRight() + ", parent width=" +
+                                        parentGroup.getWidth();
+                        return false;
+                    }
+                }
+            }
+        };
+    }
+
+    /**
+     * Returns a matcher that matches Views that are aligned to the right / end edge of
+     * their parent.
+     */
+    public static Matcher<View> endAlignedToParent() {
+        return new BoundedMatcher<View, View>(View.class) {
+            private String failedCheckDescription;
+
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText(failedCheckDescription);
+            }
+
+            @Override
+            public boolean matchesSafely(final View view) {
+                final ViewParent parent = view.getParent();
+                if (!(parent instanceof ViewGroup)) {
+                    return false;
+                }
+                final ViewGroup parentGroup = (ViewGroup) parent;
+
+                final int parentLayoutDirection = ViewCompat.getLayoutDirection(parentGroup);
+                if (parentLayoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+                    if (view.getRight() == parentGroup.getWidth()) {
+                        return true;
+                    } else {
+                        failedCheckDescription =
+                                "not aligned to end (right) edge of parent : right=" +
+                                        view.getRight() + ", parent width=" +
+                                        parentGroup.getWidth();
+                        return false;
+                    }
+                } else {
+                    if (view.getLeft() == 0) {
+                        return true;
+                    } else {
+                        failedCheckDescription =
+                                "not aligned to end (left) edge of parent : left=" +
+                                        view.getLeft();
+                        return false;
+                    }
+                }
+            }
+        };
+    }
+
+    /**
+     * Returns a matcher that matches Views that are centered horizontally in their parent.
+     */
+    public static Matcher<View> centerAlignedInParent() {
+        return new BoundedMatcher<View, View>(View.class) {
+            private String failedCheckDescription;
+
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText(failedCheckDescription);
+            }
+
+            @Override
+            public boolean matchesSafely(final View view) {
+                final ViewParent parent = view.getParent();
+                if (!(parent instanceof ViewGroup)) {
+                    return false;
+                }
+                final ViewGroup parentGroup = (ViewGroup) parent;
+
+                final int viewLeft = view.getLeft();
+                final int viewRight = view.getRight();
+                final int parentWidth = parentGroup.getWidth();
+
+                final int viewMiddle = (viewLeft + viewRight) / 2;
+                final int parentMiddle = parentWidth / 2;
+
+                // Check that the view is centered in its parent, accounting for off-by-one
+                // pixel difference in case one is even and the other is odd.
+                if (Math.abs(viewMiddle - parentMiddle) > 1) {
+                    failedCheckDescription =
+                            "not aligned to center of parent : own span=[" +
+                                    viewLeft + "-" + viewRight + "], parent width=" + parentWidth;
+                    return false;
+                }
+
+                return true;
+            }
+        };
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java b/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java
new file mode 100644
index 0000000..166fb1e
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java
@@ -0,0 +1,488 @@
+/*
+ * 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.view;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.util.Pair;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import android.support.test.espresso.Espresso;
+import android.support.test.espresso.UiController;
+import android.support.v4.test.R;
+import android.support.v4.testutils.TestUtilsAssertions;
+import android.support.v4.testutils.TestUtilsMatchers;
+import android.support.v4.view.ViewPager;
+import android.support.v4.view.PagerTitleStrip;
+import android.support.v4.widget.TestActivity;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.ArrayList;
+
+import org.hamcrest.Matcher;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.action.ViewActions.swipeLeft;
+import static android.support.test.espresso.action.ViewActions.swipeRight;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.assertion.PositionAssertions.isBelow;
+import static android.support.test.espresso.assertion.PositionAssertions.isBottomAlignedWith;
+import static android.support.test.espresso.assertion.PositionAssertions.isLeftAlignedWith;
+import static android.support.test.espresso.assertion.PositionAssertions.isRightAlignedWith;
+import static android.support.test.espresso.assertion.PositionAssertions.isTopAlignedWith;
+import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.core.IsNot.not;
+
+/**
+ * Base class for testing <code>ViewPager</code>. Most of the testing logic should be in this
+ * class as it is independent on the specific pager title implementation (interactive or non
+ * interactive).
+ *
+ * Testing logic that does depend on the specific pager title implementation is pushed into the
+ * extending classes in <code>assertStripInteraction()</code> method.
+ */
+public abstract class BaseViewPagerTest<T extends Activity>
+        extends ActivityInstrumentationTestCase2<T> {
+    protected ViewPager mViewPager;
+
+    protected static class BasePagerAdapter<Q> extends PagerAdapter {
+        protected ArrayList<Pair<String, Q>> mEntries = new ArrayList<>();
+
+        public void add(String title, Q content) {
+            mEntries.add(new Pair(title, content));
+        }
+
+        @Override
+        public int getCount() {
+            return mEntries.size();
+        }
+
+        protected void configureInstantiatedItem(View view, int position) {
+            switch (position) {
+                case 0:
+                    view.setId(R.id.page_0);
+                    break;
+                case 1:
+                    view.setId(R.id.page_1);
+                    break;
+                case 2:
+                    view.setId(R.id.page_2);
+                    break;
+                case 3:
+                    view.setId(R.id.page_3);
+                    break;
+                case 4:
+                    view.setId(R.id.page_4);
+                    break;
+                case 5:
+                    view.setId(R.id.page_5);
+                    break;
+                case 6:
+                    view.setId(R.id.page_6);
+                    break;
+                case 7:
+                    view.setId(R.id.page_7);
+                    break;
+                case 8:
+                    view.setId(R.id.page_8);
+                    break;
+                case 9:
+                    view.setId(R.id.page_9);
+                    break;
+            }
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            // The adapter is also responsible for removing the view.
+            container.removeView(((ViewHolder) object).view);
+        }
+
+        @Override
+        public int getItemPosition(Object object) {
+            return ((ViewHolder) object).position;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            return ((ViewHolder) object).view == view;
+        }
+
+        @Override
+        public CharSequence getPageTitle(int position) {
+            return mEntries.get(position).first;
+        }
+
+        protected static class ViewHolder {
+            final View view;
+            final int position;
+
+            public ViewHolder(View view, int position) {
+                this.view = view;
+                this.position = position;
+            }
+        }
+    }
+
+    protected static class ColorPagerAdapter extends BasePagerAdapter<Integer> {
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final View view = new View(container.getContext());
+            view.setBackgroundColor(mEntries.get(position).second);
+            configureInstantiatedItem(view, position);
+
+            // Unlike ListView adapters, the ViewPager adapter is responsible
+            // for adding the view to the container.
+            container.addView(view);
+
+            return new ViewHolder(view, position);
+        }
+    }
+
+    protected static class TextPagerAdapter extends BasePagerAdapter<String> {
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final TextView view = new TextView(container.getContext());
+            view.setText(mEntries.get(position).second);
+            configureInstantiatedItem(view, position);
+
+            // Unlike ListView adapters, the ViewPager adapter is responsible
+            // for adding the view to the container.
+            container.addView(view);
+
+            return new ViewHolder(view, position);
+        }
+    }
+
+    public BaseViewPagerTest(Class<T> activityClass) {
+        super("android.support.v4.view", activityClass);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        final T activity = getActivity();
+        mViewPager = (ViewPager) activity.findViewById(R.id.pager);
+
+        ColorPagerAdapter adapter = new ColorPagerAdapter();
+        adapter.add("Red", Color.RED);
+        adapter.add("Green", Color.GREEN);
+        adapter.add("Blue", Color.BLUE);
+        onView(withId(R.id.pager)).perform(ViewPagerActions.setAdapter(adapter),
+                ViewPagerActions.scrollToPage(0));
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        onView(withId(R.id.pager)).perform(ViewPagerActions.setAdapter(null));
+
+        super.tearDown();
+    }
+
+    @SmallTest
+    public void testPageSelections() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right", 2, mViewPager.getCurrentItem());
+
+        // Try "scrolling" beyond the last page and test that we're still on the last page.
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right beyond last page", 2, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollLeft());
+        assertEquals("Scroll left", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollLeft());
+        assertEquals("Scroll left", 0, mViewPager.getCurrentItem());
+
+        // Try "scrolling" beyond the first page and test that we're still on the first page.
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollLeft());
+        assertEquals("Scroll left beyond first page", 0, mViewPager.getCurrentItem());
+
+    }
+
+    @SmallTest
+    public void testPageSwipes() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeLeft());
+        assertEquals("Swipe left", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeLeft());
+        assertEquals("Swipe left", 2, mViewPager.getCurrentItem());
+
+        // Try swiping beyond the last page and test that we're still on the last page.
+        onView(withId(R.id.pager)).perform(swipeLeft());
+        assertEquals("Swipe left beyond last page", 2, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeRight());
+        assertEquals("Swipe right", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeRight());
+        assertEquals("Swipe right", 0, mViewPager.getCurrentItem());
+
+        // Try swiping beyond the first page and test that we're still on the first page.
+        onView(withId(R.id.pager)).perform(swipeRight());
+        assertEquals("Swipe right beyond first page", 0, mViewPager.getCurrentItem());
+    }
+
+    @SmallTest
+    public void testPageSwipesComposite() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeLeft(), swipeLeft());
+        assertEquals("Swipe twice left", 2, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeLeft(), swipeRight());
+        assertEquals("Swipe left beyond last page and then right", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeRight(), swipeRight());
+        assertEquals("Swipe right and then right beyond first page", 0,
+                mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(swipeRight(), swipeLeft());
+        assertEquals("Swipe right beyond first page and then left", 1, mViewPager.getCurrentItem());
+    }
+
+    @SmallTest
+    public void testPageContent() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        // Verify the displayed content to match the initial adapter - with 3 pages and each
+        // one rendered as a View.
+
+        // Page #0 should be displayed, page #1 should not be displayed and page #2 should not exist
+        // yet as it's outside of the offscreen window limit.
+        onView(withId(R.id.page_0)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(View.class),
+                isDisplayed(),
+                TestUtilsMatchers.backgroundColor(Color.RED))));
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(doesNotExist());
+
+        // Scroll one page to select page #1
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+        // Pages #0 / #2 should not be displayed, page #1 should be displayed.
+        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_1)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(View.class),
+                isDisplayed(),
+                TestUtilsMatchers.backgroundColor(Color.GREEN))));
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
+        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
+        // page #1 should not be displayed, page #2 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(View.class),
+                isDisplayed(),
+                TestUtilsMatchers.backgroundColor(Color.BLUE))));
+    }
+
+    @SmallTest
+    public void testAdapterChange() {
+        // Verify that we have the expected initial adapter
+        PagerAdapter initialAdapter = mViewPager.getAdapter();
+        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
+        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
+
+        // Create a new adapter
+        TextPagerAdapter newAdapter = new TextPagerAdapter();
+        newAdapter.add("Title 0", "Body 0");
+        newAdapter.add("Title 1", "Body 1");
+        newAdapter.add("Title 2", "Body 2");
+        newAdapter.add("Title 3", "Body 3");
+        onView(withId(R.id.pager)).perform(ViewPagerActions.setAdapter(newAdapter),
+                ViewPagerActions.scrollToPage(0));
+
+        // Verify the displayed content to match the newly set adapter - with 4 pages and each
+        // one rendered as a TextView.
+
+        // Page #0 should be displayed, page #1 should not be displayed and pages #2 / #3 should not
+        // exist yet as they're outside of the offscreen window limit.
+        onView(withId(R.id.page_0)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 0"))));
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(doesNotExist());
+        onView(withId(R.id.page_3)).check(doesNotExist());
+
+        // Scroll one page to select page #1
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+        // Pages #0 / #2 should not be displayed, page #1 should be displayed, page #3 is still
+        // outside the offscreen limit.
+        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_1)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 1"))));
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_3)).check(doesNotExist());
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
+        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
+        // pages #1 / #3 should not be displayed, page #2 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 2"))));
+        onView(withId(R.id.page_3)).check(matches(not(isDisplayed())));
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        assertEquals("Scroll right one more time", 3, mViewPager.getCurrentItem());
+        // Pages #0 / #1 should not exist as they're bumped to the outside of the offscreen window
+        // limit, page #2 should not be displayed, page #3 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(doesNotExist());
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_3)).check(matches(allOf(
+                TestUtilsMatchers.isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 3"))));
+    }
+
+    private void testTitleStripLayout(String expectedStartTitle, String expectedSelectedTitle,
+            String expectedEndTitle, int selectedPageId) {
+        // Check that the title strip spans the whole width of the pager and is aligned to
+        // its top
+        onView(withId(R.id.titles)).check(isLeftAlignedWith(withId(R.id.pager)));
+        onView(withId(R.id.titles)).check(isRightAlignedWith(withId(R.id.pager)));
+        onView(withId(R.id.titles)).check(isTopAlignedWith(withId(R.id.pager)));
+
+        // Check that the currently selected page spans the whole width of the pager and is below
+        // the title strip
+        onView(withId(selectedPageId)).check(isLeftAlignedWith(withId(R.id.pager)));
+        onView(withId(selectedPageId)).check(isRightAlignedWith(withId(R.id.pager)));
+        onView(withId(selectedPageId)).check(isBelow(withId(R.id.titles)));
+        onView(withId(selectedPageId)).check(isBottomAlignedWith(withId(R.id.pager)));
+
+        boolean hasStartTitle = !TextUtils.isEmpty(expectedStartTitle);
+        boolean hasEndTitle = !TextUtils.isEmpty(expectedEndTitle);
+
+        // Check that the title strip shows the expected number of children (tab titles)
+        int nonNullTitles = (hasStartTitle ? 1 : 0) + 1 + (hasEndTitle ? 1 : 0);
+        onView(withId(R.id.titles)).check(TestUtilsAssertions.hasDisplayedChildren(nonNullTitles));
+
+        if (hasStartTitle) {
+            // Check that the title for the start page is displayed at the start edge of its parent
+            // (title strip)
+            onView(withId(R.id.titles)).check(matches(hasDescendant(
+                    allOf(withText(expectedStartTitle), isDisplayed(),
+                            TestUtilsMatchers.startAlignedToParent()))));
+        }
+        // Check that the title for the selected page is displayed centered in its parent
+        // (title strip)
+        onView(withId(R.id.titles)).check(matches(hasDescendant(
+                allOf(withText(expectedSelectedTitle), isDisplayed(),
+                        TestUtilsMatchers.centerAlignedInParent()))));
+        if (hasEndTitle) {
+            // Check that the title for the end page is displayed at the end edge of its parent
+            // (title strip)
+            onView(withId(R.id.titles)).check(matches(hasDescendant(
+                    allOf(withText(expectedEndTitle), isDisplayed(),
+                            TestUtilsMatchers.endAlignedToParent()))));
+        }
+    }
+
+    @SmallTest
+    public void testPagerStrip() {
+        // Set an adapter with 5 pages
+        final ColorPagerAdapter adapter = new ColorPagerAdapter();
+        adapter.add("Red", Color.RED);
+        adapter.add("Green", Color.GREEN);
+        adapter.add("Blue", Color.BLUE);
+        adapter.add("Yellow", Color.YELLOW);
+        adapter.add("Magenta", Color.MAGENTA);
+        onView(withId(R.id.pager)).perform(ViewPagerActions.setAdapter(adapter),
+                ViewPagerActions.scrollToPage(0));
+
+        // Check that the pager has a title strip
+        onView(withId(R.id.pager)).check(matches(hasDescendant(withId(R.id.titles))));
+        // Check that the title strip is displayed and is of the expected class
+        onView(withId(R.id.titles)).check(matches(allOf(
+                isDisplayed(), TestUtilsMatchers.isOfClass(getStripClass()))));
+
+        // The following block tests the overall layout of tab strip and main pager content
+        // (vertical stacking), the content of the tab strip (showing texts for the selected
+        // tab and the ones on its left / right) as well as the alignment of the content in the
+        // tab strip (selected in center, others on left and right).
+
+        // Check the content and alignment of title strip for selected page #0
+        testTitleStripLayout(null, "Red", "Green", R.id.page_0);
+
+        // Scroll one page to select page #1 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        testTitleStripLayout("Red", "Green", "Blue", R.id.page_1);
+
+        // Scroll one page to select page #2 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        testTitleStripLayout("Green", "Blue", "Yellow", R.id.page_2);
+
+        // Scroll one page to select page #3 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        testTitleStripLayout("Blue", "Yellow", "Magenta", R.id.page_3);
+
+        // Scroll one page to select page #4 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+        testTitleStripLayout("Yellow", "Magenta", null, R.id.page_4);
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollToPage(0));
+
+        assertStripInteraction();
+    }
+
+    /**
+     * Returns the class of the pager strip.
+     */
+    protected abstract Class getStripClass();
+
+    /**
+     * Checks assertions that are specific to the pager strip implementation (interactive or
+     * non interactive).
+     */
+    protected abstract void assertStripInteraction();
+}
diff --git a/v4/tests/java/android/support/v4/view/GravityCompatTest.java b/v4/tests/java/android/support/v4/view/GravityCompatTest.java
new file mode 100644
index 0000000..db62b0c
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/GravityCompatTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.view;
+
+import android.graphics.Rect;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.View;
+
+import android.support.v4.testutils.TestUtils;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.view.ViewCompat;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+public class GravityCompatTest extends AndroidTestCase {
+    @SmallTest
+    public void testConstants() {
+        // Compat constants must match core constants since they can be OR'd with
+        // other core constants.
+        assertEquals("Start constants", Gravity.START, GravityCompat.START);
+        assertEquals("End constants", Gravity.END, GravityCompat.END);
+    }
+
+    @SmallTest
+    public void testGetAbsoluteGravity() {
+        assertEquals("Left under LTR",
+                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_LTR),
+                Gravity.LEFT);
+        assertEquals("Right under LTR",
+                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_LTR),
+                Gravity.RIGHT);
+        assertEquals("Left under RTL",
+                GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_RTL),
+                Gravity.LEFT);
+        assertEquals("Right under RTL",
+                GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_RTL),
+                Gravity.RIGHT);
+
+        assertEquals("Start under LTR",
+                GravityCompat.getAbsoluteGravity(GravityCompat.START,
+                        ViewCompat.LAYOUT_DIRECTION_LTR),
+                Gravity.LEFT);
+        assertEquals("End under LTR",
+                GravityCompat.getAbsoluteGravity(GravityCompat.END,
+                        ViewCompat.LAYOUT_DIRECTION_LTR),
+                Gravity.RIGHT);
+
+        if (Build.VERSION.SDK_INT >= 17) {
+            // The following tests are only expected to pass on v17+ devices
+            assertEquals("Start under RTL",
+                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
+                            ViewCompat.LAYOUT_DIRECTION_RTL),
+                    Gravity.RIGHT);
+            assertEquals("End under RTL",
+                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
+                            ViewCompat.LAYOUT_DIRECTION_RTL),
+                    Gravity.LEFT);
+        } else {
+            // And on older devices START is always LEFT, END is always RIGHT
+            assertEquals("Start under RTL",
+                    GravityCompat.getAbsoluteGravity(GravityCompat.START,
+                            ViewCompat.LAYOUT_DIRECTION_RTL),
+                    Gravity.LEFT);
+            assertEquals("End under RTL",
+                    GravityCompat.getAbsoluteGravity(GravityCompat.END,
+                            ViewCompat.LAYOUT_DIRECTION_RTL),
+                    Gravity.RIGHT);
+        }
+    }
+
+    @SmallTest
+    public void testApplyNoOffsetsLtr() {
+        Rect outRect = new Rect();
+
+        // Left / top aligned under LTR direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Left / top aligned under LTR: ",
+                outRect, 0, 0, 100, 50);
+
+        // Center / top aligned under LTR direction
+        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Center / top aligned under LTR: ",
+                outRect, 50, 0, 150, 50);
+
+        // Right / top aligned under LTR direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Right / top aligned under LTR: ",
+                outRect, 100, 0, 200, 50);
+
+        // Left / center aligned under LTR direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Left / center aligned under LTR: ",
+                outRect, 0, 25, 100, 75);
+
+        // Center / center aligned under LTR direction
+        GravityCompat.apply(Gravity.CENTER, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Center / center aligned under LTR: ",
+                outRect, 50, 25, 150, 75);
+
+        // Right / center aligned under LTR direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Right / center aligned under LTR: ",
+                outRect, 100, 25, 200, 75);
+
+        // Left / bottom aligned under LTR direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Left / bottom aligned under LTR: ",
+                outRect, 0, 50, 100, 100);
+
+        // Center / bottom aligned under LTR direction
+        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Center / bottom aligned under LTR: ",
+                outRect, 50, 50, 150, 100);
+
+        // Right / bottom aligned under LTR direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Right / bottom aligned under LTR: ",
+                outRect, 100, 50, 200, 100);
+
+        // The following tests are expected to pass on all devices since START under LTR is LEFT
+        // and END under LTR is RIGHT on pre-v17 and v17+ versions of the platform.
+
+        // Start / top aligned under LTR direction
+        GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Start / top aligned under LTR: ",
+                outRect, 0, 0, 100, 50);
+
+        // End / top aligned under LTR direction
+        GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("End / top aligned under LTR: ",
+                outRect, 100, 0, 200, 50);
+
+        // Start / center aligned under LTR direction
+        GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Start / center aligned under LTR: ",
+                outRect, 0, 25, 100, 75);
+
+        // End / center aligned under LTR direction
+        GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("End / center aligned under LTR: ",
+                outRect, 100, 25, 200, 75);
+
+        // Start / bottom aligned under LTR direction
+        GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("Start / bottom aligned under LTR: ",
+                outRect, 0, 50, 100, 100);
+
+        // End / bottom aligned under LTR direction
+        GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+        TestUtils.assertRectangleBounds("End / bottom aligned under LTR: ",
+                outRect, 100, 50, 200, 100);
+    }
+
+    @SmallTest
+    public void testApplyNoOffsetsRtl() {
+        Rect outRect = new Rect();
+
+        // The following tests are expected to pass on all devices since they are using
+        // Gravity constants that are not RTL-aware
+
+        // Left / top aligned under RTL direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Left / top aligned under RTL: ",
+                outRect, 0, 0, 100, 50);
+
+        // Center / top aligned under RTL direction
+        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Center / top aligned under RTL: ",
+                outRect, 50, 0, 150, 50);
+
+        // Right / top aligned under RTL direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Right / top aligned under RTL: ",
+                outRect, 100, 0, 200, 50);
+
+        // Left / center aligned under RTL direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Left / center aligned under RTL: ",
+                outRect, 0, 25, 100, 75);
+
+        // Center / center aligned under RTL direction
+        GravityCompat.apply(Gravity.CENTER, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Center / center aligned under RTL: ",
+                outRect, 50, 25, 150, 75);
+
+        // Right / center aligned under RTL direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Right / center aligned under RTL: ",
+                outRect, 100, 25, 200, 75);
+
+        // Left / bottom aligned under RTL direction
+        GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Left / bottom aligned under RTL: ",
+                outRect, 0, 50, 100, 100);
+
+        // Center / bottom aligned under RTL direction
+        GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Center / bottom aligned under RTL: ",
+                outRect, 50, 50, 150, 100);
+
+        // Right / bottom aligned under RTL direction
+        GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
+                new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+        TestUtils.assertRectangleBounds("Right / bottom aligned under RTL: ",
+                outRect, 100, 50, 200, 100);
+
+
+        if (Build.VERSION.SDK_INT >= 17) {
+            // The following tests are only expected to pass on v17+ devices since START under
+            // RTL is RIGHT and END under RTL is LEFT only on those devices.
+
+            // Start / top aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
+                    outRect, 100, 0, 200, 50);
+
+            // End / top aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
+                    outRect, 0, 0, 100, 50);
+
+            // Start / center aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
+                    outRect, 100, 25, 200, 75);
+
+            // End / center aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
+                    outRect, 0, 25, 100, 75);
+
+            // Start / bottom aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
+                    outRect, 100, 50, 200, 100);
+
+            // End / bottom aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
+                    outRect, 0, 50, 100, 100);
+        } else {
+            // And on older devices START is always LEFT, END is always RIGHT
+
+            // Start / top aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
+                    outRect, 0, 0, 100, 50);
+
+            // End / top aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
+                    outRect, 100, 0, 200, 50);
+
+            // Start / center aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
+                    outRect, 0, 25, 100, 75);
+
+            // End / center aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
+                    outRect, 100, 25, 200, 75);
+
+            // Start / bottom aligned under RTL direction
+            GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
+                    outRect, 0, 50, 100, 100);
+
+            // End / bottom aligned under RTL direction
+            GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
+                    new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+            TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
+                    outRect, 100, 50, 200, 100);
+        }
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java b/v4/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
new file mode 100644
index 0000000..db08a1a
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.view;
+
+import android.view.View;
+
+import android.support.v4.view.MarginLayoutParamsCompat;
+import android.support.v4.view.ViewCompat;
+
+import android.os.Build;
+import android.view.ViewGroup;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+public class MarginLayoutParamsCompatTest extends AndroidTestCase {
+    @SmallTest
+    public void testLayoutDirection() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        assertEquals("Default LTR layout direction", ViewCompat.LAYOUT_DIRECTION_LTR,
+                MarginLayoutParamsCompat.getLayoutDirection(mlp));
+
+        MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+        if (Build.VERSION.SDK_INT >= 17) {
+            assertEquals("RTL layout direction", ViewCompat.LAYOUT_DIRECTION_RTL,
+                    MarginLayoutParamsCompat.getLayoutDirection(mlp));
+        } else {
+            assertEquals("Still LTR layout direction on older devices",
+                    ViewCompat.LAYOUT_DIRECTION_LTR,
+                    MarginLayoutParamsCompat.getLayoutDirection(mlp));
+        }
+
+        MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
+        assertEquals("Back to LTR layout direction", ViewCompat.LAYOUT_DIRECTION_LTR,
+                MarginLayoutParamsCompat.getLayoutDirection(mlp));
+    }
+
+
+    @SmallTest
+    public void testMappingOldMarginsToNewMarginsLtr() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        mlp.leftMargin = 50;
+        mlp.rightMargin = 80;
+
+        assertEquals("Mapping left to start under LTR", 50,
+                MarginLayoutParamsCompat.getMarginStart(mlp));
+        assertEquals("Mapping right to end under LTR", 80,
+                MarginLayoutParamsCompat.getMarginEnd(mlp));
+    }
+
+    @SmallTest
+    public void testMappingOldMarginsToNewMarginsRtl() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        mlp.leftMargin = 50;
+        mlp.rightMargin = 80;
+
+        MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        if (Build.VERSION.SDK_INT >= 17) {
+            assertEquals("Mapping right to start under RTL", 80,
+                    MarginLayoutParamsCompat.getMarginStart(mlp));
+            assertEquals("Mapping left to end under RTL", 50,
+                    MarginLayoutParamsCompat.getMarginEnd(mlp));
+        } else {
+            assertEquals("Mapping left to start under RTL on older devices", 50,
+                    MarginLayoutParamsCompat.getMarginStart(mlp));
+            assertEquals("Mapping right to end under RTL on older devices", 80,
+                    MarginLayoutParamsCompat.getMarginEnd(mlp));
+        }
+    }
+
+    @SmallTest
+    public void testMappingNewMarginsToNewMarginsLtr() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        MarginLayoutParamsCompat.setMarginStart(mlp, 50);
+        assertEquals("Resolved start margin under LTR", 50,
+                MarginLayoutParamsCompat.getMarginStart(mlp));
+        // Check that initial end / right margins are still 0
+        assertEquals("Default end margin under LTR", 0,
+                MarginLayoutParamsCompat.getMarginEnd(mlp));
+
+        MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
+        assertEquals("Resolved end margin under LTR", 80,
+                MarginLayoutParamsCompat.getMarginEnd(mlp));
+        // Check that start / left margins are still the same
+        assertEquals("Keeping start margin under LTR", 50,
+                MarginLayoutParamsCompat.getMarginStart(mlp));
+    }
+
+    @SmallTest
+    public void testMappingNewMarginsToNewMarginsRtl() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        // Note that unlike the test that checks mapping of left/right to start/end and has
+        // to do platform-specific checks, the checks in this test are platform-agnostic,
+        // relying on the relevant MarginLayoutParamsCompat to do the right mapping internally.
+
+        MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+        MarginLayoutParamsCompat.setMarginStart(mlp, 50);
+
+        assertEquals("Resolved start margin under RTL", 50,
+                MarginLayoutParamsCompat.getMarginStart(mlp));
+        // Check that initial end / right margins are still 0
+        assertEquals("Default end margin under RTL", 0,
+                MarginLayoutParamsCompat.getMarginEnd(mlp));
+
+        MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
+        assertEquals("Resolved end margin under RTL", 80,
+                MarginLayoutParamsCompat.getMarginEnd(mlp));
+        // Check that start / left margins are still the same
+        assertEquals("Keeping start margin under RTL", 50,
+                MarginLayoutParamsCompat.getMarginStart(mlp));
+    }
+
+    @SmallTest
+    public void testResolveMarginsLtr() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        MarginLayoutParamsCompat.setMarginStart(mlp, 50);
+        MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
+
+        // While there's no guarantee that left/right margin fields have been set / resolved
+        // prior to the resolveLayoutDirection call, they should be now
+        assertEquals("Resolved left margin field under LTR", 50, mlp.leftMargin);
+        assertEquals("Default right margin field under LTR", 0, mlp.rightMargin);
+
+        MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
+        MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
+
+        assertEquals("Resolved right margin field under LTR", 80, mlp.rightMargin);
+        assertEquals("Keeping left margin field under LTR", 50, mlp.leftMargin);
+    }
+
+    @SmallTest
+    public void testResolveMarginsRtl() {
+        ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
+
+        MarginLayoutParamsCompat.setMarginStart(mlp, 50);
+        MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        // While there's no guarantee that left/right margin fields have been set / resolved
+        // prior to the resolveLayoutDirection call, they should be now
+        if (Build.VERSION.SDK_INT >= 17) {
+            assertEquals("Default left margin field under RTL", 0, mlp.leftMargin);
+            assertEquals("Resolved right margin field under RTL", 50, mlp.rightMargin);
+        } else {
+            assertEquals("Resolved left margin field under RTL on older devices",
+                    50, mlp.leftMargin);
+            assertEquals("Default right margin field under RTL on older devices",
+                    0, mlp.rightMargin);
+        }
+
+        MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
+        MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        if (Build.VERSION.SDK_INT >= 17) {
+            assertEquals("Resolved left margin field under RTL", 80, mlp.leftMargin);
+            assertEquals("Keeping right margin field under RTL", 50, mlp.rightMargin);
+        } else {
+            assertEquals("Resolved right margin field under RTL on older devices",
+                    80, mlp.rightMargin);
+            assertEquals("Keeping left margin field under RTL on older devices",
+                    50, mlp.leftMargin);
+        }
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewCompatTest.java b/v4/tests/java/android/support/v4/view/ViewCompatTest.java
new file mode 100644
index 0000000..483d16b
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewCompatTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.view;
+
+import android.view.View;
+
+import android.support.v4.view.ViewCompat;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+public class ViewCompatTest extends AndroidTestCase {
+    @SmallTest
+    public void testConstants() {
+        // Compat constants must match core constants since they can be used interchangeably
+        // in various support lib calls.
+        assertEquals("LTR constants", View.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_LTR);
+        assertEquals("RTL constants", View.LAYOUT_DIRECTION_RTL, ViewCompat.LAYOUT_DIRECTION_RTL);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerActions.java b/v4/tests/java/android/support/v4/view/ViewPagerActions.java
new file mode 100644
index 0000000..b1e1a76
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewPagerActions.java
@@ -0,0 +1,261 @@
+/*
+ * 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.view;
+
+import android.support.test.espresso.UiController;
+import android.support.test.espresso.ViewAction;
+import android.support.test.espresso.action.CoordinatesProvider;
+import android.support.test.espresso.action.GeneralClickAction;
+import android.support.test.espresso.action.Press;
+import android.support.test.espresso.action.Tap;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+import android.widget.TextView;
+
+import org.hamcrest.Matcher;
+
+import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.hamcrest.Matchers.allOf;
+
+public class ViewPagerActions {
+    /**
+     * Moves <code>ViewPager</code> to the right by one page.
+     */
+    public static ViewAction scrollRight() {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isDisplayingAtLeast(90);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager scroll one page to the right";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                int current = viewPager.getCurrentItem();
+                viewPager.setCurrentItem(current + 1, false);
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Moves <code>ViewPager</code> to the left by one page.
+     */
+    public static ViewAction scrollLeft() {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isDisplayingAtLeast(90);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager scroll one page to the left";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                int current = viewPager.getCurrentItem();
+                viewPager.setCurrentItem(current - 1, false);
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Moves <code>ViewPager</code> to the last page.
+     */
+    public static ViewAction scrollToLast() {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isDisplayingAtLeast(90);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager scroll to last page";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                int size = viewPager.getAdapter().getCount();
+                if (size > 0) {
+                    viewPager.setCurrentItem(size - 1, false);
+                }
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Moves <code>ViewPager</code> to the first page.
+     */
+    public static ViewAction scrollToFirst() {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isDisplayingAtLeast(90);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager scroll to first page";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                int size = viewPager.getAdapter().getCount();
+                if (size > 0) {
+                    viewPager.setCurrentItem(0, false);
+                }
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Moves <code>ViewPager</code> to specific page.
+     */
+    public static ViewAction scrollToPage(final int page) {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isDisplayingAtLeast(90);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager move one page to the right";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                viewPager.setCurrentItem(page, false);
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Moves <code>ViewPager</code> to specific page.
+     */
+    public static ViewAction setAdapter(final PagerAdapter adapter) {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isAssignableFrom(ViewPager.class);
+            }
+
+            @Override
+            public String getDescription() {
+                return "ViewPager set adapter";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                ViewPager viewPager = (ViewPager) view;
+                viewPager.setAdapter(adapter);
+
+                uiController.loopMainThreadUntilIdle();
+            }
+        };
+    }
+
+    /**
+     * Clicks between two titles in a <code>ViewPager</code> title strip
+     */
+    public static ViewAction clickBetweenTwoTitles(final String title1, final String title2) {
+        return new GeneralClickAction(
+                Tap.SINGLE,
+                new CoordinatesProvider() {
+                    @Override
+                    public float[] calculateCoordinates(View view) {
+                        PagerTitleStrip pagerStrip = (PagerTitleStrip) view;
+
+                        // Get the screen position of the pager strip
+                        final int[] viewScreenPosition = new int[2];
+                        pagerStrip.getLocationOnScreen(viewScreenPosition);
+
+                        // Get the left / right of the first title
+                        int title1Left = 0, title1Right = 0, title2Left = 0, title2Right = 0;
+                        final int childCount = pagerStrip.getChildCount();
+                        for (int i = 0; i < childCount; i++) {
+                            final View child = pagerStrip.getChildAt(i);
+                            if (child instanceof TextView) {
+                                final TextView textViewChild = (TextView) child;
+                                final CharSequence childText = textViewChild.getText();
+                                if (title1.equals(childText)) {
+                                    title1Left = textViewChild.getLeft();
+                                    title1Right = textViewChild.getRight();
+                                } else if (title2.equals(childText)) {
+                                    title2Left = textViewChild.getLeft();
+                                    title2Right = textViewChild.getRight();
+                                }
+                            }
+                        }
+
+                        if (title1Right < title2Left) {
+                            // Title 1 is to the left of title 2
+                            return new float[] {
+                                    viewScreenPosition[0] + (title1Right + title2Left) / 2,
+                                    viewScreenPosition[1] + pagerStrip.getHeight() / 2 };
+                        } else {
+                            // The assumption here is that PagerTitleStrip prevents titles
+                            // from overlapping, so if we get here it means that title 1
+                            // is to the right of title 2
+                            return new float[] {
+                                    viewScreenPosition[0] + (title2Right + title1Left) / 2,
+                                    viewScreenPosition[1] + pagerStrip.getHeight() / 2 };
+                        }
+                    }
+                },
+                Press.FINGER);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
new file mode 100644
index 0000000..edc4da9
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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.view;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.test.R;
+import android.view.WindowManager;
+
+import java.util.ArrayList;
+
+public class ViewPagerWithTabStripActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(R.layout.view_pager_with_tab_strip);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
new file mode 100644
index 0000000..706d2e2
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.view;
+
+import android.support.v4.view.PagerTitleStrip;
+import android.support.v4.test.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.hamcrest.Matchers.allOf;
+
+/**
+ * Provides assertions that depend on the interactive nature of <code>PagerTabStrip</code>.
+ */
+public class ViewPagerWithTabStripTest extends BaseViewPagerTest<ViewPagerWithTabStripActivity> {
+    public ViewPagerWithTabStripTest() {
+        super(ViewPagerWithTabStripActivity.class);
+    }
+
+    @Override
+    protected Class getStripClass() {
+        return PagerTabStrip.class;
+    }
+
+    @Override
+    protected void assertStripInteraction() {
+        // The following block tests that ViewPager page selection changes on clicking titles of
+        // various tabs as PagerTabStrip is interactive
+
+        // Click the tab title for page #0 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #0", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #0 and verify that we're on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #1", 0, mViewPager.getCurrentItem());
+
+        // Go back to page #1
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+
+        // Click the tab title for page #1 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #2 and verify that we're on page #2
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
+        assertEquals("Click tab #2 on tab #1", 2, mViewPager.getCurrentItem());
+
+        // The following block tests that ViewPager page selection changes on clicking in
+        // between titles of tabs as that functionality is exposed by PagerTabStrip
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollToPage(0));
+
+        // Click between titles of page #0 and page #1 and verify that we're on page #1
+        onView(withId(R.id.titles)).perform(ViewPagerActions.clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #0", 1, mViewPager.getCurrentItem());
+
+        // Click between titles of page #0 and page #1 and verify that we're on page #0
+        onView(withId(R.id.titles)).perform(ViewPagerActions.clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #1", 0, mViewPager.getCurrentItem());
+
+        // Go back to page #1
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+
+        // Click between titles of page #1 and page #2 and verify that we're on page #2
+        onView(withId(R.id.titles)).perform(
+                ViewPagerActions.clickBetweenTwoTitles("Green", "Blue"));
+        assertEquals("Click in between tabs #1 and #2 on tab #1", 2, mViewPager.getCurrentItem());
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
new file mode 100644
index 0000000..28dcb07
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
@@ -0,0 +1,33 @@
+/*
+ * 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.view;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.test.R;
+import android.view.WindowManager;
+
+import java.util.ArrayList;
+
+public class ViewPagerWithTitleStripActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(R.layout.view_pager_with_title_strip);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
new file mode 100644
index 0000000..528db86
--- /dev/null
+++ b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.view;
+
+import android.support.v4.view.PagerTitleStrip;
+import android.support.v4.test.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.hamcrest.Matchers.allOf;
+
+/**
+ * Provides assertions that depend on the non-interactive nature of <code>PagerTabStrip</code>.
+ */
+public class ViewPagerWithTitleStripTest
+        extends BaseViewPagerTest<ViewPagerWithTitleStripActivity> {
+    public ViewPagerWithTitleStripTest() {
+        super(ViewPagerWithTitleStripActivity.class);
+    }
+
+    @Override
+    protected Class getStripClass() {
+        return PagerTitleStrip.class;
+    }
+
+    @Override
+    protected void assertStripInteraction() {
+        // The following block tests that nothing happens on clicking titles of various tabs
+        // as PagerTitleStrip is not interactive
+
+        // Click the tab title for page #0 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #0", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+
+        // Click the tab title for page #0 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #2 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
+        assertEquals("Click tab #2 on tab #1", 1, mViewPager.getCurrentItem());
+
+
+        // The following block tests that nothing happens on clicking in between titles of various
+        // tabs as PagerTitleStrip is not interactive
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollToPage(0));
+
+        // Click between titles of page #0 and page #1 and verify that we're still on page #0
+        onView(withId(R.id.titles)).perform(ViewPagerActions.clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Go to page #1
+        onView(withId(R.id.pager)).perform(ViewPagerActions.scrollRight());
+
+        // Click between titles of page #1 and page #2 and verify that we're still on page #1
+        onView(withId(R.id.titles)).perform(
+                ViewPagerActions.clickBetweenTwoTitles("Green", "Blue"));
+        assertEquals("Click in between tabs #1 and #2 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click between titles of page #0 and page #1 and verify that we're still on page #1
+        onView(withId(R.id.titles)).perform(
+                ViewPagerActions.clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #1", 1, mViewPager.getCurrentItem());
+    }
+}
diff --git a/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java b/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
index a7d2339..d0f5b00 100644
--- a/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
+++ b/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
@@ -23,57 +23,438 @@
 import org.junit.runner.RunWith;
 
 import android.app.Instrumentation;
+import android.content.res.Resources;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Looper;
 import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.support.annotation.ColorInt;
+import android.support.annotation.LayoutRes;
 import android.support.test.InstrumentationRegistry;
+import android.support.v4.test.R;
+import android.support.v4.view.ViewCompat;
 import android.support.v4.widget.TextViewCompat;
+import android.support.v4.testutils.TestUtils;
+import android.util.DisplayMetrics;
 import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.TextView;
 
-import android.support.test.runner.AndroidJUnit4;
-
-@RunWith(AndroidJUnit4.class)
 public class TextViewCompatTest extends ActivityInstrumentationTestCase2<TestActivity> {
-    private boolean mDebug;
+    private static final String TAG = "TextViewCompatTest";
 
-    Throwable mainThreadException;
+    private TextView mTextView;
 
-    Thread mInstrumentationThread;
+    private class TestDrawable extends ColorDrawable {
+        private int mWidth;
+        private int mHeight;
+
+        public TestDrawable(@ColorInt int color, int width, int height) {
+            super(color);
+            mWidth = width;
+            mHeight = height;
+        }
+
+        @Override
+        public int getIntrinsicWidth() {
+            return mWidth;
+        }
+
+        @Override
+        public int getIntrinsicHeight() {
+            return mHeight;
+        }
+    }
 
     public TextViewCompatTest() {
         super("android.support.v4.widget", TestActivity.class);
-        mDebug = false;
     }
 
-    @Before
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        mInstrumentationThread = Thread.currentThread();
-
-        // Note that injectInstrumentation was added in v5. Since this is v4 we have to use
-        // the misspelled (and deprecated) inject API.
-        injectInsrumentation(InstrumentationRegistry.getInstrumentation());
-    }
-
-    @After
     @Override
     public void tearDown() throws Exception {
+        if (mTextView != null) {
+            removeTextView();
+        }
+
         getInstrumentation().waitForIdleSync();
         super.tearDown();
     }
 
-    @Test
+    private boolean isMainThread() {
+        return Looper.myLooper() == Looper.getMainLooper();
+    }
+
+    private void removeTextView() {
+        if (mTextView == null) {
+            return;
+        }
+        if (!isMainThread()) {
+            getInstrumentation().waitForIdleSync();
+        }
+        try {
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    getActivity().mContainer.removeAllViews();
+                }
+            });
+        } catch (Throwable throwable) {
+            Log.e(TAG, "", throwable);
+        }
+        mTextView = null;
+    }
+
+    private void createAndAddTextView() {
+        final TestActivity activity = getActivity();
+        mTextView = new TextView(activity);
+        activity.mContainer.addView(mTextView);
+
+        // Explicitly measure and layout the text view. This way the core TextView updates its
+        // internal tracking of various visual facets so those can be tested in the relevant
+        // tests - such as, for example, where each drawable is positioned relative to the text.
+        final DisplayMetrics metrics = getActivity().getResources().getDisplayMetrics();
+        int textViewWidthPx = TestUtils.convertSizeDipsToPixels(metrics, 200);
+        int textViewHeightPx = TestUtils.convertSizeDipsToPixels(metrics, 60);
+        mTextView.measure(
+                View.MeasureSpec.makeMeasureSpec(textViewWidthPx, View.MeasureSpec.EXACTLY),
+                View.MeasureSpec.makeMeasureSpec(textViewHeightPx, View.MeasureSpec.EXACTLY));
+        mTextView.layout(0, 0, textViewWidthPx, textViewHeightPx);
+    }
+
+    @UiThreadTest
+    @SmallTest
     public void testMaxLines() throws Throwable {
-        final TextView textView = new TextView(getActivity());
-        textView.setMaxLines(4);
+        createAndAddTextView();
+        final int maxLinesCount = 4;
+        mTextView.setMaxLines(maxLinesCount);
 
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                getActivity().mContainer.addView(textView);
-            }
-        });
+        assertEquals("Empty view: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
 
-        assertEquals("Max lines must match", TextViewCompat.getMaxLines(textView), 4);
+        mTextView.setText(R.string.test_text_short);
+        assertEquals("Short text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+
+        mTextView.setText(R.string.test_text_medium);
+        assertEquals("Medium text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+
+        mTextView.setText(R.string.test_text_long);
+        assertEquals("Long text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testMinLines() throws Throwable {
+        createAndAddTextView();
+        final int minLinesCount = 3;
+        mTextView.setMinLines(minLinesCount);
+
+        assertEquals("Empty view: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        mTextView.setText(R.string.test_text_short);
+        assertEquals("Short text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        mTextView.setText(R.string.test_text_medium);
+        assertEquals("Medium text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        mTextView.setText(R.string.test_text_long);
+        assertEquals("Long text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testStyle() throws Throwable {
+        createAndAddTextView();
+
+        TextViewCompat.setTextAppearance(mTextView, R.style.TextMediumStyle);
+
+        final Resources res = getActivity().getResources();
+        assertTrue("Styled text view: style",
+                mTextView.getTypeface().isItalic() || (mTextView.getPaint().getTextSkewX() < 0));
+        assertEquals("Styled text view: color", mTextView.getTextColors().getDefaultColor(),
+                res.getColor(R.color.text_color));
+        assertEquals("Styled text view: size", mTextView.getTextSize(),
+                (float) res.getDimensionPixelSize(R.dimen.text_medium_size));
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testCompoundDrawablesRelative() throws Throwable {
+        createAndAddTextView();
+
+        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
+        drawableStart.setBounds(0, 0, 20, 20);
+        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
+        drawableTop.setBounds(0, 0, 30, 25);
+        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
+        drawableEnd.setBounds(0, 0, 25, 20);
+
+        mTextView.setText(R.string.test_text_medium);
+        TextViewCompat.setCompoundDrawablesRelative(mTextView, drawableStart, drawableTop,
+                drawableEnd, null);
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 20);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
+        assertEquals("Compound drawable: top width",
+                drawablesAbsolute[1].getBounds().width(), 30);
+        assertEquals("Compound drawable: top height",
+                drawablesAbsolute[1].getBounds().height(), 25);
+
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 25);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testCompoundDrawablesRelativeRtl() throws Throwable {
+        createAndAddTextView();
+
+        ViewCompat.setLayoutDirection(mTextView, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
+        drawableStart.setBounds(0, 0, 20, 20);
+        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
+        drawableTop.setBounds(0, 0, 30, 25);
+        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
+        drawableEnd.setBounds(0, 0, 25, 20);
+
+        mTextView.setText(R.string.test_text_medium);
+        TextViewCompat.setCompoundDrawablesRelative(mTextView, drawableStart, drawableTop,
+                drawableEnd, null);
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        // End drawable should be returned as left
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 25);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[1].getBounds().width(), 30);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[1].getBounds().height(), 25);
+
+        // Start drawable should be returned as right
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[2].getBounds().width(), 20);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBounds() throws Throwable {
+        createAndAddTextView();
+
+        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
+        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
+        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
+
+        mTextView.setText(R.string.test_text_long);
+        TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(mTextView, drawableStart,
+                null, drawableEnd, drawableBottom);
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 30);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 25);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 45);
+
+        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(), 15);
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(), 35);
+    }
+
+    @UiThreadTest
+    @SmallTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsRtl() throws Throwable {
+        createAndAddTextView();
+
+        ViewCompat.setLayoutDirection(mTextView, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
+        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
+        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
+
+        mTextView.setText(R.string.test_text_long);
+        TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(mTextView, drawableStart,
+                null, drawableEnd, drawableBottom);
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        // End drawable should be returned as left
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 25);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 45);
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // Start drawable should be returned as right
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 30);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(), 15);
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(), 35);
+    }
+
+    @UiThreadTest
+    @MediumTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsById() throws Throwable {
+        createAndAddTextView();
+
+        mTextView.setText(R.string.test_text_long);
+        TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(mTextView,
+                R.drawable.test_drawable_red, 0,
+                R.drawable.test_drawable_green, R.drawable.test_drawable_blue);
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+        final Resources res = getActivity().getResources();
+
+        // The entire left drawable should be the specific red color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
+                drawablesAbsolute[0], res.getColor(R.color.test_red));
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // The entire right drawable should be the specific green color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
+                drawablesAbsolute[2], res.getColor(R.color.test_green));
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+
+        // The entire bottom drawable should be the specific blue color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
+                drawablesAbsolute[3], res.getColor(R.color.test_blue));
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+    }
+
+    @UiThreadTest
+    @MediumTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsByIdRtl() throws Throwable {
+        createAndAddTextView();
+
+        ViewCompat.setLayoutDirection(mTextView, ViewCompat.LAYOUT_DIRECTION_RTL);
+
+        mTextView.setText(R.string.test_text_long);
+        TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(mTextView,
+                R.drawable.test_drawable_red, 0,
+                R.drawable.test_drawable_green, R.drawable.test_drawable_blue);
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+        final Resources res = getActivity().getResources();
+
+        // The entire left / end drawable should be the specific green color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
+                drawablesAbsolute[0], res.getColor(R.color.test_green));
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // The entire right drawable should be the specific red color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
+                drawablesAbsolute[2], res.getColor(R.color.test_red));
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+
+        // The entire bottom drawable should be the specific blue color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
+                drawablesAbsolute[3], res.getColor(R.color.test_blue));
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
     }
 }
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/color/complex_themed_selector.xml
similarity index 68%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/color/complex_themed_selector.xml
index 5576c18..8ef5060 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/color/complex_themed_selector.xml
@@ -14,6 +14,9 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:color="?attr/theme_color_focused" />
+    <item android:state_pressed="true" android:color="?attr/theme_color_pressed" />
+    <item android:color="?attr/theme_color_default"/>
+</selector>
+
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/color/complex_unthemed_selector.xml
similarity index 67%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/color/complex_unthemed_selector.xml
index 5576c18..bdb93c9 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/color/complex_unthemed_selector.xml
@@ -14,6 +14,9 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:color="@color/selector_color_focused" />
+    <item android:state_pressed="true" android:color="@color/selector_color_pressed" />
+    <item android:color="@color/selector_color_default"/>
+</selector>
+
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/color/simple_themed_selector.xml
similarity index 80%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/color/simple_themed_selector.xml
index 5576c18..e225add 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/color/simple_themed_selector.xml
@@ -14,6 +14,7 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/theme_color_default"/> <!-- not selected -->
+</selector>
+
diff --git a/v4/tests/res/drawable-hdpi/density_aware_drawable.png b/v4/tests/res/drawable-hdpi/density_aware_drawable.png
new file mode 100644
index 0000000..dd8a7fe
--- /dev/null
+++ b/v4/tests/res/drawable-hdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-mdpi/density_aware_drawable.png b/v4/tests/res/drawable-mdpi/density_aware_drawable.png
new file mode 100644
index 0000000..5c0ff0e
--- /dev/null
+++ b/v4/tests/res/drawable-mdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-mdpi/test_drawable.png b/v4/tests/res/drawable-mdpi/test_drawable.png
new file mode 100644
index 0000000..1ce5321
--- /dev/null
+++ b/v4/tests/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-xhdpi/density_aware_drawable.png b/v4/tests/res/drawable-xhdpi/density_aware_drawable.png
new file mode 100644
index 0000000..ce7e2c6
--- /dev/null
+++ b/v4/tests/res/drawable-xhdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-xxhdpi/density_aware_drawable.png b/v4/tests/res/drawable-xxhdpi/density_aware_drawable.png
new file mode 100644
index 0000000..c2ebfcb
--- /dev/null
+++ b/v4/tests/res/drawable-xxhdpi/density_aware_drawable.png
Binary files differ
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/drawable/test_drawable_blue.xml
similarity index 69%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/drawable/test_drawable_blue.xml
index 5576c18..5d05ef2 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/drawable/test_drawable_blue.xml
@@ -14,6 +14,12 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="@dimen/drawable_large_size"
+        android:height="@dimen/drawable_small_size" />
+    <solid
+        android:color="@color/test_blue" />
+</shape>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/drawable/test_drawable_green.xml
similarity index 69%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/drawable/test_drawable_green.xml
index 5576c18..9f33104 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/drawable/test_drawable_green.xml
@@ -14,6 +14,12 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="@dimen/drawable_medium_size"
+        android:height="@dimen/drawable_large_size" />
+    <solid
+        android:color="@color/test_green" />
+</shape>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/drawable/test_drawable_red.xml
similarity index 69%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/drawable/test_drawable_red.xml
index 5576c18..cd1af56 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/drawable/test_drawable_red.xml
@@ -14,6 +14,12 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="@dimen/drawable_small_size"
+        android:height="@dimen/drawable_medium_size" />
+    <solid
+        android:color="@color/test_red" />
+</shape>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/drawable/themed_bitmap.xml
similarity index 80%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/drawable/themed_bitmap.xml
index 5576c18..111d14e 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/drawable/themed_bitmap.xml
@@ -14,6 +14,6 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/test_drawable"
+    android:tint="?attr/theme_color_default" />
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/drawable/themed_drawable.xml
similarity index 69%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/drawable/themed_drawable.xml
index 5576c18..08d89c7 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/drawable/themed_drawable.xml
@@ -14,6 +14,12 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="@dimen/drawable_large_size"
+        android:height="@dimen/drawable_small_size" />
+    <solid
+        android:color="?attr/theme_color_default" />
+</shape>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/layout/activity_content.xml
similarity index 69%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/layout/activity_content.xml
index 5576c18..8870e60 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/layout/activity_content.xml
@@ -5,7 +5,7 @@
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
 
-          http://www.apache.org/licenses/LICENSE-2.0
+         http://www.apache.org/licenses/LICENSE-2.0
 
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,6 +14,7 @@
      limitations under the License.
 -->
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:id="@+id/content"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"/>
diff --git a/v4/tests/res/layout/fragment_end.xml b/v4/tests/res/layout/fragment_end.xml
new file mode 100644
index 0000000..aa3d9e8
--- /dev/null
+++ b/v4/tests/res/layout/fragment_end.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="destination"
+              android:id="@+id/hello"
+              android:text="@string/hello"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:id="@+id/greenSquare"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:id="@+id/redSquare"/>
+</LinearLayout>
diff --git a/v4/tests/res/layout/fragment_middle.xml b/v4/tests/res/layout/fragment_middle.xml
new file mode 100644
index 0000000..7d1409b
--- /dev/null
+++ b/v4/tests/res/layout/fragment_middle.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#00F"
+          android:id="@+id/blueSquare"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#FF0"
+          android:id="@+id/yellowSquare"/>
+</LinearLayout>
diff --git a/v4/tests/res/layout/fragment_start.xml b/v4/tests/res/layout/fragment_start.xml
new file mode 100644
index 0000000..793e9b5
--- /dev/null
+++ b/v4/tests/res/layout/fragment_start.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:id="@+id/greenSquare"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:id="@+id/redSquare"/>
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="source"
+              android:id="@+id/hello"
+              android:text="@string/hello"/>
+</LinearLayout>
diff --git a/v4/tests/res/layout/view_pager_with_tab_strip.xml b/v4/tests/res/layout/view_pager_with_tab_strip.xml
new file mode 100644
index 0000000..115b672
--- /dev/null
+++ b/v4/tests/res/layout/view_pager_with_tab_strip.xml
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<android.support.v4.view.ViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/pager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.support.v4.view.PagerTabStrip
+        android:id="@+id/titles"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top" />
+
+</android.support.v4.view.ViewPager>
+
diff --git a/v4/tests/res/layout/view_pager_with_title_strip.xml b/v4/tests/res/layout/view_pager_with_title_strip.xml
new file mode 100644
index 0000000..de248df
--- /dev/null
+++ b/v4/tests/res/layout/view_pager_with_title_strip.xml
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<android.support.v4.view.ViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/pager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.support.v4.view.PagerTitleStrip
+        android:id="@+id/titles"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top" />
+
+</android.support.v4.view.ViewPager>
+
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values-hdpi/dimens.xml
old mode 100644
new mode 100755
similarity index 84%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values-hdpi/dimens.xml
index 5576c18..eb1ff54
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values-hdpi/dimens.xml
@@ -13,7 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <dimen name="density_aware_size">14dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values-mdpi/dimens.xml
old mode 100644
new mode 100755
similarity index 84%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values-mdpi/dimens.xml
index 5576c18..5766379
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values-mdpi/dimens.xml
@@ -13,7 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <dimen name="density_aware_size">12dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values-xhdpi/dimens.xml
old mode 100644
new mode 100755
similarity index 84%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values-xhdpi/dimens.xml
index 5576c18..a25d23d
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values-xhdpi/dimens.xml
@@ -13,7 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <dimen name="density_aware_size">16dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values-xxhdpi/dimens.xml
old mode 100644
new mode 100755
similarity index 84%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values-xxhdpi/dimens.xml
index 5576c18..399cde1
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values-xxhdpi/dimens.xml
@@ -13,7 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <dimen name="density_aware_size">18dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values/attrs.xml
similarity index 68%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values/attrs.xml
index 5576c18..36d1e9e 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values/attrs.xml
@@ -13,7 +13,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <attr name="theme_color_default" format="reference" />
+    <attr name="theme_color_focused" format="reference" />
+    <attr name="theme_color_pressed" format="reference" />
+    <attr name="theme_color_selected" format="reference" />
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/colors.xml b/v4/tests/res/values/colors.xml
new file mode 100644
index 0000000..15158cf
--- /dev/null
+++ b/v4/tests/res/values/colors.xml
@@ -0,0 +1,37 @@
+<?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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <color name="text_color">#FF8090</color>
+
+    <color name="selector_color_default">#70A0C0</color>
+    <color name="selector_color_focused">#70B0F0</color>
+    <color name="selector_color_pressed">#6080B0</color>
+
+    <color name="theme_color_yellow_default">#F0B000</color>
+    <color name="theme_color_yellow_focused">#F0A020</color>
+    <color name="theme_color_yellow_pressed">#E0A040</color>
+    <color name="theme_color_yellow_selected">#E8A848</color>
+
+    <color name="theme_color_lilac_default">#F080F0</color>
+    <color name="theme_color_lilac_focused">#F070D0</color>
+    <color name="theme_color_lilac_pressed">#E070A0</color>
+    <color name="theme_color_lilac_selected">#E878A8</color>
+
+    <color name="test_red">#FF6030</color>
+    <color name="test_green">#50E080</color>
+    <color name="test_blue">#3050CF</color>
+    <color name="test_yellow">#F0F000</color>
+</resources>
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values/dimens.xml
similarity index 71%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values/dimens.xml
index 5576c18..5c82462 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values/dimens.xml
@@ -13,7 +13,10 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <dimen name="text_medium_size">20sp</dimen>
 
-<resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+    <dimen name="drawable_small_size">12dip</dimen>
+    <dimen name="drawable_medium_size">16dip</dimen>
+    <dimen name="drawable_large_size">20dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v4/tests/res/values/ids.xml
similarity index 65%
copy from v7/appcompat/res/values-h320dp/bools.xml
copy to v4/tests/res/values/ids.xml
index 5576c18..e5fcf63 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v4/tests/res/values/ids.xml
@@ -13,7 +13,15 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
 <resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
-</resources>
+    <item name="page_0" type="id"/>
+    <item name="page_1" type="id"/>
+    <item name="page_2" type="id"/>
+    <item name="page_3" type="id"/>
+    <item name="page_4" type="id"/>
+    <item name="page_5" type="id"/>
+    <item name="page_6" type="id"/>
+    <item name="page_7" type="id"/>
+    <item name="page_8" type="id"/>
+    <item name="page_9" type="id"/>
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/strings.xml b/v4/tests/res/values/strings.xml
new file mode 100644
index 0000000..b804faf
--- /dev/null
+++ b/v4/tests/res/values/strings.xml
@@ -0,0 +1,24 @@
+<?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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Short text for testing. -->
+    <string name="test_text_short">Lorem ipsum</string>
+    <!-- Medium text for testing. -->
+    <string name="test_text_medium">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque.</string>
+    <!-- Long text for testing. -->
+    <string name="test_text_long">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque. Proin ac mauris cursus nulla aliquam viverra. Vivamus pharetra luctus magna, lacinia imperdiet leo mollis eget. Fusce a diam ipsum. Etiam sit amet nisl et velit aliquam dignissim eget nec nisi. Duis bibendum euismod tortor non pulvinar. Nunc quis neque ultricies nulla luctus aliquet. Sed consectetur, orci ac vehicula consectetur, metus sem pellentesque turpis, sed venenatis nisi lorem vitae ante.</string>
+    <string name="hello">Hello World</string>
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/styles.xml b/v4/tests/res/values/styles.xml
new file mode 100644
index 0000000..c0855d8
--- /dev/null
+++ b/v4/tests/res/values/styles.xml
@@ -0,0 +1,34 @@
+<?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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <style name="TextMediumStyle" parent="@android:style/TextAppearance.Medium">
+        <item name="android:textSize">@dimen/text_medium_size</item>
+        <item name="android:textColor">@color/text_color</item>
+        <item name="android:textStyle">italic</item>
+    </style>
+
+    <style name="YellowTheme" parent="@android:style/Theme.Light">
+        <item name="theme_color_default">@color/theme_color_yellow_default</item>
+        <item name="theme_color_focused">@color/theme_color_yellow_focused</item>
+        <item name="theme_color_pressed">@color/theme_color_yellow_pressed</item>
+    </style>
+
+    <style name="LilacTheme" parent="@android:style/Theme.Light">
+        <item name="theme_color_default">@color/theme_color_lilac_default</item>
+        <item name="theme_color_focused">@color/theme_color_lilac_focused</item>
+        <item name="theme_color_pressed">@color/theme_color_lilac_pressed</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/api/23.1.1.txt b/v7/appcompat/api/23.1.1.txt
new file mode 100644
index 0000000..2d53759
--- /dev/null
+++ b/v7/appcompat/api/23.1.1.txt
@@ -0,0 +1,2080 @@
+package android.support.v7.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
+    method public abstract android.view.View getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method public abstract deprecated int getNavigationItemCount();
+    method public abstract deprecated int getNavigationMode();
+    method public abstract deprecated int getSelectedNavigationIndex();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
+    method public abstract deprecated int getTabCount();
+    method public android.content.Context getThemedContext();
+    method public abstract java.lang.CharSequence getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
+    method public abstract deprecated void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void removeTabAt(int);
+    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setCustomView(android.view.View);
+    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(java.lang.CharSequence);
+    method public void setHomeActionContentDescription(int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
+    method public abstract void setLogo(int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setNavigationMode(int);
+    method public abstract deprecated void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
+    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
+    field public int gravity;
+  }
+
+  public static abstract interface ActionBar.OnMenuVisibilityListener {
+    method public abstract void onMenuVisibilityChanged(boolean);
+  }
+
+  public static abstract deprecated interface ActionBar.OnNavigationListener {
+    method public abstract boolean onNavigationItemSelected(int, long);
+  }
+
+  public static abstract deprecated class ActionBar.Tab {
+    ctor public ActionBar.Tab();
+    method public abstract java.lang.CharSequence getContentDescription();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.graphics.drawable.Drawable getIcon();
+    method public abstract int getPosition();
+    method public abstract java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getText();
+    method public abstract void select();
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
+    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static abstract deprecated interface ActionBar.TabListener {
+    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+  }
+
+  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
+    ctor public ActionBarActivity();
+  }
+
+  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
+    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
+    method public void syncState();
+  }
+
+  public static abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.content.Context getActionBarThemedContext();
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract boolean isNavigationVisible();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.widget.Button getButton(int);
+    method public android.widget.ListView getListView();
+    method public void setButton(int, java.lang.CharSequence, android.os.Message);
+    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public void setCustomTitle(android.view.View);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIconAttribute(int);
+    method public void setMessage(java.lang.CharSequence);
+    method public void setView(android.view.View);
+    method public void setView(android.view.View, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, int);
+    method public android.support.v7.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
+    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
+    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setView(int);
+    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
+    method public android.support.v7.app.AlertDialog show();
+  }
+
+  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
+    ctor public AppCompatActivity();
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public android.content.Intent getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public deprecated void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public deprecated void setSupportProgress(int);
+    method public deprecated void setSupportProgressBarIndeterminate(boolean);
+    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
+    method public deprecated void setSupportProgressBarVisibility(boolean);
+    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public abstract interface AppCompatCallback {
+    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
+    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration);
+    method public abstract void onCreate(android.os.Bundle);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle);
+    method public abstract void onPostResume();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public abstract void setContentView(android.view.View);
+    method public abstract void setContentView(int);
+    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+  }
+
+  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+  }
+
+  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
+    ctor public NotificationCompat();
+  }
+
+  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context);
+  }
+
+  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MediaStyle();
+    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v7.appcompat {
+
+  public final class R {
+    ctor public R();
+  }
+
+  public static final class R.anim {
+    ctor public R.anim();
+    field public static int abc_fade_in;
+    field public static int abc_fade_out;
+    field public static int abc_grow_fade_in_from_bottom;
+    field public static int abc_popup_enter;
+    field public static int abc_popup_exit;
+    field public static int abc_shrink_fade_out_from_bottom;
+    field public static int abc_slide_in_bottom;
+    field public static int abc_slide_in_top;
+    field public static int abc_slide_out_bottom;
+    field public static int abc_slide_out_top;
+  }
+
+  public static final class R.attr {
+    ctor public R.attr();
+    field public static int actionBarDivider;
+    field public static int actionBarItemBackground;
+    field public static int actionBarPopupTheme;
+    field public static int actionBarSize;
+    field public static int actionBarSplitStyle;
+    field public static int actionBarStyle;
+    field public static int actionBarTabBarStyle;
+    field public static int actionBarTabStyle;
+    field public static int actionBarTabTextStyle;
+    field public static int actionBarTheme;
+    field public static int actionBarWidgetTheme;
+    field public static int actionButtonStyle;
+    field public static int actionDropDownStyle;
+    field public static int actionLayout;
+    field public static int actionMenuTextAppearance;
+    field public static int actionMenuTextColor;
+    field public static int actionModeBackground;
+    field public static int actionModeCloseButtonStyle;
+    field public static int actionModeCloseDrawable;
+    field public static int actionModeCopyDrawable;
+    field public static int actionModeCutDrawable;
+    field public static int actionModeFindDrawable;
+    field public static int actionModePasteDrawable;
+    field public static int actionModePopupWindowStyle;
+    field public static int actionModeSelectAllDrawable;
+    field public static int actionModeShareDrawable;
+    field public static int actionModeSplitBackground;
+    field public static int actionModeStyle;
+    field public static int actionModeWebSearchDrawable;
+    field public static int actionOverflowButtonStyle;
+    field public static int actionOverflowMenuStyle;
+    field public static int actionProviderClass;
+    field public static int actionViewClass;
+    field public static int activityChooserViewStyle;
+    field public static int alertDialogButtonGroupStyle;
+    field public static int alertDialogCenterButtons;
+    field public static int alertDialogStyle;
+    field public static int alertDialogTheme;
+    field public static int allowStacking;
+    field public static int arrowHeadLength;
+    field public static int arrowShaftLength;
+    field public static int autoCompleteTextViewStyle;
+    field public static int background;
+    field public static int backgroundSplit;
+    field public static int backgroundStacked;
+    field public static int backgroundTint;
+    field public static int backgroundTintMode;
+    field public static int barLength;
+    field public static int borderlessButtonStyle;
+    field public static int buttonBarButtonStyle;
+    field public static int buttonBarNegativeButtonStyle;
+    field public static int buttonBarNeutralButtonStyle;
+    field public static int buttonBarPositiveButtonStyle;
+    field public static int buttonBarStyle;
+    field public static int buttonPanelSideLayout;
+    field public static int buttonStyle;
+    field public static int buttonStyleSmall;
+    field public static int buttonTint;
+    field public static int buttonTintMode;
+    field public static int checkboxStyle;
+    field public static int checkedTextViewStyle;
+    field public static int closeIcon;
+    field public static int closeItemLayout;
+    field public static int collapseContentDescription;
+    field public static int collapseIcon;
+    field public static int color;
+    field public static int colorAccent;
+    field public static int colorButtonNormal;
+    field public static int colorControlActivated;
+    field public static int colorControlHighlight;
+    field public static int colorControlNormal;
+    field public static int colorPrimary;
+    field public static int colorPrimaryDark;
+    field public static int colorSwitchThumbNormal;
+    field public static int commitIcon;
+    field public static int contentInsetEnd;
+    field public static int contentInsetLeft;
+    field public static int contentInsetRight;
+    field public static int contentInsetStart;
+    field public static int controlBackground;
+    field public static int customNavigationLayout;
+    field public static int defaultQueryHint;
+    field public static int dialogPreferredPadding;
+    field public static int dialogTheme;
+    field public static int displayOptions;
+    field public static int divider;
+    field public static int dividerHorizontal;
+    field public static int dividerPadding;
+    field public static int dividerVertical;
+    field public static int drawableSize;
+    field public static int drawerArrowStyle;
+    field public static int dropDownListViewStyle;
+    field public static int dropdownListPreferredItemHeight;
+    field public static int editTextBackground;
+    field public static int editTextColor;
+    field public static int editTextStyle;
+    field public static int elevation;
+    field public static int expandActivityOverflowButtonDrawable;
+    field public static int gapBetweenBars;
+    field public static int goIcon;
+    field public static int height;
+    field public static int hideOnContentScroll;
+    field public static int homeAsUpIndicator;
+    field public static int homeLayout;
+    field public static int icon;
+    field public static int iconifiedByDefault;
+    field public static int imageButtonStyle;
+    field public static int indeterminateProgressStyle;
+    field public static int initialActivityCount;
+    field public static int isLightTheme;
+    field public static int itemPadding;
+    field public static int layout;
+    field public static int listChoiceBackgroundIndicator;
+    field public static int listDividerAlertDialog;
+    field public static int listItemLayout;
+    field public static int listLayout;
+    field public static int listPopupWindowStyle;
+    field public static int listPreferredItemHeight;
+    field public static int listPreferredItemHeightLarge;
+    field public static int listPreferredItemHeightSmall;
+    field public static int listPreferredItemPaddingLeft;
+    field public static int listPreferredItemPaddingRight;
+    field public static int logo;
+    field public static int logoDescription;
+    field public static int maxButtonHeight;
+    field public static int measureWithLargestChild;
+    field public static int multiChoiceItemLayout;
+    field public static int navigationContentDescription;
+    field public static int navigationIcon;
+    field public static int navigationMode;
+    field public static int overlapAnchor;
+    field public static int paddingEnd;
+    field public static int paddingStart;
+    field public static int panelBackground;
+    field public static int panelMenuListTheme;
+    field public static int panelMenuListWidth;
+    field public static int popupMenuStyle;
+    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 queryBackground;
+    field public static int queryHint;
+    field public static int radioButtonStyle;
+    field public static int ratingBarStyle;
+    field public static int searchHintIcon;
+    field public static int searchIcon;
+    field public static int searchViewStyle;
+    field public static int seekBarStyle;
+    field public static int selectableItemBackground;
+    field public static int selectableItemBackgroundBorderless;
+    field public static int showAsAction;
+    field public static int showDividers;
+    field public static int showText;
+    field public static int singleChoiceItemLayout;
+    field public static int spinBars;
+    field public static int spinnerDropDownItemStyle;
+    field public static int spinnerStyle;
+    field public static int splitTrack;
+    field public static int state_above_anchor;
+    field public static int submitBackground;
+    field public static int subtitle;
+    field public static int subtitleTextAppearance;
+    field public static int subtitleTextColor;
+    field public static int subtitleTextStyle;
+    field public static int suggestionRowLayout;
+    field public static int switchMinWidth;
+    field public static int switchPadding;
+    field public static int switchStyle;
+    field public static int switchTextAppearance;
+    field public static int textAllCaps;
+    field public static int textAppearanceLargePopupMenu;
+    field public static int textAppearanceListItem;
+    field public static int textAppearanceListItemSmall;
+    field public static int textAppearanceSearchResultSubtitle;
+    field public static int textAppearanceSearchResultTitle;
+    field public static int textAppearanceSmallPopupMenu;
+    field public static int textColorAlertDialogListItem;
+    field public static int textColorSearchUrl;
+    field public static int theme;
+    field public static int thickness;
+    field public static int thumbTextPadding;
+    field public static int title;
+    field public static int titleMarginBottom;
+    field public static int titleMarginEnd;
+    field public static int titleMarginStart;
+    field public static int titleMarginTop;
+    field public static int titleMargins;
+    field public static int titleTextAppearance;
+    field public static int titleTextColor;
+    field public static int titleTextStyle;
+    field public static int toolbarNavigationButtonStyle;
+    field public static int toolbarStyle;
+    field public static int track;
+    field public static int voiceIcon;
+    field public static int windowActionBar;
+    field public static int windowActionBarOverlay;
+    field public static int windowActionModeOverlay;
+    field public static int windowFixedHeightMajor;
+    field public static int windowFixedHeightMinor;
+    field public static int windowFixedWidthMajor;
+    field public static int windowFixedWidthMinor;
+    field public static int windowMinWidthMajor;
+    field public static int windowMinWidthMinor;
+    field public static int windowNoTitle;
+  }
+
+  public static final class R.bool {
+    ctor public R.bool();
+    field public static int abc_action_bar_embed_tabs;
+    field public static int abc_action_bar_embed_tabs_pre_jb;
+    field public static int abc_action_bar_expanded_action_views_exclusive;
+    field public static int abc_allow_stacked_button_bar;
+    field public static int abc_config_actionMenuItemAllCaps;
+    field public static int abc_config_allowActionMenuItemTextWithIcon;
+    field public static int abc_config_closeDialogWhenTouchOutside;
+    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
+  }
+
+  public static final class R.color {
+    ctor public R.color();
+    field public static int abc_background_cache_hint_selector_material_dark;
+    field public static int abc_background_cache_hint_selector_material_light;
+    field public static int abc_color_highlight_material;
+    field public static int abc_input_method_navigation_guard;
+    field public static int abc_primary_text_disable_only_material_dark;
+    field public static int abc_primary_text_disable_only_material_light;
+    field public static int abc_primary_text_material_dark;
+    field public static int abc_primary_text_material_light;
+    field public static int abc_search_url_text;
+    field public static int abc_search_url_text_normal;
+    field public static int abc_search_url_text_pressed;
+    field public static int abc_search_url_text_selected;
+    field public static int abc_secondary_text_material_dark;
+    field public static int abc_secondary_text_material_light;
+    field public static int accent_material_dark;
+    field public static int accent_material_light;
+    field public static int background_floating_material_dark;
+    field public static int background_floating_material_light;
+    field public static int background_material_dark;
+    field public static int background_material_light;
+    field public static int bright_foreground_disabled_material_dark;
+    field public static int bright_foreground_disabled_material_light;
+    field public static int bright_foreground_inverse_material_dark;
+    field public static int bright_foreground_inverse_material_light;
+    field public static int bright_foreground_material_dark;
+    field public static int bright_foreground_material_light;
+    field public static int button_material_dark;
+    field public static int button_material_light;
+    field public static int dim_foreground_disabled_material_dark;
+    field public static int dim_foreground_disabled_material_light;
+    field public static int dim_foreground_material_dark;
+    field public static int dim_foreground_material_light;
+    field public static int foreground_material_dark;
+    field public static int foreground_material_light;
+    field public static int highlighted_text_material_dark;
+    field public static int highlighted_text_material_light;
+    field public static int hint_foreground_material_dark;
+    field public static int hint_foreground_material_light;
+    field public static int material_blue_grey_800;
+    field public static int material_blue_grey_900;
+    field public static int material_blue_grey_950;
+    field public static int material_deep_teal_200;
+    field public static int material_deep_teal_500;
+    field public static int material_grey_100;
+    field public static int material_grey_300;
+    field public static int material_grey_50;
+    field public static int material_grey_600;
+    field public static int material_grey_800;
+    field public static int material_grey_850;
+    field public static int material_grey_900;
+    field public static int primary_dark_material_dark;
+    field public static int primary_dark_material_light;
+    field public static int primary_material_dark;
+    field public static int primary_material_light;
+    field public static int primary_text_default_material_dark;
+    field public static int primary_text_default_material_light;
+    field public static int primary_text_disabled_material_dark;
+    field public static int primary_text_disabled_material_light;
+    field public static int ripple_material_dark;
+    field public static int ripple_material_light;
+    field public static int secondary_text_default_material_dark;
+    field public static int secondary_text_default_material_light;
+    field public static int secondary_text_disabled_material_dark;
+    field public static int secondary_text_disabled_material_light;
+    field public static int switch_thumb_disabled_material_dark;
+    field public static int switch_thumb_disabled_material_light;
+    field public static int switch_thumb_material_dark;
+    field public static int switch_thumb_material_light;
+    field public static int switch_thumb_normal_material_dark;
+    field public static int switch_thumb_normal_material_light;
+  }
+
+  public static final class R.dimen {
+    ctor public R.dimen();
+    field public static int abc_action_bar_content_inset_material;
+    field public static int abc_action_bar_default_height_material;
+    field public static int abc_action_bar_default_padding_end_material;
+    field public static int abc_action_bar_default_padding_start_material;
+    field public static int abc_action_bar_icon_vertical_padding_material;
+    field public static int abc_action_bar_overflow_padding_end_material;
+    field public static int abc_action_bar_overflow_padding_start_material;
+    field public static int abc_action_bar_progress_bar_size;
+    field public static int abc_action_bar_stacked_max_height;
+    field public static int abc_action_bar_stacked_tab_max_width;
+    field public static int abc_action_bar_subtitle_bottom_margin_material;
+    field public static int abc_action_bar_subtitle_top_margin_material;
+    field public static int abc_action_button_min_height_material;
+    field public static int abc_action_button_min_width_material;
+    field public static int abc_action_button_min_width_overflow_material;
+    field public static int abc_alert_dialog_button_bar_height;
+    field public static int abc_button_inset_horizontal_material;
+    field public static int abc_button_inset_vertical_material;
+    field public static int abc_button_padding_horizontal_material;
+    field public static int abc_button_padding_vertical_material;
+    field public static int abc_config_prefDialogWidth;
+    field public static int abc_control_corner_material;
+    field public static int abc_control_inset_material;
+    field public static int abc_control_padding_material;
+    field public static int abc_dialog_fixed_height_major;
+    field public static int abc_dialog_fixed_height_minor;
+    field public static int abc_dialog_fixed_width_major;
+    field public static int abc_dialog_fixed_width_minor;
+    field public static int abc_dialog_list_padding_vertical_material;
+    field public static int abc_dialog_min_width_major;
+    field public static int abc_dialog_min_width_minor;
+    field public static int abc_dialog_padding_material;
+    field public static int abc_dialog_padding_top_material;
+    field public static int abc_disabled_alpha_material_dark;
+    field public static int abc_disabled_alpha_material_light;
+    field public static int abc_dropdownitem_icon_width;
+    field public static int abc_dropdownitem_text_padding_left;
+    field public static int abc_dropdownitem_text_padding_right;
+    field public static int abc_edit_text_inset_bottom_material;
+    field public static int abc_edit_text_inset_horizontal_material;
+    field public static int abc_edit_text_inset_top_material;
+    field public static int abc_floating_window_z;
+    field public static int abc_list_item_padding_horizontal_material;
+    field public static int abc_panel_menu_list_width;
+    field public static int abc_search_view_preferred_width;
+    field public static int abc_search_view_text_min_width;
+    field public static int abc_seekbar_track_background_height_material;
+    field public static int abc_seekbar_track_progress_height_material;
+    field public static int abc_select_dialog_padding_start_material;
+    field public static int abc_switch_padding;
+    field public static int abc_text_size_body_1_material;
+    field public static int abc_text_size_body_2_material;
+    field public static int abc_text_size_button_material;
+    field public static int abc_text_size_caption_material;
+    field public static int abc_text_size_display_1_material;
+    field public static int abc_text_size_display_2_material;
+    field public static int abc_text_size_display_3_material;
+    field public static int abc_text_size_display_4_material;
+    field public static int abc_text_size_headline_material;
+    field public static int abc_text_size_large_material;
+    field public static int abc_text_size_medium_material;
+    field public static int abc_text_size_menu_material;
+    field public static int abc_text_size_small_material;
+    field public static int abc_text_size_subhead_material;
+    field public static int abc_text_size_subtitle_material_toolbar;
+    field public static int abc_text_size_title_material;
+    field public static int abc_text_size_title_material_toolbar;
+    field public static int disabled_alpha_material_dark;
+    field public static int disabled_alpha_material_light;
+    field public static int highlight_alpha_material_colored;
+    field public static int highlight_alpha_material_dark;
+    field public static int highlight_alpha_material_light;
+    field public static int notification_large_icon_height;
+    field public static int notification_large_icon_width;
+    field public static int notification_subtext_size;
+  }
+
+  public static final class R.drawable {
+    ctor public R.drawable();
+    field public static int abc_ab_share_pack_mtrl_alpha;
+    field public static int abc_action_bar_item_background_material;
+    field public static int abc_btn_borderless_material;
+    field public static int abc_btn_check_material;
+    field public static int abc_btn_check_to_on_mtrl_000;
+    field public static int abc_btn_check_to_on_mtrl_015;
+    field public static int abc_btn_colored_material;
+    field public static int abc_btn_default_mtrl_shape;
+    field public static int abc_btn_radio_material;
+    field public static int abc_btn_radio_to_on_mtrl_000;
+    field public static int abc_btn_radio_to_on_mtrl_015;
+    field public static int abc_btn_rating_star_off_mtrl_alpha;
+    field public static int abc_btn_rating_star_on_mtrl_alpha;
+    field public static int abc_btn_switch_to_on_mtrl_00001;
+    field public static int abc_btn_switch_to_on_mtrl_00012;
+    field public static int abc_cab_background_internal_bg;
+    field public static int abc_cab_background_top_material;
+    field public static int abc_cab_background_top_mtrl_alpha;
+    field public static int abc_control_background_material;
+    field public static int abc_dialog_material_background_dark;
+    field public static int abc_dialog_material_background_light;
+    field public static int abc_edit_text_material;
+    field public static int abc_ic_ab_back_mtrl_am_alpha;
+    field public static int abc_ic_clear_mtrl_alpha;
+    field public static int abc_ic_commit_search_api_mtrl_alpha;
+    field public static int abc_ic_go_search_api_mtrl_alpha;
+    field public static int abc_ic_menu_copy_mtrl_am_alpha;
+    field public static int abc_ic_menu_cut_mtrl_alpha;
+    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
+    field public static int abc_ic_menu_paste_mtrl_am_alpha;
+    field public static int abc_ic_menu_selectall_mtrl_alpha;
+    field public static int abc_ic_menu_share_mtrl_alpha;
+    field public static int abc_ic_search_api_mtrl_alpha;
+    field public static int abc_ic_voice_search_api_mtrl_alpha;
+    field public static int abc_item_background_holo_dark;
+    field public static int abc_item_background_holo_light;
+    field public static int abc_list_divider_mtrl_alpha;
+    field public static int abc_list_focused_holo;
+    field public static int abc_list_longpressed_holo;
+    field public static int abc_list_pressed_holo_dark;
+    field public static int abc_list_pressed_holo_light;
+    field public static int abc_list_selector_background_transition_holo_dark;
+    field public static int abc_list_selector_background_transition_holo_light;
+    field public static int abc_list_selector_disabled_holo_dark;
+    field public static int abc_list_selector_disabled_holo_light;
+    field public static int abc_list_selector_holo_dark;
+    field public static int abc_list_selector_holo_light;
+    field public static int abc_menu_hardkey_panel_mtrl_mult;
+    field public static int abc_popup_background_mtrl_mult;
+    field public static int abc_ratingbar_full_material;
+    field public static int abc_scrubber_control_off_mtrl_alpha;
+    field public static int abc_scrubber_control_to_pressed_mtrl_000;
+    field public static int abc_scrubber_control_to_pressed_mtrl_005;
+    field public static int abc_scrubber_primary_mtrl_alpha;
+    field public static int abc_scrubber_track_mtrl_alpha;
+    field public static int abc_seekbar_thumb_material;
+    field public static int abc_seekbar_track_material;
+    field public static int abc_spinner_mtrl_am_alpha;
+    field public static int abc_spinner_textfield_background_material;
+    field public static int abc_switch_thumb_material;
+    field public static int abc_switch_track_mtrl_alpha;
+    field public static int abc_tab_indicator_material;
+    field public static int abc_tab_indicator_mtrl_alpha;
+    field public static int abc_text_cursor_material;
+    field public static int abc_textfield_activated_mtrl_alpha;
+    field public static int abc_textfield_default_mtrl_alpha;
+    field public static int abc_textfield_search_activated_mtrl_alpha;
+    field public static int abc_textfield_search_default_mtrl_alpha;
+    field public static int abc_textfield_search_material;
+    field public static int notification_template_icon_bg;
+  }
+
+  public static final class R.id {
+    ctor public R.id();
+    field public static int action0;
+    field public static int action_bar;
+    field public static int action_bar_activity_content;
+    field public static int action_bar_container;
+    field public static int action_bar_root;
+    field public static int action_bar_spinner;
+    field public static int action_bar_subtitle;
+    field public static int action_bar_title;
+    field public static int action_context_bar;
+    field public static int action_divider;
+    field public static int action_menu_divider;
+    field public static int action_menu_presenter;
+    field public static int action_mode_bar;
+    field public static int action_mode_bar_stub;
+    field public static int action_mode_close_button;
+    field public static int activity_chooser_view_content;
+    field public static int alertTitle;
+    field public static int always;
+    field public static int beginning;
+    field public static int buttonPanel;
+    field public static int cancel_action;
+    field public static int checkbox;
+    field public static int chronometer;
+    field public static int collapseActionView;
+    field public static int contentPanel;
+    field public static int custom;
+    field public static int customPanel;
+    field public static int decor_content_parent;
+    field public static int default_activity_button;
+    field public static int disableHome;
+    field public static int edit_query;
+    field public static int end;
+    field public static int end_padder;
+    field public static int expand_activities_button;
+    field public static int expanded_menu;
+    field public static int home;
+    field public static int homeAsUp;
+    field public static int icon;
+    field public static int ifRoom;
+    field public static int image;
+    field public static int info;
+    field public static int line1;
+    field public static int line3;
+    field public static int listMode;
+    field public static int list_item;
+    field public static int media_actions;
+    field public static int middle;
+    field public static int multiply;
+    field public static int never;
+    field public static int none;
+    field public static int normal;
+    field public static int parentPanel;
+    field public static int progress_circular;
+    field public static int progress_horizontal;
+    field public static int radio;
+    field public static int screen;
+    field public static int scrollIndicatorDown;
+    field public static int scrollIndicatorUp;
+    field public static int scrollView;
+    field public static int search_badge;
+    field public static int search_bar;
+    field public static int search_button;
+    field public static int search_close_btn;
+    field public static int search_edit_frame;
+    field public static int search_go_btn;
+    field public static int search_mag_icon;
+    field public static int search_plate;
+    field public static int search_src_text;
+    field public static int search_voice_btn;
+    field public static int select_dialog_listview;
+    field public static int shortcut;
+    field public static int showCustom;
+    field public static int showHome;
+    field public static int showTitle;
+    field public static int spacer;
+    field public static int split_action_bar;
+    field public static int src_atop;
+    field public static int src_in;
+    field public static int src_over;
+    field public static int status_bar_latest_event_content;
+    field public static int submit_area;
+    field public static int tabMode;
+    field public static int text;
+    field public static int text2;
+    field public static int textSpacerNoButtons;
+    field public static int time;
+    field public static int title;
+    field public static int title_template;
+    field public static int topPanel;
+    field public static int up;
+    field public static int useLogo;
+    field public static int withText;
+    field public static int wrap_content;
+  }
+
+  public static final class R.integer {
+    ctor public R.integer();
+    field public static int abc_config_activityDefaultDur;
+    field public static int abc_config_activityShortDur;
+    field public static int abc_max_action_buttons;
+    field public static int cancel_button_image_alpha;
+    field public static int status_bar_notification_info_maxnum;
+  }
+
+  public static final class R.layout {
+    ctor public R.layout();
+    field public static int abc_action_bar_title_item;
+    field public static int abc_action_bar_up_container;
+    field public static int abc_action_bar_view_list_nav_layout;
+    field public static int abc_action_menu_item_layout;
+    field public static int abc_action_menu_layout;
+    field public static int abc_action_mode_bar;
+    field public static int abc_action_mode_close_item_material;
+    field public static int abc_activity_chooser_view;
+    field public static int abc_activity_chooser_view_list_item;
+    field public static int abc_alert_dialog_button_bar_material;
+    field public static int abc_alert_dialog_material;
+    field public static int abc_dialog_title_material;
+    field public static int abc_expanded_menu_layout;
+    field public static int abc_list_menu_item_checkbox;
+    field public static int abc_list_menu_item_icon;
+    field public static int abc_list_menu_item_layout;
+    field public static int abc_list_menu_item_radio;
+    field public static int abc_popup_menu_item_layout;
+    field public static int abc_screen_content_include;
+    field public static int abc_screen_simple;
+    field public static int abc_screen_simple_overlay_action_mode;
+    field public static int abc_screen_toolbar;
+    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 notification_media_action;
+    field public static int notification_media_cancel_action;
+    field public static int notification_template_big_media;
+    field public static int notification_template_big_media_narrow;
+    field public static int notification_template_lines;
+    field public static int notification_template_media;
+    field public static int notification_template_part_chronometer;
+    field public static int notification_template_part_time;
+    field public static int select_dialog_item_material;
+    field public static int select_dialog_multichoice_material;
+    field public static int select_dialog_singlechoice_material;
+    field public static int support_simple_spinner_dropdown_item;
+  }
+
+  public static final class R.string {
+    ctor public R.string();
+    field public static int abc_action_bar_home_description;
+    field public static int abc_action_bar_home_description_format;
+    field public static int abc_action_bar_home_subtitle_description_format;
+    field public static int abc_action_bar_up_description;
+    field public static int abc_action_menu_overflow_description;
+    field public static int abc_action_mode_done;
+    field public static int abc_activity_chooser_view_see_all;
+    field public static int abc_activitychooserview_choose_application;
+    field public static int abc_capital_off;
+    field public static int abc_capital_on;
+    field public static int abc_search_hint;
+    field public static int abc_searchview_description_clear;
+    field public static int abc_searchview_description_query;
+    field public static int abc_searchview_description_search;
+    field public static int abc_searchview_description_submit;
+    field public static int abc_searchview_description_voice;
+    field public static int abc_shareactionprovider_share_with;
+    field public static int abc_shareactionprovider_share_with_application;
+    field public static int abc_toolbar_collapse_description;
+    field public static int status_bar_notification_info_overflow;
+  }
+
+  public static final class R.style {
+    ctor public R.style();
+    field public static int AlertDialog_AppCompat;
+    field public static int AlertDialog_AppCompat_Light;
+    field public static int Animation_AppCompat_Dialog;
+    field public static int Animation_AppCompat_DropDownUp;
+    field public static int Base_AlertDialog_AppCompat;
+    field public static int Base_AlertDialog_AppCompat_Light;
+    field public static int Base_Animation_AppCompat_Dialog;
+    field public static int Base_Animation_AppCompat_DropDownUp;
+    field public static int Base_DialogWindowTitleBackground_AppCompat;
+    field public static int Base_DialogWindowTitle_AppCompat;
+    field public static int Base_TextAppearance_AppCompat;
+    field public static int Base_TextAppearance_AppCompat_Body1;
+    field public static int Base_TextAppearance_AppCompat_Body2;
+    field public static int Base_TextAppearance_AppCompat_Button;
+    field public static int Base_TextAppearance_AppCompat_Caption;
+    field public static int Base_TextAppearance_AppCompat_Display1;
+    field public static int Base_TextAppearance_AppCompat_Display2;
+    field public static int Base_TextAppearance_AppCompat_Display3;
+    field public static int Base_TextAppearance_AppCompat_Display4;
+    field public static int Base_TextAppearance_AppCompat_Headline;
+    field public static int Base_TextAppearance_AppCompat_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Large;
+    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+    field public static int Base_TextAppearance_AppCompat_Medium;
+    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Menu;
+    field public static int Base_TextAppearance_AppCompat_SearchResult;
+    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
+    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
+    field public static int Base_TextAppearance_AppCompat_Small;
+    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Subhead;
+    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Title;
+    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
+    field public static int Base_TextAppearance_AppCompat_Widget_Button;
+    field public static int Base_TextAppearance_AppCompat_Widget_Button_Inverse;
+    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
+    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
+    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
+    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
+    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
+    field public static int Base_ThemeOverlay_AppCompat;
+    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
+    field public static int Base_ThemeOverlay_AppCompat_Dark;
+    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
+    field public static int Base_ThemeOverlay_AppCompat_Light;
+    field public static int Base_Theme_AppCompat;
+    field public static int Base_Theme_AppCompat_CompactMenu;
+    field public static int Base_Theme_AppCompat_Dialog;
+    field public static int Base_Theme_AppCompat_DialogWhenLarge;
+    field public static int Base_Theme_AppCompat_Dialog_Alert;
+    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
+    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
+    field public static int Base_Theme_AppCompat_Light;
+    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
+    field public static int Base_Theme_AppCompat_Light_Dialog;
+    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
+    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
+    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
+    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
+    field public static int Base_V11_Theme_AppCompat_Dialog;
+    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
+    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
+    field public static int Base_V12_Widget_AppCompat_EditText;
+    field public static int Base_V21_Theme_AppCompat;
+    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;
+    field public static int Base_V7_Theme_AppCompat_Dialog;
+    field public static int Base_V7_Theme_AppCompat_Light;
+    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
+    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
+    field public static int Base_V7_Widget_AppCompat_EditText;
+    field public static int Base_Widget_AppCompat_ActionBar;
+    field public static int Base_Widget_AppCompat_ActionBar_Solid;
+    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
+    field public static int Base_Widget_AppCompat_ActionBar_TabText;
+    field public static int Base_Widget_AppCompat_ActionBar_TabView;
+    field public static int Base_Widget_AppCompat_ActionButton;
+    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
+    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
+    field public static int Base_Widget_AppCompat_ActionMode;
+    field public static int Base_Widget_AppCompat_ActivityChooserView;
+    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
+    field public static int Base_Widget_AppCompat_Button;
+    field public static int Base_Widget_AppCompat_ButtonBar;
+    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
+    field public static int Base_Widget_AppCompat_Button_Borderless;
+    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
+    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
+    field public static int Base_Widget_AppCompat_Button_Colored;
+    field public static int Base_Widget_AppCompat_Button_Small;
+    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
+    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
+    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
+    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
+    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
+    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
+    field public static int Base_Widget_AppCompat_EditText;
+    field public static int Base_Widget_AppCompat_ImageButton;
+    field public static int Base_Widget_AppCompat_Light_ActionBar;
+    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
+    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
+    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
+    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
+    field public static int Base_Widget_AppCompat_Light_PopupMenu;
+    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
+    field public static int Base_Widget_AppCompat_ListPopupWindow;
+    field public static int Base_Widget_AppCompat_ListView;
+    field public static int Base_Widget_AppCompat_ListView_DropDown;
+    field public static int Base_Widget_AppCompat_ListView_Menu;
+    field public static int Base_Widget_AppCompat_PopupMenu;
+    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
+    field public static int Base_Widget_AppCompat_PopupWindow;
+    field public static int Base_Widget_AppCompat_ProgressBar;
+    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
+    field public static int Base_Widget_AppCompat_RatingBar;
+    field public static int Base_Widget_AppCompat_SearchView;
+    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
+    field public static int Base_Widget_AppCompat_SeekBar;
+    field public static int Base_Widget_AppCompat_Spinner;
+    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_DialogTitle_Icon;
+    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
+    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
+    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
+    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
+    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
+    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
+    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
+    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
+    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
+    field public static int RtlUnderlay_Widget_AppCompat_ActionButton;
+    field public static int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
+    field public static int TextAppearance_AppCompat;
+    field public static int TextAppearance_AppCompat_Body1;
+    field public static int TextAppearance_AppCompat_Body2;
+    field public static int TextAppearance_AppCompat_Button;
+    field public static int TextAppearance_AppCompat_Caption;
+    field public static int TextAppearance_AppCompat_Display1;
+    field public static int TextAppearance_AppCompat_Display2;
+    field public static int TextAppearance_AppCompat_Display3;
+    field public static int TextAppearance_AppCompat_Display4;
+    field public static int TextAppearance_AppCompat_Headline;
+    field public static int TextAppearance_AppCompat_Inverse;
+    field public static int TextAppearance_AppCompat_Large;
+    field public static int TextAppearance_AppCompat_Large_Inverse;
+    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
+    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
+    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
+    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
+    field public static int TextAppearance_AppCompat_Medium;
+    field public static int TextAppearance_AppCompat_Medium_Inverse;
+    field public static int TextAppearance_AppCompat_Menu;
+    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
+    field public static int TextAppearance_AppCompat_SearchResult_Title;
+    field public static int TextAppearance_AppCompat_Small;
+    field public static int TextAppearance_AppCompat_Small_Inverse;
+    field public static int TextAppearance_AppCompat_Subhead;
+    field public static int TextAppearance_AppCompat_Subhead_Inverse;
+    field public static int TextAppearance_AppCompat_Title;
+    field public static int TextAppearance_AppCompat_Title_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
+    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
+    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
+    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
+    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
+    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_Button;
+    field public static int TextAppearance_AppCompat_Widget_Button_Inverse;
+    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
+    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
+    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
+    field public static int TextAppearance_AppCompat_Widget_Switch;
+    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
+    field public static int TextAppearance_StatusBar_EventContent;
+    field public static int TextAppearance_StatusBar_EventContent_Info;
+    field public static int TextAppearance_StatusBar_EventContent_Line2;
+    field public static int TextAppearance_StatusBar_EventContent_Time;
+    field public static int TextAppearance_StatusBar_EventContent_Title;
+    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
+    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
+    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
+    field public static int ThemeOverlay_AppCompat;
+    field public static int ThemeOverlay_AppCompat_ActionBar;
+    field public static int ThemeOverlay_AppCompat_Dark;
+    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
+    field public static int ThemeOverlay_AppCompat_Light;
+    field public static int Theme_AppCompat;
+    field public static int Theme_AppCompat_CompactMenu;
+    field public static int Theme_AppCompat_Dialog;
+    field public static int Theme_AppCompat_DialogWhenLarge;
+    field public static int Theme_AppCompat_Dialog_Alert;
+    field public static int Theme_AppCompat_Dialog_MinWidth;
+    field public static int Theme_AppCompat_Light;
+    field public static int Theme_AppCompat_Light_DarkActionBar;
+    field public static int Theme_AppCompat_Light_Dialog;
+    field public static int Theme_AppCompat_Light_DialogWhenLarge;
+    field public static int Theme_AppCompat_Light_Dialog_Alert;
+    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
+    field public static int Theme_AppCompat_Light_NoActionBar;
+    field public static int Theme_AppCompat_NoActionBar;
+    field public static int Widget_AppCompat_ActionBar;
+    field public static int Widget_AppCompat_ActionBar_Solid;
+    field public static int Widget_AppCompat_ActionBar_TabBar;
+    field public static int Widget_AppCompat_ActionBar_TabText;
+    field public static int Widget_AppCompat_ActionBar_TabView;
+    field public static int Widget_AppCompat_ActionButton;
+    field public static int Widget_AppCompat_ActionButton_CloseMode;
+    field public static int Widget_AppCompat_ActionButton_Overflow;
+    field public static int Widget_AppCompat_ActionMode;
+    field public static int Widget_AppCompat_ActivityChooserView;
+    field public static int Widget_AppCompat_AutoCompleteTextView;
+    field public static int Widget_AppCompat_Button;
+    field public static int Widget_AppCompat_ButtonBar;
+    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
+    field public static int Widget_AppCompat_Button_Borderless;
+    field public static int Widget_AppCompat_Button_Borderless_Colored;
+    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
+    field public static int Widget_AppCompat_Button_Colored;
+    field public static int Widget_AppCompat_Button_Small;
+    field public static int Widget_AppCompat_CompoundButton_CheckBox;
+    field public static int Widget_AppCompat_CompoundButton_RadioButton;
+    field public static int Widget_AppCompat_CompoundButton_Switch;
+    field public static int Widget_AppCompat_DrawerArrowToggle;
+    field public static int Widget_AppCompat_DropDownItem_Spinner;
+    field public static int Widget_AppCompat_EditText;
+    field public static int Widget_AppCompat_ImageButton;
+    field public static int Widget_AppCompat_Light_ActionBar;
+    field public static int Widget_AppCompat_Light_ActionBar_Solid;
+    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
+    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
+    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
+    field public static int Widget_AppCompat_Light_ActionBar_TabText;
+    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
+    field public static int Widget_AppCompat_Light_ActionBar_TabView;
+    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
+    field public static int Widget_AppCompat_Light_ActionButton;
+    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
+    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
+    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
+    field public static int Widget_AppCompat_Light_ActivityChooserView;
+    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
+    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
+    field public static int Widget_AppCompat_Light_ListPopupWindow;
+    field public static int Widget_AppCompat_Light_ListView_DropDown;
+    field public static int Widget_AppCompat_Light_PopupMenu;
+    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
+    field public static int Widget_AppCompat_Light_SearchView;
+    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
+    field public static int Widget_AppCompat_ListPopupWindow;
+    field public static int Widget_AppCompat_ListView;
+    field public static int Widget_AppCompat_ListView_DropDown;
+    field public static int Widget_AppCompat_ListView_Menu;
+    field public static int Widget_AppCompat_PopupMenu;
+    field public static int Widget_AppCompat_PopupMenu_Overflow;
+    field public static int Widget_AppCompat_PopupWindow;
+    field public static int Widget_AppCompat_ProgressBar;
+    field public static int Widget_AppCompat_ProgressBar_Horizontal;
+    field public static int Widget_AppCompat_RatingBar;
+    field public static int Widget_AppCompat_SearchView;
+    field public static int Widget_AppCompat_SearchView_ActionBar;
+    field public static int Widget_AppCompat_SeekBar;
+    field public static int Widget_AppCompat_Spinner;
+    field public static int Widget_AppCompat_Spinner_DropDown;
+    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
+    field public static int Widget_AppCompat_Spinner_Underlined;
+    field public static int Widget_AppCompat_TextView_SpinnerItem;
+    field public static int Widget_AppCompat_Toolbar;
+    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
+  }
+
+  public static final class R.styleable {
+    ctor public R.styleable();
+    field public static final int[] ActionBar;
+    field public static final int[] ActionBarLayout;
+    field public static int ActionBarLayout_android_layout_gravity;
+    field public static int ActionBar_background;
+    field public static int ActionBar_backgroundSplit;
+    field public static int ActionBar_backgroundStacked;
+    field public static int ActionBar_contentInsetEnd;
+    field public static int ActionBar_contentInsetLeft;
+    field public static int ActionBar_contentInsetRight;
+    field public static int ActionBar_contentInsetStart;
+    field public static int ActionBar_customNavigationLayout;
+    field public static int ActionBar_displayOptions;
+    field public static int ActionBar_divider;
+    field public static int ActionBar_elevation;
+    field public static int ActionBar_height;
+    field public static int ActionBar_hideOnContentScroll;
+    field public static int ActionBar_homeAsUpIndicator;
+    field public static int ActionBar_homeLayout;
+    field public static int ActionBar_icon;
+    field public static int ActionBar_indeterminateProgressStyle;
+    field public static int ActionBar_itemPadding;
+    field public static int ActionBar_logo;
+    field public static int ActionBar_navigationMode;
+    field public static int ActionBar_popupTheme;
+    field public static int ActionBar_progressBarPadding;
+    field public static int ActionBar_progressBarStyle;
+    field public static int ActionBar_subtitle;
+    field public static int ActionBar_subtitleTextStyle;
+    field public static int ActionBar_title;
+    field public static int ActionBar_titleTextStyle;
+    field public static final int[] ActionMenuItemView;
+    field public static int ActionMenuItemView_android_minWidth;
+    field public static final int[] ActionMenuView;
+    field public static final int[] ActionMode;
+    field public static int ActionMode_background;
+    field public static int ActionMode_backgroundSplit;
+    field public static int ActionMode_closeItemLayout;
+    field public static int ActionMode_height;
+    field public static int ActionMode_subtitleTextStyle;
+    field public static int ActionMode_titleTextStyle;
+    field public static final int[] ActivityChooserView;
+    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
+    field public static int ActivityChooserView_initialActivityCount;
+    field public static final int[] AlertDialog;
+    field public static int AlertDialog_android_layout;
+    field public static int AlertDialog_buttonPanelSideLayout;
+    field public static int AlertDialog_listItemLayout;
+    field public static int AlertDialog_listLayout;
+    field public static int AlertDialog_multiChoiceItemLayout;
+    field public static int AlertDialog_singleChoiceItemLayout;
+    field public static final int[] AppCompatTextView;
+    field public static int AppCompatTextView_android_textAppearance;
+    field public static int AppCompatTextView_textAllCaps;
+    field public static int ButtonBarLayout_allowStacking;
+    field public static final int[] CompoundButton;
+    field public static int CompoundButton_android_button;
+    field public static int CompoundButton_buttonTint;
+    field public static int CompoundButton_buttonTintMode;
+    field public static final int[] DrawerArrowToggle;
+    field public static int DrawerArrowToggle_arrowHeadLength;
+    field public static int DrawerArrowToggle_arrowShaftLength;
+    field public static int DrawerArrowToggle_barLength;
+    field public static int DrawerArrowToggle_color;
+    field public static int DrawerArrowToggle_drawableSize;
+    field public static int DrawerArrowToggle_gapBetweenBars;
+    field public static int DrawerArrowToggle_spinBars;
+    field public static int DrawerArrowToggle_thickness;
+    field public static final int[] LinearLayoutCompat;
+    field public static final int[] LinearLayoutCompat_Layout;
+    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
+    field public static int LinearLayoutCompat_Layout_android_layout_height;
+    field public static int LinearLayoutCompat_Layout_android_layout_weight;
+    field public static int LinearLayoutCompat_Layout_android_layout_width;
+    field public static int LinearLayoutCompat_android_baselineAligned;
+    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
+    field public static int LinearLayoutCompat_android_gravity;
+    field public static int LinearLayoutCompat_android_orientation;
+    field public static int LinearLayoutCompat_android_weightSum;
+    field public static int LinearLayoutCompat_divider;
+    field public static int LinearLayoutCompat_dividerPadding;
+    field public static int LinearLayoutCompat_measureWithLargestChild;
+    field public static int LinearLayoutCompat_showDividers;
+    field public static final int[] ListPopupWindow;
+    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
+    field public static int ListPopupWindow_android_dropDownVerticalOffset;
+    field public static final int[] MenuGroup;
+    field public static int MenuGroup_android_checkableBehavior;
+    field public static int MenuGroup_android_enabled;
+    field public static int MenuGroup_android_id;
+    field public static int MenuGroup_android_menuCategory;
+    field public static int MenuGroup_android_orderInCategory;
+    field public static int MenuGroup_android_visible;
+    field public static final int[] MenuItem;
+    field public static int MenuItem_actionLayout;
+    field public static int MenuItem_actionProviderClass;
+    field public static int MenuItem_actionViewClass;
+    field public static int MenuItem_android_alphabeticShortcut;
+    field public static int MenuItem_android_checkable;
+    field public static int MenuItem_android_checked;
+    field public static int MenuItem_android_enabled;
+    field public static int MenuItem_android_icon;
+    field public static int MenuItem_android_id;
+    field public static int MenuItem_android_menuCategory;
+    field public static int MenuItem_android_numericShortcut;
+    field public static int MenuItem_android_onClick;
+    field public static int MenuItem_android_orderInCategory;
+    field public static int MenuItem_android_title;
+    field public static int MenuItem_android_titleCondensed;
+    field public static int MenuItem_android_visible;
+    field public static int MenuItem_showAsAction;
+    field public static final int[] MenuView;
+    field public static int MenuView_android_headerBackground;
+    field public static int MenuView_android_horizontalDivider;
+    field public static int MenuView_android_itemBackground;
+    field public static int MenuView_android_itemIconDisabledAlpha;
+    field public static int MenuView_android_itemTextAppearance;
+    field public static int MenuView_android_verticalDivider;
+    field public static int MenuView_android_windowAnimationStyle;
+    field public static int MenuView_preserveIconSpacing;
+    field public static final int[] PopupWindow;
+    field public static final int[] PopupWindowBackgroundState;
+    field public static int PopupWindowBackgroundState_state_above_anchor;
+    field public static int PopupWindow_android_popupBackground;
+    field public static int PopupWindow_overlapAnchor;
+    field public static final int[] SearchView;
+    field public static int SearchView_android_focusable;
+    field public static int SearchView_android_imeOptions;
+    field public static int SearchView_android_inputType;
+    field public static int SearchView_android_maxWidth;
+    field public static int SearchView_closeIcon;
+    field public static int SearchView_commitIcon;
+    field public static int SearchView_defaultQueryHint;
+    field public static int SearchView_goIcon;
+    field public static int SearchView_iconifiedByDefault;
+    field public static int SearchView_layout;
+    field public static int SearchView_queryBackground;
+    field public static int SearchView_queryHint;
+    field public static int SearchView_searchHintIcon;
+    field public static int SearchView_searchIcon;
+    field public static int SearchView_submitBackground;
+    field public static int SearchView_suggestionRowLayout;
+    field public static int SearchView_voiceIcon;
+    field public static final int[] Spinner;
+    field public static int Spinner_android_dropDownWidth;
+    field public static int Spinner_android_popupBackground;
+    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;
+    field public static int SwitchCompat_android_thumb;
+    field public static int SwitchCompat_showText;
+    field public static int SwitchCompat_splitTrack;
+    field public static int SwitchCompat_switchMinWidth;
+    field public static int SwitchCompat_switchPadding;
+    field public static int SwitchCompat_switchTextAppearance;
+    field public static int SwitchCompat_thumbTextPadding;
+    field public static int SwitchCompat_track;
+    field public static final int[] TextAppearance;
+    field public static int TextAppearance_android_shadowColor;
+    field public static int TextAppearance_android_shadowDx;
+    field public static int TextAppearance_android_shadowDy;
+    field public static int TextAppearance_android_shadowRadius;
+    field public static int TextAppearance_android_textColor;
+    field public static int TextAppearance_android_textSize;
+    field public static int TextAppearance_android_textStyle;
+    field public static int TextAppearance_android_typeface;
+    field public static int TextAppearance_textAllCaps;
+    field public static final int[] Theme;
+    field public static int Theme_actionBarDivider;
+    field public static int Theme_actionBarItemBackground;
+    field public static int Theme_actionBarPopupTheme;
+    field public static int Theme_actionBarSize;
+    field public static int Theme_actionBarSplitStyle;
+    field public static int Theme_actionBarStyle;
+    field public static int Theme_actionBarTabBarStyle;
+    field public static int Theme_actionBarTabStyle;
+    field public static int Theme_actionBarTabTextStyle;
+    field public static int Theme_actionBarTheme;
+    field public static int Theme_actionBarWidgetTheme;
+    field public static int Theme_actionButtonStyle;
+    field public static int Theme_actionDropDownStyle;
+    field public static int Theme_actionMenuTextAppearance;
+    field public static int Theme_actionMenuTextColor;
+    field public static int Theme_actionModeBackground;
+    field public static int Theme_actionModeCloseButtonStyle;
+    field public static int Theme_actionModeCloseDrawable;
+    field public static int Theme_actionModeCopyDrawable;
+    field public static int Theme_actionModeCutDrawable;
+    field public static int Theme_actionModeFindDrawable;
+    field public static int Theme_actionModePasteDrawable;
+    field public static int Theme_actionModePopupWindowStyle;
+    field public static int Theme_actionModeSelectAllDrawable;
+    field public static int Theme_actionModeShareDrawable;
+    field public static int Theme_actionModeSplitBackground;
+    field public static int Theme_actionModeStyle;
+    field public static int Theme_actionModeWebSearchDrawable;
+    field public static int Theme_actionOverflowButtonStyle;
+    field public static int Theme_actionOverflowMenuStyle;
+    field public static int Theme_activityChooserViewStyle;
+    field public static int Theme_alertDialogButtonGroupStyle;
+    field public static int Theme_alertDialogCenterButtons;
+    field public static int Theme_alertDialogStyle;
+    field public static int Theme_alertDialogTheme;
+    field public static int Theme_android_windowAnimationStyle;
+    field public static int Theme_android_windowIsFloating;
+    field public static int Theme_autoCompleteTextViewStyle;
+    field public static int Theme_borderlessButtonStyle;
+    field public static int Theme_buttonBarButtonStyle;
+    field public static int Theme_buttonBarNegativeButtonStyle;
+    field public static int Theme_buttonBarNeutralButtonStyle;
+    field public static int Theme_buttonBarPositiveButtonStyle;
+    field public static int Theme_buttonBarStyle;
+    field public static int Theme_buttonStyle;
+    field public static int Theme_buttonStyleSmall;
+    field public static int Theme_checkboxStyle;
+    field public static int Theme_checkedTextViewStyle;
+    field public static int Theme_colorAccent;
+    field public static int Theme_colorButtonNormal;
+    field public static int Theme_colorControlActivated;
+    field public static int Theme_colorControlHighlight;
+    field public static int Theme_colorControlNormal;
+    field public static int Theme_colorPrimary;
+    field public static int Theme_colorPrimaryDark;
+    field public static int Theme_colorSwitchThumbNormal;
+    field public static int Theme_controlBackground;
+    field public static int Theme_dialogPreferredPadding;
+    field public static int Theme_dialogTheme;
+    field public static int Theme_dividerHorizontal;
+    field public static int Theme_dividerVertical;
+    field public static int Theme_dropDownListViewStyle;
+    field public static int Theme_dropdownListPreferredItemHeight;
+    field public static int Theme_editTextBackground;
+    field public static int Theme_editTextColor;
+    field public static int Theme_editTextStyle;
+    field public static int Theme_homeAsUpIndicator;
+    field public static int Theme_imageButtonStyle;
+    field public static int Theme_listChoiceBackgroundIndicator;
+    field public static int Theme_listDividerAlertDialog;
+    field public static int Theme_listPopupWindowStyle;
+    field public static int Theme_listPreferredItemHeight;
+    field public static int Theme_listPreferredItemHeightLarge;
+    field public static int Theme_listPreferredItemHeightSmall;
+    field public static int Theme_listPreferredItemPaddingLeft;
+    field public static int Theme_listPreferredItemPaddingRight;
+    field public static int Theme_panelBackground;
+    field public static int Theme_panelMenuListTheme;
+    field public static int Theme_panelMenuListWidth;
+    field public static int Theme_popupMenuStyle;
+    field public static int Theme_popupWindowStyle;
+    field public static int Theme_radioButtonStyle;
+    field public static int Theme_ratingBarStyle;
+    field public static int Theme_searchViewStyle;
+    field public static int Theme_seekBarStyle;
+    field public static int Theme_selectableItemBackground;
+    field public static int Theme_selectableItemBackgroundBorderless;
+    field public static int Theme_spinnerDropDownItemStyle;
+    field public static int Theme_spinnerStyle;
+    field public static int Theme_switchStyle;
+    field public static int Theme_textAppearanceLargePopupMenu;
+    field public static int Theme_textAppearanceListItem;
+    field public static int Theme_textAppearanceListItemSmall;
+    field public static int Theme_textAppearanceSearchResultSubtitle;
+    field public static int Theme_textAppearanceSearchResultTitle;
+    field public static int Theme_textAppearanceSmallPopupMenu;
+    field public static int Theme_textColorAlertDialogListItem;
+    field public static int Theme_textColorSearchUrl;
+    field public static int Theme_toolbarNavigationButtonStyle;
+    field public static int Theme_toolbarStyle;
+    field public static int Theme_windowActionBar;
+    field public static int Theme_windowActionBarOverlay;
+    field public static int Theme_windowActionModeOverlay;
+    field public static int Theme_windowFixedHeightMajor;
+    field public static int Theme_windowFixedHeightMinor;
+    field public static int Theme_windowFixedWidthMajor;
+    field public static int Theme_windowFixedWidthMinor;
+    field public static int Theme_windowMinWidthMajor;
+    field public static int Theme_windowMinWidthMinor;
+    field public static int Theme_windowNoTitle;
+    field public static final int[] Toolbar;
+    field public static int Toolbar_android_gravity;
+    field public static int Toolbar_android_minHeight;
+    field public static int Toolbar_collapseContentDescription;
+    field public static int Toolbar_collapseIcon;
+    field public static int Toolbar_contentInsetEnd;
+    field public static int Toolbar_contentInsetLeft;
+    field public static int Toolbar_contentInsetRight;
+    field public static int Toolbar_contentInsetStart;
+    field public static int Toolbar_logo;
+    field public static int Toolbar_logoDescription;
+    field public static int Toolbar_maxButtonHeight;
+    field public static int Toolbar_navigationContentDescription;
+    field public static int Toolbar_navigationIcon;
+    field public static int Toolbar_popupTheme;
+    field public static int Toolbar_subtitle;
+    field public static int Toolbar_subtitleTextAppearance;
+    field public static int Toolbar_subtitleTextColor;
+    field public static int Toolbar_title;
+    field public static int Toolbar_titleMarginBottom;
+    field public static int Toolbar_titleMarginEnd;
+    field public static int Toolbar_titleMarginStart;
+    field public static int Toolbar_titleMarginTop;
+    field public static int Toolbar_titleMargins;
+    field public static int Toolbar_titleTextAppearance;
+    field public static int Toolbar_titleTextColor;
+    field public static final int[] View;
+    field public static final int[] ViewBackgroundHelper;
+    field public static int ViewBackgroundHelper_android_background;
+    field public static int ViewBackgroundHelper_backgroundTint;
+    field public static int ViewBackgroundHelper_backgroundTintMode;
+    field public static final int[] ViewStubCompat;
+    field public static int ViewStubCompat_android_id;
+    field public static int ViewStubCompat_android_inflatedId;
+    field public static int ViewStubCompat_android_layout;
+    field public static int View_android_focusable;
+    field public static int View_android_theme;
+    field public static int View_paddingEnd;
+    field public static int View_paddingStart;
+    field public static int View_theme;
+  }
+
+}
+
+package android.support.v7.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context);
+    method public void draw(android.graphics.Canvas);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package android.support.v7.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.view.Menu getMenu();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public void setTag(java.lang.Object);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static abstract interface ActionMode.Callback {
+    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
+    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
+    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+  }
+
+  public abstract interface CollapsibleActionView {
+    method public abstract void onActionViewCollapsed();
+    method public abstract void onActionViewExpanded();
+  }
+
+}
+
+package android.support.v7.widget {
+
+  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
+    method public void dismissPopupMenus();
+    method public android.view.Menu getMenu();
+    method public android.graphics.drawable.Drawable getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static abstract interface ActionMenuView.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
+    method public void setSupportAllCaps(boolean);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton {
+    ctor public AppCompatRadioButton(android.content.Context);
+    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  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 {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
+    method public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getOrientation();
+    method public int getShowDividers();
+    method public float getWeightSum();
+    method public boolean isBaselineAligned();
+    method public boolean isMeasureWithLargestChildEnabled();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable);
+    method public void setDividerPadding(int);
+    method public void setGravity(int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
+    field public int gravity;
+    field public float weight;
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
+    method public void dismiss();
+    method public android.view.View getAnchorView();
+    method public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable getBackground();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView getListView();
+    method public int getPromptPosition();
+    method public java.lang.Object getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter);
+    method public void setAnchorView(android.view.View);
+    method public void setAnimationStyle(int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(int);
+    method public void setGravity(int);
+    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
+    method public void show();
+  }
+
+  public static abstract interface PopupMenu.OnDismissListener {
+    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
+  }
+
+  public static abstract interface PopupMenu.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
+    method public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
+    method public java.lang.CharSequence getQuery();
+    method public java.lang.CharSequence getQueryHint();
+    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
+    method public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
+    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener);
+    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
+    method public void setQuery(java.lang.CharSequence, boolean);
+    method public void setQueryHint(java.lang.CharSequence);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
+  }
+
+  public static abstract interface SearchView.OnCloseListener {
+    method public abstract boolean onClose();
+  }
+
+  public static abstract interface SearchView.OnQueryTextListener {
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public static abstract interface SearchView.OnSuggestionListener {
+    method public abstract boolean onSuggestionClick(int);
+    method public abstract boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context);
+    method public android.view.View onCreateActionView();
+    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
+    method public void setShareHistoryFileName(java.lang.String);
+    method public void setShareIntent(android.content.Intent);
+    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
+    method public boolean getShowText();
+    method public boolean getSplitTrack();
+    method public int getSwitchMinWidth();
+    method public int getSwitchPadding();
+    method public java.lang.CharSequence getTextOff();
+    method public java.lang.CharSequence getTextOn();
+    method public android.graphics.drawable.Drawable getThumbDrawable();
+    method public int getThumbTextPadding();
+    method public android.graphics.drawable.Drawable getTrackDrawable();
+    method public void onMeasure(int, int);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context, int);
+    method public void setSwitchTypeface(android.graphics.Typeface, int);
+    method public void setSwitchTypeface(android.graphics.Typeface);
+    method public void setTextOff(java.lang.CharSequence);
+    method public void setTextOn(java.lang.CharSequence);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable);
+    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 static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme getDropDownViewTheme();
+    method public 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);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public int getContentInsetEnd();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public android.graphics.drawable.Drawable getLogo();
+    method public java.lang.CharSequence getLogoDescription();
+    method public android.view.Menu getMenu();
+    method public java.lang.CharSequence getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable getNavigationIcon();
+    method public android.graphics.drawable.Drawable getOverflowIcon();
+    method public int getPopupTheme();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(int);
+    method public boolean isOverflowMenuShowing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable);
+    method public void setLogoDescription(int);
+    method public void setLogoDescription(java.lang.CharSequence);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationContentDescription(java.lang.CharSequence);
+    method public void setNavigationIcon(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public void setSubtitle(int);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setSubtitleTextAppearance(android.content.Context, int);
+    method public void setSubtitleTextColor(int);
+    method public void setTitle(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleTextAppearance(android.content.Context, int);
+    method public void setTitleTextColor(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
+  }
+
+  public static abstract interface Toolbar.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public static class Toolbar.SavedState extends android.view.View.BaseSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel);
+    ctor public Toolbar.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
+  }
+
+}
+
diff --git a/v7/appcompat/api/current.txt b/v7/appcompat/api/current.txt
index 8f35544..b3d9d97 100644
--- a/v7/appcompat/api/current.txt
+++ b/v7/appcompat/api/current.txt
@@ -244,6 +244,7 @@
 
   public abstract class AppCompatDelegate {
     method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public abstract void applyDayNight();
     method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
     method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
     method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
@@ -265,12 +266,16 @@
     method public abstract void setContentView(int);
     method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
     method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setNightMode(int);
     method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
     method public abstract void setTitle(java.lang.CharSequence);
     method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
     field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
     field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
     field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field public static final int MODE_NIGHT_AUTO = 2; // 0x2
+    field public static final int MODE_NIGHT_NO = 0; // 0x0
+    field public static final int MODE_NIGHT_YES = 1; // 0x1
   }
 
   public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
@@ -369,6 +374,7 @@
     field public static int alertDialogStyle;
     field public static int alertDialogTheme;
     field public static int allowStacking;
+    field public static int alpha;
     field public static int arrowHeadLength;
     field public static int arrowShaftLength;
     field public static int autoCompleteTextViewStyle;
@@ -384,6 +390,7 @@
     field public static int buttonBarNeutralButtonStyle;
     field public static int buttonBarPositiveButtonStyle;
     field public static int buttonBarStyle;
+    field public static int buttonGravity;
     field public static int buttonPanelSideLayout;
     field public static int buttonStyle;
     field public static int buttonStyleSmall;
@@ -476,6 +483,8 @@
     field public static int queryHint;
     field public static int radioButtonStyle;
     field public static int ratingBarStyle;
+    field public static int ratingBarStyleIndicator;
+    field public static int ratingBarStyleSmall;
     field public static int searchHintIcon;
     field public static int searchIcon;
     field public static int searchViewStyle;
@@ -514,11 +523,12 @@
     field public static int thickness;
     field public static int thumbTextPadding;
     field public static int title;
+    field public static int titleMargin;
     field public static int titleMarginBottom;
     field public static int titleMarginEnd;
     field public static int titleMarginStart;
     field public static int titleMarginTop;
-    field public static int titleMargins;
+    field public static deprecated int titleMargins;
     field public static int titleTextAppearance;
     field public static int titleTextColor;
     field public static int titleTextStyle;
@@ -541,11 +551,7 @@
   public static final class R.bool {
     ctor public R.bool();
     field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_allow_stacked_button_bar;
     field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
     field public static int abc_config_closeDialogWhenTouchOutside;
     field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
   }
@@ -566,6 +572,13 @@
     field public static int abc_search_url_text_selected;
     field public static int abc_secondary_text_material_dark;
     field public static int abc_secondary_text_material_light;
+    field public static int abc_tint_btn_checkable;
+    field public static int abc_tint_default;
+    field public static int abc_tint_edittext;
+    field public static int abc_tint_seek_thumb;
+    field public static int abc_tint_spinner;
+    field public static int abc_tint_switch_thumb;
+    field public static int abc_tint_switch_track;
     field public static int accent_material_dark;
     field public static int accent_material_light;
     field public static int background_floating_material_dark;
@@ -671,7 +684,6 @@
     field public static int abc_list_item_padding_horizontal_material;
     field public static int abc_panel_menu_list_width;
     field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
     field public static int abc_seekbar_track_background_height_material;
     field public static int abc_seekbar_track_progress_height_material;
     field public static int abc_select_dialog_padding_start_material;
@@ -738,6 +750,10 @@
     field public static int abc_ic_menu_selectall_mtrl_alpha;
     field public static int abc_ic_menu_share_mtrl_alpha;
     field public static int abc_ic_search_api_mtrl_alpha;
+    field public static int abc_ic_star_black_16dp;
+    field public static int abc_ic_star_black_36dp;
+    field public static int abc_ic_star_half_black_16dp;
+    field public static int abc_ic_star_half_black_36dp;
     field public static int abc_ic_voice_search_api_mtrl_alpha;
     field public static int abc_item_background_holo_dark;
     field public static int abc_item_background_holo_light;
@@ -755,6 +771,8 @@
     field public static int abc_menu_hardkey_panel_mtrl_mult;
     field public static int abc_popup_background_mtrl_mult;
     field public static int abc_ratingbar_full_material;
+    field public static int abc_ratingbar_indicator_material;
+    field public static int abc_ratingbar_small_material;
     field public static int abc_scrubber_control_off_mtrl_alpha;
     field public static int abc_scrubber_control_to_pressed_mtrl_000;
     field public static int abc_scrubber_control_to_pressed_mtrl_005;
@@ -798,6 +816,7 @@
     field public static int alertTitle;
     field public static int always;
     field public static int beginning;
+    field public static int bottom;
     field public static int buttonPanel;
     field public static int cancel_action;
     field public static int checkbox;
@@ -867,6 +886,7 @@
     field public static int time;
     field public static int title;
     field public static int title_template;
+    field public static int top;
     field public static int topPanel;
     field public static int up;
     field public static int useLogo;
@@ -878,7 +898,6 @@
     ctor public R.integer();
     field public static int abc_config_activityDefaultDur;
     field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
     field public static int cancel_button_image_alpha;
     field public static int status_bar_notification_info_maxnum;
   }
@@ -1086,6 +1105,8 @@
     field public static int Base_Widget_AppCompat_ProgressBar;
     field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
     field public static int Base_Widget_AppCompat_RatingBar;
+    field public static int Base_Widget_AppCompat_RatingBar_Indicator;
+    field public static int Base_Widget_AppCompat_RatingBar_Small;
     field public static int Base_Widget_AppCompat_SearchView;
     field public static int Base_Widget_AppCompat_SearchView_ActionBar;
     field public static int Base_Widget_AppCompat_SeekBar;
@@ -1177,6 +1198,13 @@
     field public static int ThemeOverlay_AppCompat_Light;
     field public static int Theme_AppCompat;
     field public static int Theme_AppCompat_CompactMenu;
+    field public static int Theme_AppCompat_DayNight;
+    field public static int Theme_AppCompat_DayNight_DarkActionBar;
+    field public static int Theme_AppCompat_DayNight_Dialog;
+    field public static int Theme_AppCompat_DayNight_DialogWhenLarge;
+    field public static int Theme_AppCompat_DayNight_Dialog_Alert;
+    field public static int Theme_AppCompat_DayNight_Dialog_MinWidth;
+    field public static int Theme_AppCompat_DayNight_NoActionBar;
     field public static int Theme_AppCompat_Dialog;
     field public static int Theme_AppCompat_DialogWhenLarge;
     field public static int Theme_AppCompat_Dialog_Alert;
@@ -1247,6 +1275,8 @@
     field public static int Widget_AppCompat_ProgressBar;
     field public static int Widget_AppCompat_ProgressBar_Horizontal;
     field public static int Widget_AppCompat_RatingBar;
+    field public static int Widget_AppCompat_RatingBar_Indicator;
+    field public static int Widget_AppCompat_RatingBar_Small;
     field public static int Widget_AppCompat_SearchView;
     field public static int Widget_AppCompat_SearchView_ActionBar;
     field public static int Widget_AppCompat_SeekBar;
@@ -1315,6 +1345,10 @@
     field public static int AppCompatTextView_android_textAppearance;
     field public static int AppCompatTextView_textAllCaps;
     field public static int ButtonBarLayout_allowStacking;
+    field public static final int[] ColorStateListItem;
+    field public static int ColorStateListItem_alpha;
+    field public static int ColorStateListItem_android_alpha;
+    field public static int ColorStateListItem_android_color;
     field public static final int[] CompoundButton;
     field public static int CompoundButton_android_button;
     field public static int CompoundButton_buttonTint;
@@ -1514,6 +1548,8 @@
     field public static int Theme_popupWindowStyle;
     field public static int Theme_radioButtonStyle;
     field public static int Theme_ratingBarStyle;
+    field public static int Theme_ratingBarStyleIndicator;
+    field public static int Theme_ratingBarStyleSmall;
     field public static int Theme_searchViewStyle;
     field public static int Theme_seekBarStyle;
     field public static int Theme_selectableItemBackground;
@@ -1541,9 +1577,10 @@
     field public static int Theme_windowMinWidthMajor;
     field public static int Theme_windowMinWidthMinor;
     field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
+    field public static final deprecated int[] Toolbar;
     field public static int Toolbar_android_gravity;
     field public static int Toolbar_android_minHeight;
+    field public static int Toolbar_buttonGravity;
     field public static int Toolbar_collapseContentDescription;
     field public static int Toolbar_collapseIcon;
     field public static int Toolbar_contentInsetEnd;
@@ -1560,11 +1597,12 @@
     field public static int Toolbar_subtitleTextAppearance;
     field public static int Toolbar_subtitleTextColor;
     field public static int Toolbar_title;
+    field public static int Toolbar_titleMargin;
     field public static int Toolbar_titleMarginBottom;
     field public static int Toolbar_titleMarginEnd;
     field public static int Toolbar_titleMarginStart;
     field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
+    field public static deprecated int Toolbar_titleMargins;
     field public static int Toolbar_titleTextAppearance;
     field public static int Toolbar_titleTextColor;
     field public static final int[] View;
@@ -2026,6 +2064,10 @@
     method public int getPopupTheme();
     method public java.lang.CharSequence getSubtitle();
     method public java.lang.CharSequence getTitle();
+    method public int getTitleMarginBottom();
+    method public int getTitleMarginEnd();
+    method public int getTitleMarginStart();
+    method public int getTitleMarginTop();
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(int);
@@ -2051,6 +2093,11 @@
     method public void setSubtitleTextColor(int);
     method public void setTitle(int);
     method public void setTitle(java.lang.CharSequence);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
     method public void setTitleTextAppearance(android.content.Context, int);
     method public void setTitleTextColor(int);
     method public boolean showOverflowMenu();
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 5ff23ae..19377ea 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -5,6 +5,7 @@
 dependencies {
     compile project(':support-v4')
     androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
+    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
     testCompile 'junit:junit:4.12'
 }
 
diff --git a/v7/appcompat/res-public/values/public_attrs.xml b/v7/appcompat/res-public/values/public_attrs.xml
index 3c812d7..a1d5d37 100644
--- a/v7/appcompat/res-public/values/public_attrs.xml
+++ b/v7/appcompat/res-public/values/public_attrs.xml
@@ -50,6 +50,7 @@
      <public type="attr" name="actionViewClass"/>
      <public type="attr" name="alertDialogStyle"/>
      <public type="attr" name="alertDialogTheme"/>
+     <public type="attr" name="alpha"/>
      <public type="attr" name="arrowHeadLength"/>
      <public type="attr" name="arrowShaftLength"/>
      <public type="attr" name="autoCompleteTextViewStyle"/>
@@ -65,6 +66,7 @@
      <public type="attr" name="buttonBarNeutralButtonStyle"/>
      <public type="attr" name="buttonBarPositiveButtonStyle"/>
      <public type="attr" name="buttonBarStyle"/>
+     <public type="attr" name="buttonGravity" />
      <public type="attr" name="buttonStyle"/>
      <public type="attr" name="buttonStyleSmall"/>
      <public type="attr" name="buttonTint"/>
@@ -126,6 +128,7 @@
      <public type="attr" name="listPreferredItemPaddingRight"/>
      <public type="attr" name="logo"/>
      <public type="attr" name="logoDescription"/>
+     <public type="attr" name="maxButtonHeight" />
      <public type="attr" name="measureWithLargestChild"/>
      <public type="attr" name="middleBarArrowSize"/>
      <public type="attr" name="navigationContentDescription"/>
@@ -145,6 +148,8 @@
      <public type="attr" name="queryHint"/>
      <public type="attr" name="radioButtonStyle"/>
      <public type="attr" name="ratingBarStyle"/>
+     <public type="attr" name="ratingBarStyleIndicator"/>
+     <public type="attr" name="ratingBarStyleSmall"/>
      <public type="attr" name="searchHintIcon"/>
      <public type="attr" name="searchIcon"/>
      <public type="attr" name="searchViewStyle"/>
@@ -181,6 +186,7 @@
      <public type="attr" name="title"/>
      <public type="attr" name="titleMarginBottom"/>
      <public type="attr" name="titleMarginEnd"/>
+     <public type="attr" name="titleMargin"/>
      <public type="attr" name="titleMargins"/>
      <public type="attr" name="titleMarginStart"/>
      <public type="attr" name="titleMarginTop"/>
diff --git a/v7/appcompat/res-public/values/public_styles.xml b/v7/appcompat/res-public/values/public_styles.xml
index 991ab54..aba9c8b 100644
--- a/v7/appcompat/res-public/values/public_styles.xml
+++ b/v7/appcompat/res-public/values/public_styles.xml
@@ -61,6 +61,13 @@
     <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.DayNight"/>
+    <public type="style" name="Theme.AppCompat.DayNight.DarkActionBar"/>
+    <public type="style" name="Theme.AppCompat.DayNight.Dialog"/>
+    <public type="style" name="Theme.AppCompat.DayNight.Dialog.Alert"/>
+    <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"/>
@@ -134,6 +141,8 @@
     <public type="style" name="Widget.AppCompat.ProgressBar"/>
     <public type="style" name="Widget.AppCompat.ProgressBar.Horizontal"/>
     <public type="style" name="Widget.AppCompat.RatingBar"/>
+    <public type="style" name="Widget.AppCompat.RatingBar.Indicator"/>
+    <public type="style" name="Widget.AppCompat.RatingBar.Small"/>
     <public type="style" name="Widget.AppCompat.SearchView"/>
     <public type="style" name="Widget.AppCompat.SearchView.ActionBar"/>
     <public type="style" name="Widget.AppCompat.SeekBar"/>
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v7/appcompat/res/color/abc_tint_btn_checkable.xml
similarity index 62%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v7/appcompat/res/color/abc_tint_btn_checkable.xml
index e5dafb0..0c663f6 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v7/appcompat/res/color/abc_tint_btn_checkable.xml
@@ -14,9 +14,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorControlNormal" app:alpha="?android:disabledAlpha"/>
+    <item android:state_checked="true" android:color="?attr/colorControlActivated"/>
+    <item android:color="?attr/colorControlNormal"/>
+</selector>
\ No newline at end of file
diff --git a/v7/appcompat/res/color/abc_tint_default.xml b/v7/appcompat/res/color/abc_tint_default.xml
new file mode 100644
index 0000000..8d7c391
--- /dev/null
+++ b/v7/appcompat/res/color/abc_tint_default.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorControlNormal" app:alpha="?android:disabledAlpha"/>
+    <item android:state_focused="true" android:color="?attr/colorControlActivated"/>
+    <item android:state_pressed="true" android:color="?attr/colorControlActivated"/>
+    <item android:state_activated="true" android:color="?attr/colorControlActivated"/>
+    <item android:state_selected="true" android:color="?attr/colorControlActivated"/>
+    <item android:state_checked="true" android:color="?attr/colorControlActivated"/>
+    <item android:color="?attr/colorControlNormal"/>
+</selector>
\ No newline at end of file
diff --git a/v7/appcompat/res/color/abc_tint_edittext.xml b/v7/appcompat/res/color/abc_tint_edittext.xml
new file mode 100644
index 0000000..536d77f
--- /dev/null
+++ b/v7/appcompat/res/color/abc_tint_edittext.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorControlNormal"
+          app:alpha="?android:disabledAlpha"/>
+    <item android:state_pressed="false" android:state_focused="false"
+          android:color="?attr/colorControlNormal"/>
+    <item android:color="?attr/colorControlActivated"/>
+</selector>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v7/appcompat/res/color/abc_tint_seek_thumb.xml
similarity index 66%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v7/appcompat/res/color/abc_tint_seek_thumb.xml
index e5dafb0..cb53788 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v7/appcompat/res/color/abc_tint_seek_thumb.xml
@@ -14,9 +14,8 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorControlActivated" app:alpha="?android:attr/disabledAlpha"/>
+    <item android:color="?attr/colorControlActivated"/>
+</selector>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v7/appcompat/res/color/abc_tint_spinner.xml
similarity index 60%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v7/appcompat/res/color/abc_tint_spinner.xml
index e5dafb0..44333dd 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v7/appcompat/res/color/abc_tint_spinner.xml
@@ -14,9 +14,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorControlNormal" app:alpha="?android:disabledAlpha"/>
+    <item android:state_pressed="false" android:state_focused="false" android:color="?attr/colorControlNormal"/>
+    <item android:color="?attr/colorControlActivated"/>
+</selector>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v7/appcompat/res/color/abc_tint_switch_thumb.xml
similarity index 61%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v7/appcompat/res/color/abc_tint_switch_thumb.xml
index e5dafb0..fc8bd24 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v7/appcompat/res/color/abc_tint_switch_thumb.xml
@@ -14,9 +14,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?attr/colorSwitchThumbNormal" app:alpha="?android:attr/disabledAlpha"/>
+    <item android:state_checked="true" android:color="?attr/colorControlActivated"/>
+    <item android:color="?attr/colorSwitchThumbNormal"/>
+</selector>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v7/appcompat/res/color/abc_tint_switch_track.xml
similarity index 61%
copy from v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
copy to v7/appcompat/res/color/abc_tint_switch_track.xml
index e5dafb0..22322f8 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v7/appcompat/res/color/abc_tint_switch_track.xml
@@ -14,9 +14,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="@integer/lb_guidedactions_animation_duration"
-    android:propertyName="alpha"
-    android:valueTo="0.0"
-    android:interpolator="@animator/lb_decelerator_2"
-    android:valueType="floatType" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:state_enabled="false" android:color="?android:attr/colorForeground" app:alpha="0.1"/>
+    <item android:state_checked="true" android:color="?attr/colorControlActivated" app:alpha="0.3"/>
+    <item android:color="?android:attr/colorForeground" app:alpha="0.3"/>
+</selector>
\ No newline at end of file
diff --git a/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_off_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_off_mtrl_alpha.png
index b184dbc..1b12adf 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_on_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_on_mtrl_alpha.png
index 6549c52..30c8c99 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_on_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_btn_rating_star_on_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00001.9.png
index 88f1767..4657a25 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00001.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00012.9.png
index d5e1a00..3fd617b 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00012.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
index f61e8e3..46ccacc 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_clear_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_clear_mtrl_alpha.png
index 0fd1556..ce64334 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_clear_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_clear_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png
index b9ff1db..f39c153 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_go_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index 70eb073..706fc1f 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
index 9a87820..00e189b 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_selectall_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_selectall_mtrl_alpha.png
index 2d971a9..e631df7 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_selectall_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_selectall_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_share_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_share_mtrl_alpha.png
index ee40812..cd1f57c 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_menu_share_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_menu_share_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png
index b9baa0c..fd1d454 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_16dp.png b/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_16dp.png
new file mode 100644
index 0000000..a728afe
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_36dp.png b/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_36dp.png
new file mode 100644
index 0000000..64b2aa7
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_star_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_16dp.png b/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_16dp.png
new file mode 100644
index 0000000..cf270fe
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_36dp.png b/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_36dp.png
new file mode 100644
index 0000000..49ad6cd
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_star_half_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_ic_voice_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_ic_voice_search_api_mtrl_alpha.png
index a87d2cd..a6dbc2a 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_ic_voice_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_ic_voice_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/v7/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
index 2cf413c..d077a25 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_off_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_off_mtrl_alpha.png
index 4efe298..208def6 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_000.png b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_000.png
index 543dec3..c9c203e 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_000.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_005.png b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_005.png
index 9930b3a..253e906 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_005.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_scrubber_control_to_pressed_mtrl_005.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_scrubber_primary_mtrl_alpha.9.png b/v7/appcompat/res/drawable-hdpi/abc_scrubber_primary_mtrl_alpha.9.png
index 4cfb1a7..ffb0096 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_scrubber_primary_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_scrubber_primary_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_scrubber_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-hdpi/abc_scrubber_track_mtrl_alpha.9.png
index 32ddf7a..e54950e 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_scrubber_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_scrubber_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png
index 9de0263..0da5b1d 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_switch_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-hdpi/abc_switch_track_mtrl_alpha.9.png
index 6ad9b1d..54df961 100644
--- a/v7/appcompat/res/drawable-hdpi/abc_switch_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-hdpi/abc_switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
index 2e1062f..57211b5 100644
--- a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_cut_mtrl_alpha.png
index 9ed43ca..d8eaf07 100644
--- a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png
index 4cd8a27..ddbec8b 100644
--- a/v7/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-ldrtl-hdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
index e300b7c..b872414 100644
--- a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index 05b1e11..254f806 100644
--- a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_cut_mtrl_alpha.png
index aa7b323..efe4446 100644
--- a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png
index d02a5da..c888ee0 100644
--- a/v7/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-ldrtl-mdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index a188f2f..ffa1654 100644
--- a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index e95ba94..88e34c4 100644
--- a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png
index b097e48..09dadcc 100644
--- a/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-ldrtl-xhdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index de37158..33b4f0f 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index ac86165..fb54215 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
index 8b2adf6..3cdb6cf 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
index 0b89504..a58daf6 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index 7dc6934..a91425a 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index 884cd12..fb91811 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
index 930630d..6ccac60 100644
--- a/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-ldrtl-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png b/v7/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png
index 827d634..6e18d40 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_btn_radio_to_on_mtrl_015.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_off_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_off_mtrl_alpha.png
index 0908475..27a75a7 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_on_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_on_mtrl_alpha.png
index a5a437f..14e9e09 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_on_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_btn_rating_star_on_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png
index d890a62..d0a41a5 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00012.9.png
index 0620439..bebb1e2 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00012.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
index 8043d4c..90fbc56 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_clear_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_clear_mtrl_alpha.png
index e80681a..dde307e 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_clear_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_clear_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png
index 9603e76..6086f9c 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_commit_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png
index 44c1423..0084c12 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_go_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index 80c0695..559b835 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png
index 3966d6a..44a3768 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
index 017e45e..f95f7f7 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png
index ec0cff4..1492ab6 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_paste_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_selectall_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_selectall_mtrl_alpha.png
index 966938b..7c011af 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_selectall_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_selectall_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png
index d05f969..36f664c 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_menu_share_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png
index 451818c..0f96b08 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_16dp.png b/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_16dp.png
new file mode 100644
index 0000000..3f5d25e
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_36dp.png b/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_36dp.png
new file mode 100644
index 0000000..2ddcdd9
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_star_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_16dp.png b/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_16dp.png
new file mode 100644
index 0000000..077f9b0
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_36dp.png b/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_36dp.png
new file mode 100644
index 0000000..ac6ad11
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_ic_star_half_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/v7/appcompat/res/drawable-mdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
index fe0ec49..3924664 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_off_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_off_mtrl_alpha.png
index 10df639..ddd6d0a 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_000.png b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_000.png
index f83b1ef..9280f82 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_000.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_005.png b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_005.png
index e9efb20..f60817c 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_005.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_scrubber_control_to_pressed_mtrl_005.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_scrubber_primary_mtrl_alpha.9.png b/v7/appcompat/res/drawable-mdpi/abc_scrubber_primary_mtrl_alpha.9.png
index a4ab0a1..8878129 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_scrubber_primary_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_scrubber_primary_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_scrubber_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-mdpi/abc_scrubber_track_mtrl_alpha.9.png
index db9e172..869c8b0 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_scrubber_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_scrubber_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png
index 00c81fc..ab8460f 100644
--- a/v7/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-mdpi/abc_switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_off_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_off_mtrl_alpha.png
index c0333f9..05e6afe 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png
index 2f29c39..7116604 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_btn_rating_star_on_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
index a854864..4feb8a3 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
index 726b1dc..2bf9208 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index c465e82..154babd 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_clear_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_clear_mtrl_alpha.png
index 76e07f0..6d90d0c 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_clear_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_clear_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png
index 1015e1f..ca303fd 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_commit_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png
index b3fa6bc..19e000a 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_go_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index c8a6d25..6448549 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png
index 3c5e683..cd38901 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
index f87733a..e76c83e 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_selectall_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_selectall_mtrl_alpha.png
index c039c8e..6a7161f 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_selectall_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_selectall_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_share_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_share_mtrl_alpha.png
index b57ee19..6be7e09 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_share_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_menu_share_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_search_api_mtrl_alpha.png
index 76f2696..209898d 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_16dp.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_16dp.png
new file mode 100644
index 0000000..35fe965
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_36dp.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_36dp.png
new file mode 100644
index 0000000..45887c1
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_16dp.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_16dp.png
new file mode 100644
index 0000000..ea6033a
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_36dp.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_36dp.png
new file mode 100644
index 0000000..2f4818b
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_star_half_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png
index d0385ba..7329c15 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_ic_voice_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/v7/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
index 09d1022..99cf6de 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_off_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_off_mtrl_alpha.png
index 138f643..1627f21 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_000.png b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
index cd41d74..0486af1 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_005.png b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
index 8d67525..0b15d96 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_primary_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_primary_mtrl_alpha.9.png
index 2b4734d..fb4e42a 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_primary_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_primary_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_track_mtrl_alpha.9.png
index 805cb29..44b9a14 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_scrubber_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_scrubber_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_switch_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xhdpi/abc_switch_track_mtrl_alpha.9.png
index f0752d2..7c56175 100644
--- a/v7/appcompat/res/drawable-xhdpi/abc_switch_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xhdpi/abc_switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png b/v7/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png
index 92b712e..3038d70 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_off_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_off_mtrl_alpha.png
index 78bbeba..37b8583 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png
index c4ba8e6..4a3bd14 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_btn_rating_star_on_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
index f026a41..c079867 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
index c8b9f68..3b9dc7c 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index 39178bf..f99802f 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png
index f54f4f9..b85e87f 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_clear_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png
index 65cf0c1..7d9dfa4 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_commit_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index 9dff893..90d6ba3 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
index a1f8c33..63e541f 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
index 28a3bbf..c382aa6 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_moreoverflow_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
index 29a4e52..f71485c 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_share_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_share_mtrl_alpha.png
index a1866ba..d95a377 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_share_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_menu_share_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png
index d967ae7..f28ed76 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_16dp.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_16dp.png
new file mode 100644
index 0000000..e5509b0
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_36dp.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_36dp.png
new file mode 100644
index 0000000..72685ab
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_16dp.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_16dp.png
new file mode 100644
index 0000000..8e985b4
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_36dp.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_36dp.png
new file mode 100644
index 0000000..19bbc12
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_star_half_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
index 5baef9f..dacf407 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png
index 9cc3666..4f3b147 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_list_selector_disabled_holo_dark.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
index f7f306d..b5ceeac 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_popup_background_mtrl_mult.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_popup_background_mtrl_mult.9.png
index ee4bfe7..4727a7d 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_popup_background_mtrl_mult.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_popup_background_mtrl_mult.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_off_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_off_mtrl_alpha.png
index 5268745..eb6e91b 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_off_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_off_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
index adffc14..dd0031c 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
index f3d16d5..9955cdfe 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_primary_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_primary_mtrl_alpha.9.png
index 6a82af5..3d9b961 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_primary_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_primary_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_track_mtrl_alpha.9.png
index c3791fc..56a69df 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_scrubber_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
index 6940b60..2493858 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png
index c74b3fc..d2fc99a 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png
index d4f3650..bc21142 100644
--- a/v7/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_000.png b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_000.png
index 4dc870e..d44bbae 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_000.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
index 6fd5bfe..8043c0b 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
index 99e68cc..355d5b7 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
index 16b0f1d..41d6d6b 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_clear_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_clear_mtrl_alpha.png
index 7b2a480..da2b577 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_clear_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_clear_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
index fe93d87..715db8a 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_copy_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png
index 4b2d05a..397fd91 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_cut_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
index 129d30f..1891b3d 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_paste_mtrl_am_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_selectall_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_selectall_mtrl_alpha.png
index fa6ab02..591a1c9 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_selectall_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_selectall_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png
index 77318c7..ba16aac 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_menu_share_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_search_api_mtrl_alpha.png
index 098c25a..cfbce7d 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_16dp.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_16dp.png
new file mode 100644
index 0000000..cc81097
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_36dp.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_36dp.png
new file mode 100644
index 0000000..dc312c1
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_16dp.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_16dp.png
new file mode 100644
index 0000000..1c7f66e
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_16dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_36dp.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_36dp.png
new file mode 100644
index 0000000..82e7293
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_star_half_black_36dp.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_voice_search_api_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
index 76c4eeb..d191642 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_ic_voice_search_api_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png b/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
index e5a43bb..7dfaf7c 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png b/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
index eeb37c1..fe8f2e4 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png b/v7/appcompat/res/drawable-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
index 6b8bc0a..761e8de 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_switch_track_mtrl_alpha.9.png b/v7/appcompat/res/drawable-xxxhdpi/abc_switch_track_mtrl_alpha.9.png
index 85c81c1..5651d24 100644
--- a/v7/appcompat/res/drawable-xxxhdpi/abc_switch_track_mtrl_alpha.9.png
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/v7/appcompat/res/drawable/abc_ratingbar_indicator_material.xml b/v7/appcompat/res/drawable/abc_ratingbar_indicator_material.xml
new file mode 100644
index 0000000..207991c
--- /dev/null
+++ b/v7/appcompat/res/drawable/abc_ratingbar_indicator_material.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@android:id/background"
+          android:drawable="@drawable/abc_ic_star_black_36dp" />
+    <item android:id="@android:id/secondaryProgress"
+          android:drawable="@drawable/abc_ic_star_half_black_36dp" />
+    <item android:id="@android:id/progress">
+        <bitmap
+                android:src="@drawable/abc_ic_star_black_36dp"
+                android:tileModeX="repeat"/>
+    </item>
+</layer-list>
diff --git a/v7/appcompat/res/drawable/abc_ratingbar_small_material.xml b/v7/appcompat/res/drawable/abc_ratingbar_small_material.xml
new file mode 100644
index 0000000..6daff8b
--- /dev/null
+++ b/v7/appcompat/res/drawable/abc_ratingbar_small_material.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@android:id/background"
+          android:drawable="@drawable/abc_ic_star_black_16dp" />
+    <item android:id="@android:id/secondaryProgress"
+          android:drawable="@drawable/abc_ic_star_half_black_16dp" />
+    <item android:id="@android:id/progress">
+        <bitmap
+                android:src="@drawable/abc_ic_star_black_16dp"
+                android:tileModeX="repeat"/>
+    </item>
+</layer-list>
diff --git a/v7/appcompat/res/layout/abc_alert_dialog_button_bar_material.xml b/v7/appcompat/res/layout/abc_alert_dialog_button_bar_material.xml
index d32ad10..08adfd1 100644
--- a/v7/appcompat/res/layout/abc_alert_dialog_button_bar_material.xml
+++ b/v7/appcompat/res/layout/abc_alert_dialog_button_bar_material.xml
@@ -28,7 +28,6 @@
     android:paddingTop="4dp"
     android:paddingBottom="4dp"
     android:gravity="bottom"
-    app:allowStacking="@bool/abc_allow_stacked_button_bar"
     style="?attr/buttonBarStyle">
 
     <Button
diff --git a/v7/appcompat/res/layout/abc_search_view.xml b/v7/appcompat/res/layout/abc_search_view.xml
index a7446e3..b496f5d 100644
--- a/v7/appcompat/res/layout/abc_search_view.xml
+++ b/v7/appcompat/res/layout/abc_search_view.xml
@@ -80,7 +80,6 @@
                   android:layout_height="36dip"
                   android:layout_width="0dp"
                   android:layout_weight="1"
-                  android:minWidth="@dimen/abc_search_view_text_min_width"
                   android:layout_gravity="bottom"
                   android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left"
                   android:paddingRight="@dimen/abc_dropdownitem_text_padding_right"
diff --git a/v7/appcompat/res/values-af/strings.xml b/v7/appcompat/res/values-af/strings.xml
index 4bb50b0..3964909 100644
--- a/v7/appcompat/res/values-af/strings.xml
+++ b/v7/appcompat/res/values-af/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deel met %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deel met"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"AF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-am/strings.xml b/v7/appcompat/res/values-am/strings.xml
index a76c931..ae720f8 100644
--- a/v7/appcompat/res/values-am/strings.xml
+++ b/v7/appcompat/res/values-am/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ከ%s ጋር ያጋሩ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ከሚከተለው ጋር ያጋሩ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"በርቷል"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ጠፍቷል"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ar/strings.xml b/v7/appcompat/res/values-ar/strings.xml
index f0046a9..313daf8 100644
--- a/v7/appcompat/res/values-ar/strings.xml
+++ b/v7/appcompat/res/values-ar/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏مشاركة مع %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"مشاركة مع"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"تشغيل"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"إيقاف"</string>
 </resources>
diff --git a/v7/appcompat/res/values-az-rAZ/strings.xml b/v7/appcompat/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..37d2399
--- /dev/null
+++ b/v7/appcompat/res/values-az-rAZ/strings.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2012 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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Hazırdır"</string>
+    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Evə get"</string>
+    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yuxarı get"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Daha çox seçim"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Dağıt"</string>
+    <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
+    <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Axtarış"</string>
+    <string name="abc_search_hint" msgid="7723749260725869598">"Axtarış..."</string>
+    <string name="abc_searchview_description_query" msgid="2550479030709304392">"Axtarış sorğusu"</string>
+    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Sorğunu təmizlə"</string>
+    <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Sorğunu göndərin"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Səsli axtarış"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Tətbiq seçin"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Hamısına baxın"</string>
+    <!-- String.format failed for translation -->
+    <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
+    <skip />
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bununla paylaşın"</string>
+    <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AKTİV"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DEAKTİV"</string>
+</resources>
diff --git a/v7/appcompat/res/values-bg/strings.xml b/v7/appcompat/res/values-bg/strings.xml
index d8cbcd0..c71fd6c 100644
--- a/v7/appcompat/res/values-bg/strings.xml
+++ b/v7/appcompat/res/values-bg/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Споделяне със: %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Споделяне със:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ИЗКЛ."</string>
 </resources>
diff --git a/v7/appcompat/res/values-bn-rBD/strings.xml b/v7/appcompat/res/values-bn-rBD/strings.xml
index 872d425..6be164f 100644
--- a/v7/appcompat/res/values-bn-rBD/strings.xml
+++ b/v7/appcompat/res/values-bn-rBD/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে ভাগ করুন"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে ভাগ করুন"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"৯৯৯+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ca/strings.xml b/v7/appcompat/res/values-ca/strings.xml
index 863e69f..2613ea6 100644
--- a/v7/appcompat/res/values-ca/strings.xml
+++ b/v7/appcompat/res/values-ca/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Comparteix amb %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Comparteix amb"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAT"</string>
 </resources>
diff --git a/v7/appcompat/res/values-cs/strings.xml b/v7/appcompat/res/values-cs/strings.xml
index cba91eb..c8e1921 100644
--- a/v7/appcompat/res/values-cs/strings.xml
+++ b/v7/appcompat/res/values-cs/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Sdílet pomocí %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Sdílet pomocí"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-da/strings.xml b/v7/appcompat/res/values-da/strings.xml
index bda4579..e7ac13f 100644
--- a/v7/appcompat/res/values-da/strings.xml
+++ b/v7/appcompat/res/values-da/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"TIL"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"FRA"</string>
 </resources>
diff --git a/v7/appcompat/res/values-de/strings.xml b/v7/appcompat/res/values-de/strings.xml
index b5a74e9..06a18b5 100644
--- a/v7/appcompat/res/values-de/strings.xml
+++ b/v7/appcompat/res/values-de/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Freigeben für %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Freigeben für"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"An"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"Aus"</string>
 </resources>
diff --git a/v7/appcompat/res/values-el/strings.xml b/v7/appcompat/res/values-el/strings.xml
index 1ecc119..5309082 100644
--- a/v7/appcompat/res/values-el/strings.xml
+++ b/v7/appcompat/res/values-el/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Κοινή χρήση με %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Κοινή χρήση με"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rAU/strings.xml b/v7/appcompat/res/values-en-rAU/strings.xml
index 4db58a9..ab73cfd 100644
--- a/v7/appcompat/res/values-en-rAU/strings.xml
+++ b/v7/appcompat/res/values-en-rAU/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rGB/strings.xml b/v7/appcompat/res/values-en-rGB/strings.xml
index 4db58a9..ab73cfd 100644
--- a/v7/appcompat/res/values-en-rGB/strings.xml
+++ b/v7/appcompat/res/values-en-rGB/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rIN/strings.xml b/v7/appcompat/res/values-en-rIN/strings.xml
index 4db58a9..ab73cfd 100644
--- a/v7/appcompat/res/values-en-rIN/strings.xml
+++ b/v7/appcompat/res/values-en-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index 043c6ae..f1e3dbb 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
 </resources>
diff --git a/v7/appcompat/res/values-es/strings.xml b/v7/appcompat/res/values-es/strings.xml
index 8f6ea4b..d8e7d39 100644
--- a/v7/appcompat/res/values-es/strings.xml
+++ b/v7/appcompat/res/values-es/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"SÍ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"NO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-et-rEE/strings.xml b/v7/appcompat/res/values-et-rEE/strings.xml
index b8c7f16..03091c4 100644
--- a/v7/appcompat/res/values-et-rEE/strings.xml
+++ b/v7/appcompat/res/values-et-rEE/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jagamine kasutajaga %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jagamine:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"SEES"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"VÄLJAS"</string>
 </resources>
diff --git a/v7/appcompat/res/values-eu-rES/strings.xml b/v7/appcompat/res/values-eu-rES/strings.xml
index 3b0fb90..92bda4a 100644
--- a/v7/appcompat/res/values-eu-rES/strings.xml
+++ b/v7/appcompat/res/values-eu-rES/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partekatu %s erabiltzailearekin"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partekatu hauekin"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AKTIBATUTA"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESAKTIBATUTA"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index ae4eb85..97d6ea7 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4076576682505996667">"انجام شد"</string>
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"تمام"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"پیمایش به صفحه اصلی"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"پیمایش به بالا"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"گزینه‌های بیشتر"</string>
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏اشتراک‌گذاری با %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک‌گذاری با"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"۹۹۹+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"روشن"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"خاموش"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fi/strings.xml b/v7/appcompat/res/values-fi/strings.xml
index 4b3e728..77a4a98 100644
--- a/v7/appcompat/res/values-fi/strings.xml
+++ b/v7/appcompat/res/values-fi/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jakaminen: %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jakaminen:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"KÄYTÖSSÄ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"POIS KÄYTÖSTÄ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fr-rCA/strings.xml b/v7/appcompat/res/values-fr-rCA/strings.xml
index 291bd4e..1f636fb 100644
--- a/v7/appcompat/res/values-fr-rCA/strings.xml
+++ b/v7/appcompat/res/values-fr-rCA/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fr/strings.xml b/v7/appcompat/res/values-fr/strings.xml
index b7f5604..8fc4240 100644
--- a/v7/appcompat/res/values-fr/strings.xml
+++ b/v7/appcompat/res/values-fr/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-gl-rES/strings.xml b/v7/appcompat/res/values-gl-rES/strings.xml
index b6b11be..ee1e7d5 100644
--- a/v7/appcompat/res/values-gl-rES/strings.xml
+++ b/v7/appcompat/res/values-gl-rES/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
 </resources>
diff --git a/v7/appcompat/res/values-gu-rIN/strings.xml b/v7/appcompat/res/values-gu-rIN/strings.xml
index b77acd3..6fea9bb 100644
--- a/v7/appcompat/res/values-gu-rIN/strings.xml
+++ b/v7/appcompat/res/values-gu-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s સાથે શેર કરો"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"આની સાથે શેર કરો"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ચાલુ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"બંધ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index 95daa34..17d3d7b 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s के साथ साझा करें"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hr/strings.xml b/v7/appcompat/res/values-hr/strings.xml
index da68332..6467bfa 100644
--- a/v7/appcompat/res/values-hr/strings.xml
+++ b/v7/appcompat/res/values-hr/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dijeljenje sa: %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeljenje sa"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČENO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČENO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hu/strings.xml b/v7/appcompat/res/values-hu/strings.xml
index 57ab85b..1cb4fe5 100644
--- a/v7/appcompat/res/values-hu/strings.xml
+++ b/v7/appcompat/res/values-hu/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Megosztás a következővel: %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Megosztás a következővel:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"BE"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"KI"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hy-rAM/strings.xml b/v7/appcompat/res/values-hy-rAM/strings.xml
index 903fa43..708275a 100644
--- a/v7/appcompat/res/values-hy-rAM/strings.xml
+++ b/v7/appcompat/res/values-hy-rAM/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Տարածել ըստ %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Տարածել"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-in/strings.xml b/v7/appcompat/res/values-in/strings.xml
index 0e7003c..d2d0ecc 100644
--- a/v7/appcompat/res/values-in/strings.xml
+++ b/v7/appcompat/res/values-in/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bagikan dengan %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bagikan dengan"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AKTIF"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"NONAKTIF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-is-rIS/strings.xml b/v7/appcompat/res/values-is-rIS/strings.xml
index fb305b2..c8ded4d 100644
--- a/v7/appcompat/res/values-is-rIS/strings.xml
+++ b/v7/appcompat/res/values-is-rIS/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deila með %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deila með"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"KVEIKT"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"SLÖKKT"</string>
 </resources>
diff --git a/v7/appcompat/res/values-it/strings.xml b/v7/appcompat/res/values-it/strings.xml
index a2d9bee..31bff55 100644
--- a/v7/appcompat/res/values-it/strings.xml
+++ b/v7/appcompat/res/values-it/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Condividi con %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Condividi con"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-iw/strings.xml b/v7/appcompat/res/values-iw/strings.xml
index 329d0ec..6b834d9 100644
--- a/v7/appcompat/res/values-iw/strings.xml
+++ b/v7/appcompat/res/values-iw/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏שתף עם %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"שתף עם"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"‎999+‎"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"פועל"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"כבוי"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ja/strings.xml b/v7/appcompat/res/values-ja/strings.xml
index fa55b08..45fb2c0 100644
--- a/v7/appcompat/res/values-ja/strings.xml
+++ b/v7/appcompat/res/values-ja/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sと共有"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"共有"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ka-rGE/strings.xml b/v7/appcompat/res/values-ka-rGE/strings.xml
index b14bcb7..91c31fb 100644
--- a/v7/appcompat/res/values-ka-rGE/strings.xml
+++ b/v7/appcompat/res/values-ka-rGE/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-თან გაზიარება"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"გაზიარება:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ჩართულია"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"გამორთულია"</string>
 </resources>
diff --git a/v7/appcompat/res/values-kk-rKZ/strings.xml b/v7/appcompat/res/values-kk-rKZ/strings.xml
index 52b9af5..81fcfa9 100644
--- a/v7/appcompat/res/values-kk-rKZ/strings.xml
+++ b/v7/appcompat/res/values-kk-rKZ/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4076576682505996667">"Орындалды"</string>
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Дайын"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Негізгі бетте қозғалу"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Жоғары қозғалу"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Басқа опциялар"</string>
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s бөлісу"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлісу"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ҚОСУЛЫ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ӨШІРУЛІ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-km-rKH/strings.xml b/v7/appcompat/res/values-km-rKH/strings.xml
index aa81b7d..ee4bcbe 100644
--- a/v7/appcompat/res/values-km-rKH/strings.xml
+++ b/v7/appcompat/res/values-km-rKH/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ចែករំលែក​ជាមួយ %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ចែករំលែក​ជាមួយ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"បើក"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"បិទ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-kn-rIN/strings.xml b/v7/appcompat/res/values-kn-rIN/strings.xml
index 7ef7572..abd409e 100644
--- a/v7/appcompat/res/values-kn-rIN/strings.xml
+++ b/v7/appcompat/res/values-kn-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ಆನ್"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ಆಫ್"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ko/strings.xml b/v7/appcompat/res/values-ko/strings.xml
index 7c158f9..262f543 100644
--- a/v7/appcompat/res/values-ko/strings.xml
+++ b/v7/appcompat/res/values-ko/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s와(과) 공유"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"공유 대상"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"사용"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"사용 안함"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ky-rKG/strings.xml b/v7/appcompat/res/values-ky-rKG/strings.xml
index a758b96..3176cc6 100644
--- a/v7/appcompat/res/values-ky-rKG/strings.xml
+++ b/v7/appcompat/res/values-ky-rKG/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s аркылуу бөлүшүү"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлүшүү"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"КҮЙҮК"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ӨЧҮК"</string>
 </resources>
diff --git a/v7/appcompat/res/values-land/bools.xml b/v7/appcompat/res/values-land/bools.xml
deleted file mode 100644
index 7d1a1af..0000000
--- a/v7/appcompat/res/values-land/bools.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
-</resources>
diff --git a/v7/appcompat/res/values-land/config.xml b/v7/appcompat/res/values-land/config.xml
deleted file mode 100644
index d0d990d..0000000
--- a/v7/appcompat/res/values-land/config.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 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>
-    <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
-</resources>
diff --git a/v7/appcompat/res/values-large/bools.xml b/v7/appcompat/res/values-large/bools.xml
deleted file mode 100644
index 7d1a1af..0000000
--- a/v7/appcompat/res/values-large/bools.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
-</resources>
diff --git a/v7/appcompat/res/values-large/config.xml b/v7/appcompat/res/values-large/config.xml
index c4f04a3..58e34a0 100644
--- a/v7/appcompat/res/values-large/config.xml
+++ b/v7/appcompat/res/values-large/config.xml
@@ -20,11 +20,6 @@
 <!-- These resources are around just to allow their values to be customized
      for different hardware and product builds. -->
 <resources>
-    <!-- Whether action menu items should obey the "withText" showAsAction.
-         This may be set to false for situations where space is
-         extremely limited. -->
-    <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
-
     <!-- see comment in values/config.xml -->
     <dimen name="abc_config_prefDialogWidth">440dp</dimen>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/v7/appcompat/res/values-large/dimens.xml b/v7/appcompat/res/values-large/dimens.xml
index 16bb4f6..5afdda4 100644
--- a/v7/appcompat/res/values-large/dimens.xml
+++ b/v7/appcompat/res/values-large/dimens.xml
@@ -15,13 +15,6 @@
 -->
 
 <resources>
-    <!-- Minimum width of the search view text entry area. -->
-    <dimen name="abc_search_view_text_min_width">192dip</dimen>
-    <!-- The maximum number of action buttons that should be permitted within
-     an action bar/action mode. This will be used to determine how many
-     showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">4</integer>
-
     <item type="dimen" name="abc_dialog_fixed_width_major">60%</item>
     <item type="dimen" name="abc_dialog_fixed_width_minor">90%</item>
     <item type="dimen" name="abc_dialog_fixed_height_major">60%</item>
diff --git a/v7/appcompat/res/values-lo-rLA/strings.xml b/v7/appcompat/res/values-lo-rLA/strings.xml
index 3b93232..c95fd60 100644
--- a/v7/appcompat/res/values-lo-rLA/strings.xml
+++ b/v7/appcompat/res/values-lo-rLA/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ແບ່ງ​ປັນ​ກັບ​ %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ແບ່ງປັນກັບ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ເປີດ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ປິດ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index b070a2f..992910c 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bendrinti naudojant „%s“"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTI"</string>
 </resources>
diff --git a/v7/appcompat/res/values-lv/strings.xml b/v7/appcompat/res/values-lv/strings.xml
index 7c4ef4f..6700c87 100644
--- a/v7/appcompat/res/values-lv/strings.xml
+++ b/v7/appcompat/res/values-lv/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kopīgot ar %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kopīgot ar:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"IESLĒGTS"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"IZSLĒGTS"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mk-rMK/strings.xml b/v7/appcompat/res/values-mk-rMK/strings.xml
index ac2b03e..a386996 100644
--- a/v7/appcompat/res/values-mk-rMK/strings.xml
+++ b/v7/appcompat/res/values-mk-rMK/strings.xml
@@ -38,4 +38,6 @@
     <skip />
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Сподели со"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛУЧЕНО"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ИСКЛУЧЕНО"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ml-rIN/strings.xml b/v7/appcompat/res/values-ml-rIN/strings.xml
index 53f8e4b..292fcc0 100644
--- a/v7/appcompat/res/values-ml-rIN/strings.xml
+++ b/v7/appcompat/res/values-ml-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s എന്നതുമായി പങ്കിടുക"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ഇവരുമായി പങ്കിടുക"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ഓൺ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ഓഫ്"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mn-rMN/strings.xml b/v7/appcompat/res/values-mn-rMN/strings.xml
index a89dc4d..75a9724 100644
--- a/v7/appcompat/res/values-mn-rMN/strings.xml
+++ b/v7/appcompat/res/values-mn-rMN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-тай хуваалцах"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Хуваалцах"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ИДЭВХТЭЙ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ИДЭВХГҮЙ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mr-rIN/strings.xml b/v7/appcompat/res/values-mr-rIN/strings.xml
index 1afbd81..76d42a9 100644
--- a/v7/appcompat/res/values-mr-rIN/strings.xml
+++ b/v7/appcompat/res/values-mr-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सह सामायिक करा"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"यांच्यासह सामायिक करा"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ms-rMY/strings.xml b/v7/appcompat/res/values-ms-rMY/strings.xml
index 9763618..75ffefb 100644
--- a/v7/appcompat/res/values-ms-rMY/strings.xml
+++ b/v7/appcompat/res/values-ms-rMY/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kongsi dengan %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kongsi dengan"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"HIDUP"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"MATI"</string>
 </resources>
diff --git a/v7/appcompat/res/values-my-rMM/strings.xml b/v7/appcompat/res/values-my-rMM/strings.xml
index 936ac99..f8690aa 100644
--- a/v7/appcompat/res/values-my-rMM/strings.xml
+++ b/v7/appcompat/res/values-my-rMM/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ကို မျှဝေပါရန်"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"မျှဝေဖို့ ရွေးပါ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"၉၉၉+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ဖွင့်"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ပိတ်"</string>
 </resources>
diff --git a/v7/appcompat/res/values-nb/strings.xml b/v7/appcompat/res/values-nb/strings.xml
index 483f707..10f3024 100644
--- a/v7/appcompat/res/values-nb/strings.xml
+++ b/v7/appcompat/res/values-nb/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ne-rNP/strings.xml b/v7/appcompat/res/values-ne-rNP/strings.xml
index 4a08778..a841f21 100644
--- a/v7/appcompat/res/values-ne-rNP/strings.xml
+++ b/v7/appcompat/res/values-ne-rNP/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सँग साझेदारी गर्नुहोस्"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"साझेदारी गर्नुहोस्..."</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"९९९+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
 </resources>
diff --git a/v7/appcompat/res/values-night/themes_daynight.xml b/v7/appcompat/res/values-night/themes_daynight.xml
new file mode 100644
index 0000000..965d355
--- /dev/null
+++ b/v7/appcompat/res/values-night/themes_daynight.xml
@@ -0,0 +1,50 @@
+<?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>
+
+    <!-- Material theme (day/night vesion) for activities. -->
+    <style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat" />
+
+    <!-- Variant of AppCompat.DayNight that has a solid (opaque) action bar
+         with an inverse color profile. The dark action bar sharply stands out against
+         the light content (when applicable).  -->
+    <style name="Theme.AppCompat.DayNight.DarkActionBar" parent="Theme.AppCompat" />
+
+    <!-- Variant of AppCompat.DayNight with no action bar.  -->
+    <style name="Theme.AppCompat.DayNight.NoActionBar" parent="Theme.AppCompat.NoActionBar" />
+
+    <!-- Material theme (day/night vesion) for dialog windows and activities,
+         which is used by the {@code android.support.v7.app.Dialog} class. This changes
+         the window to be floating (not fill the entire screen), and puts a
+         frame around its contents. You can set this theme on an activity if
+         you would like to make an activity that looks like a Dialog. -->
+    <style name="Theme.AppCompat.DayNight.Dialog" parent="Theme.AppCompat.Dialog" />
+
+    <!-- Variant of Theme.AppCompat.DayNight.Dialog that has a nice minimum width for
+         a regular dialog. -->
+    <style name="Theme.AppCompat.DayNight.Dialog.MinWidth" parent="Theme.AppCompat.Dialog.MinWidth" />
+
+    <!-- Theme for a window that will be displayed either full-screen on
+         smaller screens (small, normal) or as a dialog on larger screens
+         (large, xlarge). -->
+    <style name="Theme.AppCompat.DayNight.DialogWhenLarge" parent="Theme.AppCompat.DialogWhenLarge" />
+
+    <!-- Material user theme for alert dialog windows, which is used by the
+         {@code android.support.v7.app.AlertDialog} class. -->
+    <style name="Theme.AppCompat.DayNight.Dialog.Alert" parent="Theme.AppCompat.Dialog.Alert" />
+
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-nl/strings.xml b/v7/appcompat/res/values-nl/strings.xml
index 38a7607..adb0f0e 100644
--- a/v7/appcompat/res/values-nl/strings.xml
+++ b/v7/appcompat/res/values-nl/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Delen met %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Delen met"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"UIT"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pa-rIN/strings.xml b/v7/appcompat/res/values-pa-rIN/strings.xml
index af87fdf..45b703a 100644
--- a/v7/appcompat/res/values-pa-rIN/strings.xml
+++ b/v7/appcompat/res/values-pa-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ਨਾਲ ਸ਼ੇਅਰ ਕਰੋ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ਇਸ ਨਾਲ ਸ਼ੇਅਰ ਕਰੋ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ਤੇ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ਬੰਦ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pl/strings.xml b/v7/appcompat/res/values-pl/strings.xml
index 72fa439..166986a 100644
--- a/v7/appcompat/res/values-pl/strings.xml
+++ b/v7/appcompat/res/values-pl/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Udostępnij dla %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Udostępnij dla"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"WŁ."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"WYŁ."</string>
 </resources>
diff --git a/v7/appcompat/res/values-pt-rBR/strings.xml b/v7/appcompat/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..06cf8d9
--- /dev/null
+++ b/v7/appcompat/res/values-pt-rBR/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2012 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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Concluído"</string>
+    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navegar para a página inicial"</string>
+    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navegar para cima"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Mais opções"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Recolher"</string>
+    <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
+    <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Pesquisar"</string>
+    <string name="abc_search_hint" msgid="7723749260725869598">"Pesquisar..."</string>
+    <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de pesquisa"</string>
+    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Limpar consulta"</string>
+    <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
+    <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
+</resources>
diff --git a/v7/appcompat/res/values-pt-rPT/strings.xml b/v7/appcompat/res/values-pt-rPT/strings.xml
index d76c5c8..176aade 100644
--- a/v7/appcompat/res/values-pt-rPT/strings.xml
+++ b/v7/appcompat/res/values-pt-rPT/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partilhar com %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partilhar com"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ATIVADO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESATIVADO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pt/strings.xml b/v7/appcompat/res/values-pt/strings.xml
index dfcfce8..06cf8d9 100644
--- a/v7/appcompat/res/values-pt/strings.xml
+++ b/v7/appcompat/res/values-pt/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ro/strings.xml b/v7/appcompat/res/values-ro/strings.xml
index 55538ee..9879823 100644
--- a/v7/appcompat/res/values-ro/strings.xml
+++ b/v7/appcompat/res/values-ro/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Trimiteți la %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Trimiteți la"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"˃999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAȚI"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DEZACTIVAȚI"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ru/strings.xml b/v7/appcompat/res/values-ru/strings.xml
index 03a2c8f..08ed085 100644
--- a/v7/appcompat/res/values-ru/strings.xml
+++ b/v7/appcompat/res/values-ru/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Открыть доступ пользователю %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Открыть доступ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ОТКЛ."</string>
 </resources>
diff --git a/v7/appcompat/res/values-si-rLK/strings.xml b/v7/appcompat/res/values-si-rLK/strings.xml
index a03b5bd..47d7dc6 100644
--- a/v7/appcompat/res/values-si-rLK/strings.xml
+++ b/v7/appcompat/res/values-si-rLK/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s සමඟ බෙදාගන්න"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"සමඟ බෙදාගන්න"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ක්‍රියාත්මකයි"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ක්‍රියාවිරහිතයි"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sk/strings.xml b/v7/appcompat/res/values-sk/strings.xml
index f7f0b81..b7a2dc0 100644
--- a/v7/appcompat/res/values-sk/strings.xml
+++ b/v7/appcompat/res/values-sk/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Zdieľať pomocou %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Zdieľať pomocou"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ZAP."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"VYP."</string>
 </resources>
diff --git a/v7/appcompat/res/values-sl/strings.xml b/v7/appcompat/res/values-sl/strings.xml
index 7d5f0bf..173180f 100644
--- a/v7/appcompat/res/values-sl/strings.xml
+++ b/v7/appcompat/res/values-sl/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deljenje z:"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deljenje z"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"VKLOPLJENO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"IZKLOPLJENO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sq-rAL/strings.xml b/v7/appcompat/res/values-sq-rAL/strings.xml
index 68689a6..758d941 100644
--- a/v7/appcompat/res/values-sq-rAL/strings.xml
+++ b/v7/appcompat/res/values-sq-rAL/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shpërnda publikisht me %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shpërnda publikisht me"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AKTIV"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"JOAKTIV"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sr/strings.xml b/v7/appcompat/res/values-sr/strings.xml
index e147d75..a54af9b 100644
--- a/v7/appcompat/res/values-sr/strings.xml
+++ b/v7/appcompat/res/values-sr/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Дели са апликацијом %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Дели са"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"УКЉУЧИ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ИСКЉУЧИ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sv/strings.xml b/v7/appcompat/res/values-sv/strings.xml
index feebdb2..a0c9cc0 100644
--- a/v7/appcompat/res/values-sv/strings.xml
+++ b/v7/appcompat/res/values-sv/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dela med %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dela med"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sw/strings.xml b/v7/appcompat/res/values-sw/strings.xml
index 25c4039..f1382ba 100644
--- a/v7/appcompat/res/values-sw/strings.xml
+++ b/v7/appcompat/res/values-sw/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shiriki na %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shiriki na:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"IMEWASHWA"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"IMEZIMWA"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sw600dp/dimens.xml b/v7/appcompat/res/values-sw600dp/dimens.xml
index a4bc455..a83abb1 100644
--- a/v7/appcompat/res/values-sw600dp/dimens.xml
+++ b/v7/appcompat/res/values-sw600dp/dimens.xml
@@ -15,12 +15,6 @@
 -->
 
 <resources>
-
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">5</integer>
-
     <!-- Use the default title sizes on tablets. -->
     <dimen name="abc_text_size_title_material_toolbar">20dp</dimen>
     <!-- Use the default subtitle sizes on tablets. -->
diff --git a/v7/appcompat/res/values-ta-rIN/strings.xml b/v7/appcompat/res/values-ta-rIN/strings.xml
index 099526b..a31eb25 100644
--- a/v7/appcompat/res/values-ta-rIN/strings.xml
+++ b/v7/appcompat/res/values-ta-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s உடன் பகிர்"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"இதனுடன் பகிர்"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"இயக்கு"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"முடக்கு"</string>
 </resources>
diff --git a/v7/appcompat/res/values-te-rIN/strings.xml b/v7/appcompat/res/values-te-rIN/strings.xml
index 8ea231a..2f6695d 100644
--- a/v7/appcompat/res/values-te-rIN/strings.xml
+++ b/v7/appcompat/res/values-te-rIN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sతో భాగస్వామ్యం చేయి"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"వీరితో భాగస్వామ్యం చేయి"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ఆన్ చేయి"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ఆఫ్ చేయి"</string>
 </resources>
diff --git a/v7/appcompat/res/values-th/strings.xml b/v7/appcompat/res/values-th/strings.xml
index cc5ab0a..b77ee55 100644
--- a/v7/appcompat/res/values-th/strings.xml
+++ b/v7/appcompat/res/values-th/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"แชร์กับ %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"แชร์กับ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"เปิด"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ปิด"</string>
 </resources>
diff --git a/v7/appcompat/res/values-tl/strings.xml b/v7/appcompat/res/values-tl/strings.xml
index aa7169f..73e1b2f 100644
--- a/v7/appcompat/res/values-tl/strings.xml
+++ b/v7/appcompat/res/values-tl/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Ibahagi sa/kay %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ibahagi sa/kay"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"I-ON"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"I-OFF"</string>
 </resources>
diff --git a/v7/appcompat/res/values-tr/strings.xml b/v7/appcompat/res/values-tr/strings.xml
index 0d592fc..185cd4d 100644
--- a/v7/appcompat/res/values-tr/strings.xml
+++ b/v7/appcompat/res/values-tr/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4076576682505996667">"Tamamlandı"</string>
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Bitti"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ana ekrana git"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yukarı git"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Diğer seçenekler"</string>
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ile paylaş"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Şununla paylaş"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"AÇ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"KAPAT"</string>
 </resources>
diff --git a/v7/appcompat/res/values-uk/strings.xml b/v7/appcompat/res/values-uk/strings.xml
index ff08b47..5e81c70 100644
--- a/v7/appcompat/res/values-uk/strings.xml
+++ b/v7/appcompat/res/values-uk/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Надіслати через %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Надіслати через"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"УВІМК."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ВИМК."</string>
 </resources>
diff --git a/v7/appcompat/res/values-ur-rPK/strings.xml b/v7/appcompat/res/values-ur-rPK/strings.xml
index 5196476..7972fe6 100644
--- a/v7/appcompat/res/values-ur-rPK/strings.xml
+++ b/v7/appcompat/res/values-ur-rPK/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏%s کے ساتھ اشتراک کریں"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک کریں مع"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"‎999+‎"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"آن"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"آف"</string>
 </resources>
diff --git a/v7/appcompat/res/values-uz-rUZ/strings.xml b/v7/appcompat/res/values-uz-rUZ/strings.xml
index fa884f7..4a713a9 100644
--- a/v7/appcompat/res/values-uz-rUZ/strings.xml
+++ b/v7/appcompat/res/values-uz-rUZ/strings.xml
@@ -23,7 +23,7 @@
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Yig‘ish"</string>
     <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
     <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
-    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Izlash"</string>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Qidirish"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"Qidirish…"</string>
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"So‘rovni izlash"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"So‘rovni tozalash"</string>
@@ -36,4 +36,6 @@
     <skip />
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bo‘lishish:"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-v23/styles_base.xml b/v7/appcompat/res/values-v23/styles_base.xml
index e1c8910..3b0e55c 100644
--- a/v7/appcompat/res/values-v23/styles_base.xml
+++ b/v7/appcompat/res/values-v23/styles_base.xml
@@ -19,4 +19,8 @@
 
     <style name="Base.Widget.AppCompat.Button.Colored" parent="android:Widget.Material.Button.Colored" />
 
+    <style name="Base.Widget.AppCompat.RatingBar.Indicator" parent="android:Widget.Material.RatingBar.Indicator" />
+
+    <style name="Base.Widget.AppCompat.RatingBar.Small" parent="android:Widget.Material.RatingBar.Small" />
+
 </resources>
diff --git a/v7/appcompat/res/values-v23/themes_base.xml b/v7/appcompat/res/values-v23/themes_base.xml
index 276a3c6..cff796c 100644
--- a/v7/appcompat/res/values-v23/themes_base.xml
+++ b/v7/appcompat/res/values-v23/themes_base.xml
@@ -21,6 +21,10 @@
     <style name="Base.Theme.AppCompat.Light" parent="Base.V23.Theme.AppCompat.Light" />
 
     <style name="Base.V23.Theme.AppCompat" parent="Base.V22.Theme.AppCompat">
+        <!-- We can use the platform styles on API 23+ -->
+        <item name="ratingBarStyleIndicator">?android:attr/ratingBarStyleIndicator</item>
+        <item name="ratingBarStyleSmall">?android:attr/ratingBarStyleSmall</item>
+
         <!-- We can use the platform drawable on v23+ -->
         <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
         <!-- We can use the platform styles on v23+ -->
@@ -31,6 +35,10 @@
     </style>
 
     <style name="Base.V23.Theme.AppCompat.Light" parent="Base.V22.Theme.AppCompat.Light">
+        <!-- We can use the platform styles on API 23+ -->
+        <item name="ratingBarStyleIndicator">?android:attr/ratingBarStyleIndicator</item>
+        <item name="ratingBarStyleSmall">?android:attr/ratingBarStyleSmall</item>
+
         <!-- We can use the platform drawable on v23+ -->
         <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
         <!-- We can use the platform styles on v23+ -->
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 8190bc0..ec24827 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Chia sẻ với %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Chia sẻ với"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"BẬT"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"TẮT"</string>
 </resources>
diff --git a/v7/appcompat/res/values-w360dp/dimens.xml b/v7/appcompat/res/values-w360dp/dimens.xml
deleted file mode 100644
index e5b2456..0000000
--- a/v7/appcompat/res/values-w360dp/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">3</integer>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-w480dp/bools.xml b/v7/appcompat/res/values-w480dp/bools.xml
deleted file mode 100644
index 470f89b..0000000
--- a/v7/appcompat/res/values-w480dp/bools.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
-</resources>
diff --git a/v7/appcompat/res/values-w480dp/config.xml b/v7/appcompat/res/values-w480dp/config.xml
deleted file mode 100644
index e95b6ff..0000000
--- a/v7/appcompat/res/values-w480dp/config.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
-</resources>
diff --git a/v7/appcompat/res/values-w500dp/dimens.xml b/v7/appcompat/res/values-w500dp/dimens.xml
deleted file mode 100644
index dd6458b..0000000
--- a/v7/appcompat/res/values-w500dp/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">4</integer>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-w600dp/dimens.xml b/v7/appcompat/res/values-w600dp/dimens.xml
deleted file mode 100644
index 252ba6a..0000000
--- a/v7/appcompat/res/values-w600dp/dimens.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">5</integer>
-
-    <!-- Minimum width of the search view text entry area. -->
-    <dimen name="abc_search_view_text_min_width">192dip</dimen>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-w720dp/bools.xml b/v7/appcompat/res/values-w720dp/bools.xml
deleted file mode 100644
index 05c5aab..0000000
--- a/v7/appcompat/res/values-w720dp/bools.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_action_bar_expanded_action_views_exclusive">false</bool>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-xlarge-land/dimens.xml b/v7/appcompat/res/values-xlarge-land/dimens.xml
deleted file mode 100644
index dea6c74..0000000
--- a/v7/appcompat/res/values-xlarge-land/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-
-    <!-- Minimum width of the search view text entry area. -->
-    <dimen name="abc_search_view_text_min_width">256dip</dimen>
-
-</resources>
diff --git a/v7/appcompat/res/values-xlarge/bools.xml b/v7/appcompat/res/values-xlarge/bools.xml
deleted file mode 100644
index 05c5aab..0000000
--- a/v7/appcompat/res/values-xlarge/bools.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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>
-    <bool name="abc_action_bar_expanded_action_views_exclusive">false</bool>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-xlarge/dimens.xml b/v7/appcompat/res/values-xlarge/dimens.xml
index 0dd244a..f0d560d 100644
--- a/v7/appcompat/res/values-xlarge/dimens.xml
+++ b/v7/appcompat/res/values-xlarge/dimens.xml
@@ -15,15 +15,6 @@
 -->
 
 <resources>
-
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">5</integer>
-
-    <!-- Minimum width of the search view text entry area. -->
-    <dimen name="abc_search_view_text_min_width">192dip</dimen>
-
     <item type="dimen" name="abc_dialog_fixed_width_major">50%</item>
     <item type="dimen" name="abc_dialog_fixed_width_minor">70%</item>
     <item type="dimen" name="abc_dialog_fixed_height_major">60%</item>
diff --git a/v7/appcompat/res/values-zh-rCN/strings.xml b/v7/appcompat/res/values-zh-rCN/strings.xml
index b0fbc2f..8ac28b7 100644
--- a/v7/appcompat/res/values-zh-rCN/strings.xml
+++ b/v7/appcompat/res/values-zh-rCN/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"通过%s分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享方式"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"开启"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"关闭"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zh-rHK/strings.xml b/v7/appcompat/res/values-zh-rHK/strings.xml
index 2c46334..91d3289 100644
--- a/v7/appcompat/res/values-zh-rHK/strings.xml
+++ b/v7/appcompat/res/values-zh-rHK/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享對象"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999 +"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zh-rTW/strings.xml b/v7/appcompat/res/values-zh-rTW/strings.xml
index bfabf5a..45fea16 100644
--- a/v7/appcompat/res/values-zh-rTW/strings.xml
+++ b/v7/appcompat/res/values-zh-rTW/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"選擇分享對象"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zu/strings.xml b/v7/appcompat/res/values-zu/strings.xml
index edc265d..932624f 100644
--- a/v7/appcompat/res/values-zu/strings.xml
+++ b/v7/appcompat/res/values-zu/strings.xml
@@ -34,4 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Yabelana no-%s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Yabelana no-"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"VULIWE"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"VALIWE"</string>
 </resources>
diff --git a/v7/appcompat/res/values/attrs.xml b/v7/appcompat/res/values/attrs.xml
index 83cb1b2..b64ef6a 100644
--- a/v7/appcompat/res/values/attrs.xml
+++ b/v7/appcompat/res/values/attrs.xml
@@ -374,6 +374,10 @@
         <attr name="radioButtonStyle" format="reference" />
         <!-- Default RatingBar style. -->
         <attr name="ratingBarStyle" format="reference" />
+        <!-- Indicator RatingBar style. -->
+        <attr name="ratingBarStyleIndicator" format="reference" />
+        <!-- Small indicator RatingBar style. -->
+        <attr name="ratingBarStyleSmall" format="reference" />
         <!-- Default SeekBar style. -->
         <attr name="seekBarStyle" format="reference" />
         <!-- Default Spinner style. -->
@@ -797,17 +801,39 @@
         <attr name="title" />
         <attr name="subtitle" />
         <attr name="android:gravity" />
-        <attr name="titleMargins" format="dimension" />
+        <!--  Specifies extra space on the left, start, right and end sides
+              of the toolbar's title. Margin values should be positive. -->
+        <attr name="titleMargin" format="dimension" />
+        <!--  Specifies extra space on the start side of the toolbar's title.
+              If both this attribute and titleMargin are specified, then this
+              attribute takes precedence. Margin values should be positive. -->
         <attr name="titleMarginStart" format="dimension" />
+        <!--  Specifies extra space on the end side of the toolbar's title.
+              If both this attribute and titleMargin are specified, then this
+              attribute takes precedence. Margin values should be positive. -->
         <attr name="titleMarginEnd" format="dimension" />
+        <!--  Specifies extra space on the top side of the toolbar's title.
+              If both this attribute and titleMargin are specified, then this
+              attribute takes precedence. Margin values should be positive. -->
         <attr name="titleMarginTop" format="dimension" />
+        <!--  Specifies extra space on the bottom side of the toolbar's title.
+              If both this attribute and titleMargin are specified, then this
+              attribute takes precedence. Margin values should be positive. -->
         <attr name="titleMarginBottom" format="dimension" />
+        <!-- {@deprecated Use titleMargin} -->
+        <attr name="titleMargins" format="dimension" />
         <attr name="contentInsetStart" />
         <attr name="contentInsetEnd" />
         <attr name="contentInsetLeft" />
         <attr name="contentInsetRight" />
         <attr name="maxButtonHeight" format="dimension" />
-
+        <attr name="buttonGravity">
+            <!-- Push object to the top of its container, not changing its size. -->
+            <flag name="top" value="0x30" />
+            <!-- Push object to the bottom of its container, not changing its size. -->
+            <flag name="bottom" value="0x50" />
+        </attr>
+        <!-- Icon drawable to use for the collapse button. -->
         <attr name="collapseIcon" format="reference" />
         <!-- Text to set as the content description for the collapse button. -->
         <attr name="collapseContentDescription" format="string" />
@@ -820,10 +846,6 @@
         <!-- Text to set as the content description for the navigation button
              located at the start of the toolbar. -->
         <attr name="navigationContentDescription" format="string" />
-
-        <!-- Allows us to read in the minHeight attr pre-v16 -->
-        <attr name="android:minHeight" />
-
         <!-- Drawable to set as the logo that appears at the starting side of
              the Toolbar, just after the navigation button. -->
         <attr name="logo" />
@@ -834,6 +856,7 @@
         <attr name="titleTextColor" format="color" />
         <!-- A color to apply to the subtitle string. -->
         <attr name="subtitleTextColor" format="color" />
+        <attr name="android:minHeight" />
     </declare-styleable>
 
     <declare-styleable name="PopupWindowBackgroundState">
@@ -961,4 +984,13 @@
         <attr name="allowStacking" format="boolean" />
     </declare-styleable>
 
+    <!-- Attributes that can be assigned to a ColorStateList item. -->
+    <declare-styleable name="ColorStateListItem">
+        <!-- Base color for this state. -->
+        <attr name="android:color" />
+        <!-- Alpha multiplier applied to the base color. -->
+        <attr name="alpha" format="float" />
+        <attr name="android:alpha"/>
+    </declare-styleable>
+
 </resources>
diff --git a/v7/appcompat/res/values/bools.xml b/v7/appcompat/res/values/bools.xml
index 3508cf3..6e1089f 100644
--- a/v7/appcompat/res/values/bools.xml
+++ b/v7/appcompat/res/values/bools.xml
@@ -17,12 +17,6 @@
 <resources>
 
     <bool name="abc_action_bar_embed_tabs">true</bool>
-    <bool name="abc_action_bar_embed_tabs_pre_jb">false</bool>
-    <bool name="abc_action_bar_expanded_action_views_exclusive">true</bool>
 
     <bool name="abc_config_showMenuShortcutsWhenKeyboardPresent">false</bool>
-
-    <!-- Whether to allow vertically stacked button bars. This is disabled for
-         configurations with a small (e.g. less than 320dp) screen height. -->
-    <bool name="abc_allow_stacked_button_bar">false</bool>
 </resources>
diff --git a/v7/appcompat/res/values/config.xml b/v7/appcompat/res/values/config.xml
index e0c521b..6d986ea 100644
--- a/v7/appcompat/res/values/config.xml
+++ b/v7/appcompat/res/values/config.xml
@@ -17,11 +17,6 @@
 <!-- These resources are around just to allow their values to be customized
      for different hardware and product builds. -->
 <resources>
-    <!-- Whether action menu items should obey the "withText" showAsAction
-    flag. This may be set to false for situations where space is
-    extremely limited. -->
-    <bool name="abc_config_allowActionMenuItemTextWithIcon">false</bool>
-
     <!-- The maximum width we would prefer dialogs to be.  0 if there is no
     maximum (let them grow as large as the screen).  Actual values are
     specified for -large and -xlarge configurations. -->
@@ -45,4 +40,4 @@
     <integer name="status_bar_notification_info_maxnum">999</integer>
 
     <integer name="cancel_button_image_alpha">127</integer>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/v7/appcompat/res/values/dimens.xml b/v7/appcompat/res/values/dimens.xml
index 37130e3..3eeeb5d 100644
--- a/v7/appcompat/res/values/dimens.xml
+++ b/v7/appcompat/res/values/dimens.xml
@@ -15,12 +15,6 @@
 -->
 
 <resources>
-
-    <!-- The maximum number of action buttons that should be permitted within
-         an action bar/action mode. This will be used to determine how many
-         showAsAction="ifRoom" items can fit. "always" items can override this. -->
-    <integer name="abc_max_action_buttons">2</integer>
-
     <!-- Maximum width for a stacked action bar tab. This prevents
          action bar tabs from becoming too wide on a wide screen when only
          a few are present. -->
@@ -33,8 +27,6 @@
 
     <dimen name="abc_panel_menu_list_width">296dp</dimen>
 
-    <!-- Minimum width of the search view text entry area. -->
-    <dimen name="abc_search_view_text_min_width">160dip</dimen>
     <!-- Preferred width of the search view. -->
     <dimen name="abc_search_view_preferred_width">320dip</dimen>
 
diff --git a/v7/appcompat/res/values/styles.xml b/v7/appcompat/res/values/styles.xml
index 6c5c776..525f4ed 100644
--- a/v7/appcompat/res/values/styles.xml
+++ b/v7/appcompat/res/values/styles.xml
@@ -201,6 +201,10 @@
 
     <style name="Widget.AppCompat.RatingBar" parent="Base.Widget.AppCompat.RatingBar" />
 
+    <style name="Widget.AppCompat.RatingBar.Indicator" parent="Base.Widget.AppCompat.RatingBar.Indicator" />
+
+    <style name="Widget.AppCompat.RatingBar.Small" parent="Base.Widget.AppCompat.RatingBar.Small" />
+
     <style name="Widget.AppCompat.Button" parent="Base.Widget.AppCompat.Button" />
 
     <style name="Widget.AppCompat.Button.Small" parent="Base.Widget.AppCompat.Button.Small" />
diff --git a/v7/appcompat/res/values/styles_base.xml b/v7/appcompat/res/values/styles_base.xml
index b119217..a0e24ed 100644
--- a/v7/appcompat/res/values/styles_base.xml
+++ b/v7/appcompat/res/values/styles_base.xml
@@ -300,8 +300,9 @@
         <item name="titleTextAppearance">@style/TextAppearance.Widget.AppCompat.Toolbar.Title</item>
         <item name="subtitleTextAppearance">@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle</item>
         <item name="android:minHeight">?attr/actionBarSize</item>
-        <item name="titleMargins">4dp</item>
+        <item name="titleMargin">4dp</item>
         <item name="maxButtonHeight">56dp</item>
+        <item name="buttonGravity">top</item>
         <item name="collapseIcon">?attr/homeAsUpIndicator</item>
         <item name="collapseContentDescription">@string/abc_toolbar_collapse_description</item>
         <item name="contentInsetStart">16dp</item>
@@ -395,6 +396,24 @@
         <item name="android:indeterminateDrawable">@drawable/abc_ratingbar_full_material</item>
     </style>
 
+    <style name="Base.Widget.AppCompat.RatingBar.Indicator" parent="android:Widget.RatingBar">
+        <item name="android:progressDrawable">@drawable/abc_ratingbar_indicator_material</item>
+        <item name="android:indeterminateDrawable">@drawable/abc_ratingbar_indicator_material</item>
+        <item name="android:minHeight">36dp</item>
+        <item name="android:maxHeight">36dp</item>
+        <item name="android:isIndicator">true</item>
+        <item name="android:thumb">@null</item>
+    </style>
+
+    <style name="Base.Widget.AppCompat.RatingBar.Small" parent="android:Widget.RatingBar">
+        <item name="android:progressDrawable">@drawable/abc_ratingbar_small_material</item>
+        <item name="android:indeterminateDrawable">@drawable/abc_ratingbar_small_material</item>
+        <item name="android:minHeight">16dp</item>
+        <item name="android:maxHeight">16dp</item>
+        <item name="android:isIndicator">true</item>
+        <item name="android:thumb">@null</item>
+    </style>
+
     <style name="Base.Widget.AppCompat.SeekBar" parent="android:Widget">
         <item name="android:indeterminateOnly">false</item>
         <item name="android:progressDrawable">@drawable/abc_seekbar_track_material</item>
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index f8e0ac6..38757df 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -231,6 +231,8 @@
         <item name="switchStyle">@style/Widget.AppCompat.CompoundButton.Switch</item>
 
         <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar</item>
+        <item name="ratingBarStyleIndicator">@style/Widget.AppCompat.RatingBar.Indicator</item>
+        <item name="ratingBarStyleSmall">@style/Widget.AppCompat.RatingBar.Small</item>
         <item name="seekBarStyle">@style/Widget.AppCompat.SeekBar</item>
 
         <!-- Button styles -->
@@ -386,6 +388,8 @@
         <item name="switchStyle">@style/Widget.AppCompat.CompoundButton.Switch</item>
 
         <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar</item>
+        <item name="ratingBarStyleIndicator">@style/Widget.AppCompat.RatingBar.Indicator</item>
+        <item name="ratingBarStyleSmall">@style/Widget.AppCompat.RatingBar.Small</item>
         <item name="seekBarStyle">@style/Widget.AppCompat.SeekBar</item>
 
         <!-- Button styles -->
diff --git a/v7/appcompat/res/values/themes_daynight.xml b/v7/appcompat/res/values/themes_daynight.xml
new file mode 100644
index 0000000..bc7001d
--- /dev/null
+++ b/v7/appcompat/res/values/themes_daynight.xml
@@ -0,0 +1,50 @@
+<?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>
+
+    <!-- Material theme (day/night vesion) for activities. -->
+    <style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat.Light" />
+
+    <!-- Variant of AppCompat.DayNight that has a solid (opaque) action bar
+         with an inverse color profile. The dark action bar sharply stands out against
+         the light content (when applicable).  -->
+    <style name="Theme.AppCompat.DayNight.DarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar" />
+
+    <!-- Variant of AppCompat.DayNight with no action bar.  -->
+    <style name="Theme.AppCompat.DayNight.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar" />
+
+    <!-- Material theme (day/night vesion) for dialog windows and activities,
+         which is used by the {@code android.support.v7.app.Dialog} class. This changes
+         the window to be floating (not fill the entire screen), and puts a
+         frame around its contents. You can set this theme on an activity if
+         you would like to make an activity that looks like a Dialog. -->
+    <style name="Theme.AppCompat.DayNight.Dialog" parent="Theme.AppCompat.Light.Dialog" />
+
+    <!-- Variant of Theme.AppCompat.DayNight.Dialog that has a nice minimum width for
+         a regular dialog. -->
+    <style name="Theme.AppCompat.DayNight.Dialog.MinWidth" parent="Theme.AppCompat.Light.Dialog.MinWidth" />
+
+    <!-- Theme for a window that will be displayed either full-screen on
+         smaller screens (small, normal) or as a dialog on larger screens
+         (large, xlarge). -->
+    <style name="Theme.AppCompat.DayNight.DialogWhenLarge" parent="Theme.AppCompat.Light.DialogWhenLarge" />
+
+    <!-- Material user theme for alert dialog windows, which is used by the
+         {@code android.support.v7.app.AlertDialog} class. -->
+    <style name="Theme.AppCompat.DayNight.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert" />
+
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
index 378c558..2ce12ce 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
@@ -62,6 +62,12 @@
     }
 
     @Override
+    public void setTheme(int resid) {
+        getDelegate().applyDayNight();
+        super.setTheme(resid);
+    }
+
+    @Override
     protected void onPostCreate(@Nullable Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
         getDelegate().onPostCreate(savedInstanceState);
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
index ef38511..79ca07f 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
@@ -76,6 +76,40 @@
     static final String TAG = "AppCompatDelegate";
 
     /**
+     * Mode which means to not use night mode, and therefore not use {@code night} qualified
+     * resources, regardless of the time.
+     *
+     * @see #setNightMode(int)
+     */
+    public static final int MODE_NIGHT_NO = 0;
+
+    /**
+     * Mode which means to always use night mode, and therefore use {@code night} qualified
+     * resources, regardless of the time.
+     *
+     * @see #setNightMode(int)
+     */
+    public static final int MODE_NIGHT_YES = 1;
+
+    /**
+     * Mode which means to use night mode when it is determined that it is night or not..
+     *
+     * <p>The calculation used to determine whether it is night or not makes use of the location
+     * APIs (if this app has the necessary permissions). This allows us to generate accurate
+     * sunrise and sunset times. If this app does not have permission to access the location APIs
+     * then we use hardcoded times which will be less accurate.</p>
+     *
+     * <p>This is the default mode.</p>
+     *
+     * @see #setNightMode(int)
+     */
+    public static final int MODE_NIGHT_AUTO = 2;
+
+    @IntDef({MODE_NIGHT_NO, MODE_NIGHT_YES, MODE_NIGHT_AUTO})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface NightMode {}
+
+    /**
      * Flag for enabling the support Action Bar.
      *
      * <p>This is enabled by default for some devices. The Action Bar replaces the title bar and
@@ -330,4 +364,31 @@
      */
     public abstract boolean isHandleNativeActionModesEnabled();
 
+    /**
+     * Allow AppCompat to apply the {@code night} and {@code notnight} resource qualifiers.
+     *
+     * <p>Doing this enables the
+     * {@link R.style#Theme_AppCompat_DayNight Theme.AppCompat.DayNight}
+     * family of themes to work, using the computed twilight to automatically select a dark or
+     * light theme.</p>
+     *
+     * <p>You can override the night mode using {@link #setNightMode(int)}.</p>
+     *
+     * <p>This only works on devices running
+     * {@link Build.VERSION_CODES#ICE_CREAM_SANDWICH ICE_CREAM_SANDWICH} and above.</p>
+     *
+     * @see #setNightMode(int)
+     */
+    public abstract void applyDayNight();
+
+    /**
+     * Override the night mode used when {@link #applyDayNight()} is called. This method only takes
+     * effect for those situtations where {@link #applyDayNight()} works.
+     *
+     * <p>This needs to be called before {@link #applyDayNight()}. Defaults to
+     * {@link #MODE_NIGHT_AUTO}.</p>
+     *
+     * @see #applyDayNight()
+     */
+    public abstract void setNightMode(@NightMode int mode);
 }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
index 394cf60..4eba34f 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
@@ -113,6 +113,11 @@
     abstract boolean onKeyShortcut(int keyCode, KeyEvent event);
 
     @Override
+    public void setNightMode(@NightMode int mode) {
+        // no-op
+    }
+
+    @Override
     public final ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() {
         return new ActionBarDrawableToggleImpl();
     }
@@ -189,6 +194,11 @@
         return false;
     }
 
+    @Override
+    public void applyDayNight() {
+        // no-op on v7
+    }
+
     final boolean isDestroyed() {
         return mIsDestroyed;
     }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java
index 35e7ca3..7d5b7d9 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java
@@ -16,15 +16,23 @@
 
 package android.support.v7.app;
 
+import android.app.UiModeManager;
 import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Build;
 import android.support.v7.view.SupportActionModeWrapper;
 import android.view.ActionMode;
 import android.view.Window;
 
 class AppCompatDelegateImplV14 extends AppCompatDelegateImplV11 {
 
+    private TwilightManager mTwilightManager;
     private boolean mHandleNativeActionModes = true; // defaults to true
 
+    @NightMode
+    private int mNightMode = MODE_NIGHT_AUTO;
+
     AppCompatDelegateImplV14(Context context, Window window, AppCompatCallback callback) {
         super(context, window, callback);
     }
@@ -46,6 +54,90 @@
         return mHandleNativeActionModes;
     }
 
+    @Override
+    public void applyDayNight() {
+        if (!isSystemControllingNightMode()) {
+            // If the system is not controlling night mode, let's do it ourselves
+            switch (mNightMode) {
+                case MODE_NIGHT_AUTO:
+                    // For auto, we need to check whether it's night or not
+                    setDayNightUsingTwilight();
+                    break;
+                default:
+                    // Else, we'll set the value directly
+                    setDayNightConfiguration(mNightMode);
+                    break;
+            }
+        }
+    }
+
+    @Override
+    public void setNightMode(@NightMode int mode) {
+        mNightMode = mode;
+    }
+
+    /**
+     * If possible, updates the Activity's {@link uiMode} to match whether we are at night or not.
+     */
+    void setDayNightUsingTwilight() {
+        // If the system isn't controlling night mode, we'll do it ourselves
+        if (getTwilightManager().isNight()) {
+            // If we're at 'night', set the night mode
+            setDayNightConfiguration(MODE_NIGHT_YES);
+        } else {
+            // Else, set the day mode
+            setDayNightConfiguration(MODE_NIGHT_NO);
+        }
+    }
+
+    /**
+     * Updates the {@link Resources} configuration {@code uiMode} with the
+     * chosen {@code UI_MODE_NIGHT} value.
+     */
+    void setDayNightConfiguration(@NightMode int mode) {
+        final Resources res = mContext.getResources();
+        final Configuration conf = res.getConfiguration();
+        final int currentNightMode = conf.uiMode & Configuration.UI_MODE_NIGHT_MASK;
+
+        int newNightMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
+        switch (mode) {
+            case MODE_NIGHT_NO:
+                newNightMode = Configuration.UI_MODE_NIGHT_NO;
+                break;
+            case MODE_NIGHT_YES:
+                newNightMode = Configuration.UI_MODE_NIGHT_YES;
+                break;
+        }
+
+        if (currentNightMode != newNightMode) {
+            conf.uiMode = (conf.uiMode & ~Configuration.UI_MODE_NIGHT_MASK) | newNightMode;
+            res.updateConfiguration(conf, res.getDisplayMetrics());
+        }
+    }
+
+    /**
+     * Returns true if the system is controlling night mode.
+     */
+    private boolean isSystemControllingNightMode() {
+        final UiModeManager uiModeManager =
+                (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
+
+        if (Build.VERSION.SDK_INT < 23
+                && uiModeManager.getCurrentModeType() != Configuration.UI_MODE_TYPE_CAR) {
+            // Night mode only has an effect with car mode enabled on < API v23
+            return false;
+        }
+
+        return uiModeManager.getNightMode() != UiModeManager.MODE_NIGHT_NO;
+    }
+
+    private TwilightManager getTwilightManager() {
+        if (mTwilightManager == null) {
+            mTwilightManager = new TwilightManager(mContext);
+        }
+        return mTwilightManager;
+    }
+
     class AppCompatWindowCallbackV14 extends AppCompatWindowCallbackBase {
         AppCompatWindowCallbackV14(Window.Callback callback) {
             super(callback);
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java
index 006827c..7b4c5ae 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java
@@ -57,4 +57,9 @@
             return null;
         }
     }
+
+    @Override
+    public void applyDayNight() {
+        // no-op. Let the framework handle DayNight stuff
+    }
 }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
index e147b7d..b9c7f52 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
@@ -931,9 +931,8 @@
             mAppCompatViewInflater = new AppCompatViewInflater();
         }
 
-        // We only want the View to inherit it's context if we're running pre-v21
-        final boolean inheritContext = isPre21 && mSubDecorInstalled
-                && shouldInheritContext((ViewParent) parent);
+        // We only want the View to inherit its context if we're running pre-v21
+        final boolean inheritContext = isPre21 && shouldInheritContext((ViewParent) parent);
 
         return mAppCompatViewInflater.createView(parent, name, context, attrs, inheritContext,
                 isPre21, /* Only read android:theme pre-L (L+ handles this anyway) */
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java b/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
index 11688e6..5f13992 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
@@ -46,6 +46,9 @@
         // To workaround this, we call onCreate(null) in the ctor, and then again as usual in
         // onCreate().
         getDelegate().onCreate(null);
+
+        // Apply AppCompat's DayNight resources if needed
+        getDelegate().applyDayNight();
     }
 
     protected AppCompatDialog(Context context, boolean cancelable,
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java b/v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java
index a74623e..79143f4 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java
@@ -62,6 +62,12 @@
             Context.class, AttributeSet.class};
     private static final int[] sOnClickAttrs = new int[]{android.R.attr.onClick};
 
+    private static final String[] sClassPrefixList = {
+            "android.widget.",
+            "android.view.",
+            "android.webkit."
+    };
+
     private static final String LOG_TAG = "AppCompatViewInflater";
 
     private static final Map<String, Constructor<? extends View>> sConstructorMap
@@ -153,8 +159,13 @@
             mConstructorArgs[1] = attrs;
 
             if (-1 == name.indexOf('.')) {
-                // try the android.widget prefix first...
-                return createView(context, name, "android.widget.");
+                for (int i = 0; i < sClassPrefixList.length; i++) {
+                    final View view = createView(context, name, sClassPrefixList[i]);
+                    if (view != null) {
+                        return view;
+                    }
+                }
+                return null;
             } else {
                 return createView(context, name, null);
             }
diff --git a/v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java b/v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java
index 0e50cc1..af0736a 100644
--- a/v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java
+++ b/v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java
@@ -17,6 +17,7 @@
 package android.support.v7.view;
 
 import android.content.Context;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.os.Build;
@@ -42,8 +43,34 @@
         mContext = context;
     }
 
+    /**
+     * Returns the maximum number of action buttons that should be permitted within an action
+     * bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
+     * "always" items can override this.
+     */
     public int getMaxActionButtons() {
-        return mContext.getResources().getInteger(R.integer.abc_max_action_buttons);
+        final Configuration config = mContext.getResources().getConfiguration();
+        final int width = config.screenWidthDp;
+        final int height = config.screenHeightDp;
+        final int smallest;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+            smallest = config.smallestScreenWidthDp;
+        } else {
+            smallest = 0;
+        }
+        if (smallest > 600 || width > 600 || (width > 960 && height > 720)
+                || (width > 720 && height > 960)) {
+            // For values-w600dp, values-sw600dp and values-xlarge.
+            return 5;
+        } else if (width >= 500 || (width > 640 && height > 480) || (width > 480 && height > 640)) {
+            // For values-w500dp and values-large.
+            return 4;
+        } else if (width >= 360) {
+            // For values-w360dp.
+            return 3;
+        } else {
+            return 2;
+        }
     }
 
     public boolean showsOverflowMenuButton() {
@@ -66,7 +93,11 @@
 
         // The embedded tabs policy changed in Jellybean; give older apps the old policy
         // so they get what they expect.
-        return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs_pre_jb);
+        final Configuration configuration = mContext.getResources().getConfiguration();
+        final int width = configuration.screenWidthDp;
+        final int height = configuration.screenHeightDp;
+        return configuration.orientation == Configuration.ORIENTATION_LANDSCAPE ||
+                width >= 480 || (width >= 640 && height >= 480);
     }
 
     public int getTabContainerHeight() {
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
index 0b80cf2..c03226c 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
@@ -71,8 +71,7 @@
     public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         final Resources res = context.getResources();
-        mAllowTextWithIcon = res.getBoolean(
-                R.bool.abc_config_allowActionMenuItemTextWithIcon);
+        mAllowTextWithIcon = shouldAllowTextWithIcon();
         TypedArray a = context.obtainStyledAttributes(attrs,
                 R.styleable.ActionMenuItemView, defStyle, 0);
         mMinWidth = a.getDimensionPixelSize(
@@ -93,11 +92,22 @@
             super.onConfigurationChanged(newConfig);
         }
 
-        mAllowTextWithIcon = getContext().getResources().getBoolean(
-                R.bool.abc_config_allowActionMenuItemTextWithIcon);
+        mAllowTextWithIcon = shouldAllowTextWithIcon();
         updateTextButtonVisibility();
     }
 
+    /**
+     * Whether action menu items should obey the "withText" showAsAction flag. This may be set to
+     * false for situations where space is extremely limited. -->
+     */
+    private boolean shouldAllowTextWithIcon() {
+        final Configuration configuration = getContext().getResources().getConfiguration();
+        final int width = configuration.screenWidthDp;
+        final int height = configuration.screenHeightDp;
+        return  width >= 480 || (width >= 640 && height >= 480)
+                || configuration.orientation == Configuration.ORIENTATION_LANDSCAPE;
+    }
+
     @Override
     public void setPadding(int l, int t, int r, int b) {
         mSavedPaddingLeft = l;
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java b/v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java
index e0e1a83..7f2a6b6 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java
@@ -132,8 +132,7 @@
 
     public void onConfigurationChanged(Configuration newConfig) {
         if (!mMaxItemsSet) {
-            mMaxItems = mContext.getResources().getInteger(
-                    R.integer.abc_max_action_buttons);
+            mMaxItems = ActionBarPolicy.get(mContext).getMaxActionButtons();
         }
         if (mMenu != null) {
             mMenu.onItemsChanged(true);
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
index 90d823c..4750792 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
@@ -17,7 +17,6 @@
 package android.support.v7.widget;
 
 import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.support.v4.view.ViewCompat;
@@ -40,7 +39,7 @@
     }
 
     void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
-        TypedArray a = mView.getContext().obtainStyledAttributes(attrs,
+        TintTypedArray a = TintTypedArray.obtainStyledAttributes(mView.getContext(), attrs,
                 R.styleable.ViewBackgroundHelper, defStyleAttr, 0);
         try {
             if (a.hasValue(R.styleable.ViewBackgroundHelper_android_background)) {
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatColorStateListInflater.java b/v7/appcompat/src/android/support/v7/widget/AppCompatColorStateListInflater.java
new file mode 100644
index 0000000..3024280
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatColorStateListInflater.java
@@ -0,0 +1,169 @@
+/*
+ * 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 org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.graphics.ColorUtils;
+import android.support.v7.appcompat.R;
+import android.util.AttributeSet;
+import android.util.StateSet;
+import android.util.Xml;
+
+import java.io.IOException;
+
+class AppCompatColorStateListInflater {
+
+    private static final int DEFAULT_COLOR = Color.RED;
+
+    /**
+     * Creates a ColorStateList from an XML document using given a set of
+     * {@link Resources} and a {@link Theme}.
+     *
+     * @param r Resources against which the ColorStateList should be inflated.
+     * @param parser Parser for the XML document defining the ColorStateList.
+     * @param theme Optional theme to apply to the color state list, may be
+     *              {@code null}.
+     * @return A new color state list.
+     */
+    @NonNull
+    public static ColorStateList createFromXml(@NonNull Resources r, @NonNull XmlPullParser parser,
+            @Nullable Resources.Theme theme) throws XmlPullParserException, IOException {
+        final AttributeSet attrs = Xml.asAttributeSet(parser);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG
+                && type != XmlPullParser.END_DOCUMENT) {
+            // Seek parser to start tag.
+        }
+
+        if (type != XmlPullParser.START_TAG) {
+            throw new XmlPullParserException("No start tag found");
+        }
+
+        return createFromXmlInner(r, parser, attrs, theme);
+    }
+
+    /**
+     * Create from inside an XML document. Called on a parser positioned at a
+     * tag in an XML document, tries to create a ColorStateList from that tag.
+     *
+     * @throws XmlPullParserException if the current tag is not &lt;selector>
+     * @return A new color state list for the current tag.
+     */
+    @NonNull
+    private static ColorStateList createFromXmlInner(@NonNull Resources r,
+            @NonNull XmlPullParser parser, @NonNull AttributeSet attrs,
+            @Nullable Resources.Theme theme)
+            throws XmlPullParserException, IOException {
+        final String name = parser.getName();
+        if (!name.equals("selector")) {
+            throw new XmlPullParserException(
+                    parser.getPositionDescription() + ": invalid color state list tag " + name);
+        }
+
+        return inflate(r, parser, attrs, theme);
+    }
+
+    /**
+     * Fill in this object based on the contents of an XML "selector" element.
+     */
+    private static ColorStateList inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
+            @NonNull AttributeSet attrs, @Nullable Resources.Theme theme)
+            throws XmlPullParserException, IOException {
+        final int innerDepth = parser.getDepth() + 1;
+        int depth;
+        int type;
+        int defaultColor = DEFAULT_COLOR;
+
+        int[][] stateSpecList = new int[20][];
+        int[] colorList = new int[stateSpecList.length];
+        int listSize = 0;
+
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && ((depth = parser.getDepth()) >= innerDepth || type != XmlPullParser.END_TAG)) {
+            if (type != XmlPullParser.START_TAG || depth > innerDepth
+                    || !parser.getName().equals("item")) {
+                continue;
+            }
+
+            final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.ColorStateListItem);
+            final int baseColor = a.getColor(R.styleable.ColorStateListItem_android_color,
+                    Color.MAGENTA);
+
+            float alphaMod = 1.0f;
+            if (a.hasValue(R.styleable.ColorStateListItem_android_alpha)) {
+                alphaMod = a.getFloat(R.styleable.ColorStateListItem_android_alpha, alphaMod);
+            } else if (a.hasValue(R.styleable.ColorStateListItem_alpha)) {
+                alphaMod = a.getFloat(R.styleable.ColorStateListItem_alpha, alphaMod);
+            }
+
+            a.recycle();
+
+            // Parse all unrecognized attributes as state specifiers.
+            int j = 0;
+            final int numAttrs = attrs.getAttributeCount();
+            int[] stateSpec = new int[numAttrs];
+            for (int i = 0; i < numAttrs; i++) {
+                final int stateResId = attrs.getAttributeNameResource(i);
+                if (stateResId != android.R.attr.color && stateResId != android.R.attr.alpha
+                        && stateResId != R.attr.alpha) {
+                    // Unrecognized attribute, add to state set
+                    stateSpec[j++] = attrs.getAttributeBooleanValue(i, false)
+                            ? stateResId : -stateResId;
+                }
+            }
+            stateSpec = StateSet.trimStateSet(stateSpec, j);
+
+            // Apply alpha modulation. If we couldn't resolve the color or
+            // alpha yet, the default values leave us enough information to
+            // modulate again during applyTheme().
+            final int color = modulateColorAlpha(baseColor, alphaMod);
+            if (listSize == 0 || stateSpec.length == 0) {
+                defaultColor = color;
+            }
+
+            colorList = GrowingArrayUtils.append(colorList, listSize, color);
+            stateSpecList = GrowingArrayUtils.append(stateSpecList, listSize, stateSpec);
+            listSize++;
+        }
+
+        int[] colors = new int[listSize];
+        int[][] stateSpecs = new int[listSize][];
+        System.arraycopy(colorList, 0, colors, 0, listSize);
+        System.arraycopy(stateSpecList, 0, stateSpecs, 0, listSize);
+
+        return new ColorStateList(stateSpecs, colors);
+    }
+
+    private static TypedArray obtainAttributes(Resources res, Resources.Theme theme,
+            AttributeSet set, int[] attrs) {
+        return theme == null ? res.obtainAttributes(set, attrs)
+                : theme.obtainStyledAttributes(set, attrs, 0, 0);
+    }
+
+    private static int modulateColorAlpha(int color, float alphaMod) {
+        return ColorUtils.setAlphaComponent(color, Math.round(Color.alpha(color) * alphaMod));
+    }
+}
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index 4fcaf13..e314821 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -41,6 +41,7 @@
 import java.util.ArrayList;
 import java.util.WeakHashMap;
 
+import static android.support.v7.widget.ColorStateListUtils.getColorStateList;
 import static android.support.v7.widget.ThemeUtils.getDisabledThemeAttrColor;
 import static android.support.v7.widget.ThemeUtils.getThemeAttrColor;
 import static android.support.v7.widget.ThemeUtils.getThemeAttrColorStateList;
@@ -208,6 +209,16 @@
                         getThemeAttrColor(context, R.attr.colorControlNormal), DEFAULT_MODE);
                 setPorterDuffColorFilter(ld.findDrawableByLayerId(android.R.id.progress),
                         getThemeAttrColor(context, R.attr.colorControlActivated), DEFAULT_MODE);
+            } else if (resId == R.drawable.abc_ratingbar_indicator_material
+                    || resId == R.drawable.abc_ratingbar_small_material) {
+                LayerDrawable ld = (LayerDrawable) drawable;
+                setPorterDuffColorFilter(ld.findDrawableByLayerId(android.R.id.background),
+                        getDisabledThemeAttrColor(context, R.attr.colorControlNormal),
+                        DEFAULT_MODE);
+                setPorterDuffColorFilter(ld.findDrawableByLayerId(android.R.id.secondaryProgress),
+                        getThemeAttrColor(context, R.attr.colorControlActivated), DEFAULT_MODE);
+                setPorterDuffColorFilter(ld.findDrawableByLayerId(android.R.id.progress),
+                        getThemeAttrColor(context, R.attr.colorControlActivated), DEFAULT_MODE);
             } else {
                 final boolean tinted = tintDrawableUsingColorFilter(context, resId, drawable);
                 if (!tinted && failIfNotKnown) {
@@ -301,11 +312,11 @@
         if (tint == null) {
             // ...if the cache did not contain a color state list, try and create one
             if (resId == R.drawable.abc_edit_text_material) {
-                tint = createEditTextColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_edittext);
             } else if (resId == R.drawable.abc_switch_track_mtrl_alpha) {
-                tint = createSwitchTrackColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_switch_track);
             } else if (resId == R.drawable.abc_switch_thumb_material) {
-                tint = createSwitchThumbColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_switch_thumb);
             } else if (resId == R.drawable.abc_btn_default_mtrl_shape
                     || resId == R.drawable.abc_btn_borderless_material) {
                 tint = createDefaultButtonColorStateList(context);
@@ -313,15 +324,15 @@
                 tint = createColoredButtonColorStateList(context);
             } else if (resId == R.drawable.abc_spinner_mtrl_am_alpha
                     || resId == R.drawable.abc_spinner_textfield_background_material) {
-                tint = createSpinnerColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_spinner);
             } else if (arrayContains(TINT_COLOR_CONTROL_NORMAL, resId)) {
                 tint = getThemeAttrColorStateList(context, R.attr.colorControlNormal);
             } else if (arrayContains(TINT_COLOR_CONTROL_STATE_LIST, resId)) {
-                tint = createDefaultColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_default);
             } else if (arrayContains(TINT_CHECKABLE_BUTTON_LIST, resId)) {
-                tint = createCheckableButtonColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_btn_checkable);
             } else if (resId == R.drawable.abc_seekbar_thumb_material) {
-                tint = createSeekbarThumbColorStateList(context);
+                tint = getColorStateList(context, R.color.abc_tint_seek_thumb);
             }
 
             if (tint != null) {
@@ -352,164 +363,6 @@
         themeTints.append(resId, tintList);
     }
 
-    private ColorStateList createDefaultColorStateList(Context context) {
-        /**
-         * Generate the default color state list which uses the colorControl attributes.
-         * Order is important here. The default enabled state needs to go at the bottom.
-         */
-
-        final int colorControlNormal = getThemeAttrColor(context, R.attr.colorControlNormal);
-        final int colorControlActivated = getThemeAttrColor(context, R.attr.colorControlActivated);
-
-        final int[][] states = new int[7][];
-        final int[] colors = new int[7];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        states[i] = ThemeUtils.FOCUSED_STATE_SET;
-        colors[i] = colorControlActivated;
-        i++;
-
-        states[i] = ThemeUtils.ACTIVATED_STATE_SET;
-        colors[i] = colorControlActivated;
-        i++;
-
-        states[i] = ThemeUtils.PRESSED_STATE_SET;
-        colors[i] = colorControlActivated;
-        i++;
-
-        states[i] = ThemeUtils.CHECKED_STATE_SET;
-        colors[i] = colorControlActivated;
-        i++;
-
-        states[i] = ThemeUtils.SELECTED_STATE_SET;
-        colors[i] = colorControlActivated;
-        i++;
-
-        // Default enabled state
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = colorControlNormal;
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private ColorStateList createCheckableButtonColorStateList(Context context) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        states[i] = ThemeUtils.CHECKED_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-        i++;
-
-        // Default enabled state
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private ColorStateList createSwitchTrackColorStateList(Context context) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.1f);
-        i++;
-
-        states[i] = ThemeUtils.CHECKED_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated, 0.3f);
-        i++;
-
-        // Default enabled state
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.3f);
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private ColorStateList createSwitchThumbColorStateList(Context context) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        final ColorStateList thumbColor = getThemeAttrColorStateList(context,
-                R.attr.colorSwitchThumbNormal);
-
-        if (thumbColor != null && thumbColor.isStateful()) {
-            // If colorSwitchThumbNormal is a valid ColorStateList, extract the default and
-            // disabled colors from it
-
-            // Disabled state
-            states[i] = ThemeUtils.DISABLED_STATE_SET;
-            colors[i] = thumbColor.getColorForState(states[i], 0);
-            i++;
-
-            states[i] = ThemeUtils.CHECKED_STATE_SET;
-            colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-            i++;
-
-            // Default enabled state
-            states[i] = ThemeUtils.EMPTY_STATE_SET;
-            colors[i] = thumbColor.getDefaultColor();
-            i++;
-        } else {
-            // Else we'll use an approximation using the default disabled alpha
-
-            // Disabled state
-            states[i] = ThemeUtils.DISABLED_STATE_SET;
-            colors[i] = getDisabledThemeAttrColor(context, R.attr.colorSwitchThumbNormal);
-            i++;
-
-            states[i] = ThemeUtils.CHECKED_STATE_SET;
-            colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-            i++;
-
-            // Default enabled state
-            states[i] = ThemeUtils.EMPTY_STATE_SET;
-            colors[i] = getThemeAttrColor(context, R.attr.colorSwitchThumbNormal);
-            i++;
-        }
-
-        return new ColorStateList(states, colors);
-    }
-
-    private ColorStateList createEditTextColorStateList(Context context) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        states[i] = ThemeUtils.NOT_PRESSED_OR_FOCUSED_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        // Default enabled state
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
     private ColorStateList createDefaultButtonColorStateList(Context context) {
         return createButtonColorStateList(context, R.attr.colorButtonNormal);
     }
@@ -547,44 +400,6 @@
         return new ColorStateList(states, colors);
     }
 
-    private ColorStateList createSpinnerColorStateList(Context context) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        states[i] = ThemeUtils.NOT_PRESSED_OR_FOCUSED_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlNormal);
-        i++;
-
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private ColorStateList createSeekbarThumbColorStateList(Context context) {
-        final int[][] states = new int[2][];
-        final int[] colors = new int[2];
-        int i = 0;
-
-        // Disabled state
-        states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorControlActivated);
-        i++;
-
-        states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated);
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
     private static class ColorFilterLruCache extends LruCache<Integer, PorterDuffColorFilter> {
 
         public ColorFilterLruCache(int maxSize) {
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java
index f6e5bae..89cc04d 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java
@@ -16,6 +16,7 @@
 
 package android.support.v7.widget;
 
+import android.graphics.drawable.Drawable;
 import android.support.v4.content.ContextCompat;
 import android.util.AttributeSet;
 import android.widget.ImageView;
@@ -36,8 +37,9 @@
         TintTypedArray a = TintTypedArray.obtainStyledAttributes(mView.getContext(), attrs,
                 VIEW_ATTRS, defStyleAttr, 0);
         try {
-            if (a.hasValue(0)) {
-                mView.setImageDrawable(a.getDrawable(0));
+            final Drawable d = a.getDrawableIfKnown(0);
+            if (d != null) {
+                mView.setImageDrawable(d);
             }
         } finally {
             a.recycle();
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java
index 209a6c2..eaa9cef 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java
@@ -96,7 +96,8 @@
             return newBg;
 
         } else if (drawable instanceof BitmapDrawable) {
-            final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap();
+            final BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
+            final Bitmap tileBitmap = bitmapDrawable.getBitmap();
             if (mSampleTile == null) {
                 mSampleTile = tileBitmap;
             }
@@ -105,6 +106,7 @@
             final BitmapShader bitmapShader = new BitmapShader(tileBitmap,
                     Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
             shapeDrawable.getPaint().setShader(bitmapShader);
+            shapeDrawable.getPaint().setColorFilter(bitmapDrawable.getPaint().getColorFilter());
             return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT,
                     ClipDrawable.HORIZONTAL) : shapeDrawable;
         }
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java
index d8e7784..e84bd0d 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java
@@ -129,6 +129,7 @@
             final TintInfo tintInfo = new TintInfo();
             tintInfo.mHasTintList = true;
             tintInfo.mTintList = tintList;
+            return tintInfo;
         }
         return null;
     }
diff --git a/v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java b/v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java
index 20fa89d..f24f282 100644
--- a/v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java
+++ b/v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java
@@ -30,6 +30,9 @@
  * @hide
  */
 public class ButtonBarLayout extends LinearLayout {
+    // Whether to allow vertically stacked button bars. This is disabled for
+    // configurations with a small (e.g. less than 320dp) screen height. -->
+    private static final int ALLOW_STACKING_MIN_HEIGHT_DP = 320;
 
     /** Whether the current configuration allows stacking. */
     private boolean mAllowStacking;
@@ -37,8 +40,12 @@
 
     public ButtonBarLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
+        final boolean allowStackingDefault =
+                context.getResources().getConfiguration().screenHeightDp
+                        >= ALLOW_STACKING_MIN_HEIGHT_DP;
         final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ButtonBarLayout);
-        mAllowStacking = ta.getBoolean(R.styleable.ButtonBarLayout_allowStacking, false);
+        mAllowStacking = ta.getBoolean(R.styleable.ButtonBarLayout_allowStacking,
+                allowStackingDefault);
         ta.recycle();
     }
 
@@ -107,4 +114,4 @@
     private boolean isStacked() {
         return getOrientation() == LinearLayout.VERTICAL;
     }
-}
\ No newline at end of file
+}
diff --git a/v7/appcompat/src/android/support/v7/widget/ColorStateListUtils.java b/v7/appcompat/src/android/support/v7/widget/ColorStateListUtils.java
new file mode 100644
index 0000000..d5ff6c9
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/widget/ColorStateListUtils.java
@@ -0,0 +1,93 @@
+/*
+ * 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 org.xmlpull.v1.XmlPullParser;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.os.Build;
+import android.support.annotation.ColorRes;
+import android.support.annotation.NonNull;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+import android.util.TypedValue;
+
+class ColorStateListUtils {
+
+    private static final String LOG_TAG = "ColorStateListUtils";
+    private static final ThreadLocal<TypedValue> TL_TYPED_VALUE = new ThreadLocal<>();
+
+    private ColorStateListUtils() {}
+
+    /**
+     * Returns the {@link ColorStateList} from the given resource. The resource can include
+     * themeable attributes.
+     */
+    static ColorStateList getColorStateList(@NonNull Context context, @ColorRes int resId) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            // On M+ we can use the framework
+            return context.getColorStateList(resId);
+        }
+        // Before that, we'll try and inflate it manually
+        final ColorStateList csl = inflateColorStateList(context, resId);
+        if (csl != null) {
+            return csl;
+        }
+        // If we reach here then we couldn't inflate it, so let the framework handle it
+        return ContextCompat.getColorStateList(context, resId);
+    }
+
+    /**
+     * Inflates a {@link ColorStateList} from resources, honouring theme attributes.
+     */
+    private static ColorStateList inflateColorStateList(Context context, int resId) {
+        if (isColorInt(context, resId)) {
+            // The resource is a color int, we can't handle it so return null
+            return null;
+        }
+
+        final Resources r = context.getResources();
+        final XmlPullParser xml = r.getXml(resId);
+        try {
+            return AppCompatColorStateListInflater.createFromXml(r, xml, context.getTheme());
+        } catch (Exception e) {
+            Log.e(LOG_TAG, "Failed to inflate ColorStateList, leaving it to the framework", e);
+        }
+        return null;
+    }
+
+    static boolean isColorInt(Context context, int resId) {
+        final Resources r = context.getResources();
+
+        final TypedValue value = getTypedValue();
+        r.getValue(resId, value, true);
+
+        return value.type >= TypedValue.TYPE_FIRST_COLOR_INT
+                && value.type <= TypedValue.TYPE_LAST_COLOR_INT;
+    }
+
+    private static TypedValue getTypedValue() {
+        TypedValue tv = TL_TYPED_VALUE.get();
+        if (tv == null) {
+            tv = new TypedValue();
+            TL_TYPED_VALUE.set(tv);
+        }
+        return tv;
+    }
+}
diff --git a/v7/appcompat/src/android/support/v7/widget/GrowingArrayUtils.java b/v7/appcompat/src/android/support/v7/widget/GrowingArrayUtils.java
new file mode 100644
index 0000000..1d97400
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/widget/GrowingArrayUtils.java
@@ -0,0 +1,194 @@
+/*
+ * 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 java.lang.reflect.Array;
+
+/**
+ * A helper class that aims to provide comparable growth performance to ArrayList, but on primitive
+ * arrays. Common array operations are implemented for efficient use in dynamic containers.
+ *
+ * All methods in this class assume that the length of an array is equivalent to its capacity and
+ * NOT the number of elements in the array. The current size of the array is always passed in as a
+ * parameter.
+ */
+class GrowingArrayUtils {
+
+    /**
+     * Appends an element to the end of the array, growing the array if there is no more room.
+     * @param array The array to which to append the element. This must NOT be null.
+     * @param currentSize The number of elements in the array. Must be less than or equal to
+     *                    array.length.
+     * @param element The element to append.
+     * @return the array to which the element was appended. This may be different than the given
+     *         array.
+     */
+    public static <T> T[] append(T[] array, int currentSize, T element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 > array.length) {
+            T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(),
+                    growSize(currentSize));
+            System.arraycopy(array, 0, newArray, 0, currentSize);
+            array = newArray;
+        }
+        array[currentSize] = element;
+        return array;
+    }
+
+    /**
+     * Primitive int version of {@link #append(Object[], int, Object)}.
+     */
+    public static int[] append(int[] array, int currentSize, int element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 > array.length) {
+            int[] newArray = new int[growSize(currentSize)];
+            System.arraycopy(array, 0, newArray, 0, currentSize);
+            array = newArray;
+        }
+        array[currentSize] = element;
+        return array;
+    }
+
+    /**
+     * Primitive long version of {@link #append(Object[], int, Object)}.
+     */
+    public static long[] append(long[] array, int currentSize, long element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 > array.length) {
+            long[] newArray = new long[growSize(currentSize)];
+            System.arraycopy(array, 0, newArray, 0, currentSize);
+            array = newArray;
+        }
+        array[currentSize] = element;
+        return array;
+    }
+
+    /**
+     * Primitive boolean version of {@link #append(Object[], int, Object)}.
+     */
+    public static boolean[] append(boolean[] array, int currentSize, boolean element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 > array.length) {
+            boolean[] newArray = new boolean[growSize(currentSize)];
+            System.arraycopy(array, 0, newArray, 0, currentSize);
+            array = newArray;
+        }
+        array[currentSize] = element;
+        return array;
+    }
+
+    /**
+     * Inserts an element into the array at the specified index, growing the array if there is no
+     * more room.
+     *
+     * @param array The array to which to append the element. Must NOT be null.
+     * @param currentSize The number of elements in the array. Must be less than or equal to
+     *                    array.length.
+     * @param element The element to insert.
+     * @return the array to which the element was appended. This may be different than the given
+     *         array.
+     */
+    public static <T> T[] insert(T[] array, int currentSize, int index, T element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 <= array.length) {
+            System.arraycopy(array, index, array, index + 1, currentSize - index);
+            array[index] = element;
+            return array;
+        }
+
+        T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(),
+                growSize(currentSize));
+        System.arraycopy(array, 0, newArray, 0, index);
+        newArray[index] = element;
+        System.arraycopy(array, index, newArray, index + 1, array.length - index);
+        return newArray;
+    }
+
+    /**
+     * Primitive int version of {@link #insert(Object[], int, int, Object)}.
+     */
+    public static int[] insert(int[] array, int currentSize, int index, int element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 <= array.length) {
+            System.arraycopy(array, index, array, index + 1, currentSize - index);
+            array[index] = element;
+            return array;
+        }
+
+        int[] newArray = new int[growSize(currentSize)];
+        System.arraycopy(array, 0, newArray, 0, index);
+        newArray[index] = element;
+        System.arraycopy(array, index, newArray, index + 1, array.length - index);
+        return newArray;
+    }
+
+    /**
+     * Primitive long version of {@link #insert(Object[], int, int, Object)}.
+     */
+    public static long[] insert(long[] array, int currentSize, int index, long element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 <= array.length) {
+            System.arraycopy(array, index, array, index + 1, currentSize - index);
+            array[index] = element;
+            return array;
+        }
+
+        long[] newArray = new long[growSize(currentSize)];
+        System.arraycopy(array, 0, newArray, 0, index);
+        newArray[index] = element;
+        System.arraycopy(array, index, newArray, index + 1, array.length - index);
+        return newArray;
+    }
+
+    /**
+     * Primitive boolean version of {@link #insert(Object[], int, int, Object)}.
+     */
+    public static boolean[] insert(boolean[] array, int currentSize, int index, boolean element) {
+        assert currentSize <= array.length;
+
+        if (currentSize + 1 <= array.length) {
+            System.arraycopy(array, index, array, index + 1, currentSize - index);
+            array[index] = element;
+            return array;
+        }
+
+        boolean[] newArray = new boolean[growSize(currentSize)];
+        System.arraycopy(array, 0, newArray, 0, index);
+        newArray[index] = element;
+        System.arraycopy(array, index, newArray, index + 1, array.length - index);
+        return newArray;
+    }
+
+    /**
+     * Given the current size of an array, returns an ideal size to which the array should grow.
+     * This is typically double the given size, but should not be relied upon to do so in the
+     * future.
+     */
+    public static int growSize(int currentSize) {
+        return currentSize <= 4 ? 8 : currentSize * 2;
+    }
+
+    // Uninstantiable
+    private GrowingArrayUtils() {}
+}
\ No newline at end of file
diff --git a/v7/appcompat/src/android/support/v7/widget/SearchView.java b/v7/appcompat/src/android/support/v7/widget/SearchView.java
index e4644d0..0b59400 100644
--- a/v7/appcompat/src/android/support/v7/widget/SearchView.java
+++ b/v7/appcompat/src/android/support/v7/widget/SearchView.java
@@ -48,7 +48,9 @@
 import android.text.TextWatcher;
 import android.text.style.ImageSpan;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -1648,6 +1650,14 @@
             mThreshold = getThreshold();
         }
 
+        @Override
+        protected void onFinishInflate() {
+            super.onFinishInflate();
+            DisplayMetrics metrics = getResources().getDisplayMetrics();
+            setMinWidth((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                    getSearchViewTextMinWidthDp(), metrics));
+        }
+
         void setSearchView(SearchView searchView) {
             mSearchView = searchView;
         }
@@ -1743,6 +1753,23 @@
             }
             return super.onKeyPreIme(keyCode, event);
         }
+
+        /**
+         * Get minimum width of the search view text entry area.
+         */
+        private int getSearchViewTextMinWidthDp() {
+            final Configuration configuration = getResources().getConfiguration();
+            final int width = configuration.screenWidthDp;
+            final int height = configuration.screenHeightDp;
+            final int orientation = configuration.orientation;
+            if (width >= 960 && height >= 720
+                    && orientation == Configuration.ORIENTATION_LANDSCAPE) {
+                return 256;
+            } else if (width >= 600 || (width >= 640 && height >= 480)) {
+                return 192;
+            };
+            return 160;
+        }
     }
 
     private static class AutoCompleteTextViewReflector {
@@ -1821,4 +1848,4 @@
             imm.showSoftInput(view, flags);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java b/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
index f87109b..800350c 100644
--- a/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
+++ b/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
@@ -1119,6 +1119,7 @@
             }
 
             cancelPositionAnimator();
+            setThumbPosition(isChecked() ? 1 : 0);
         }
     }
 
diff --git a/v7/appcompat/src/android/support/v7/widget/ThemeUtils.java b/v7/appcompat/src/android/support/v7/widget/ThemeUtils.java
index 1c0151b..02ee49a 100644
--- a/v7/appcompat/src/android/support/v7/widget/ThemeUtils.java
+++ b/v7/appcompat/src/android/support/v7/widget/ThemeUtils.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.support.v4.graphics.ColorUtils;
 import android.util.TypedValue;
@@ -61,7 +60,7 @@
 
     public static int getThemeAttrColor(Context context, int attr) {
         TEMP_ARRAY[0] = attr;
-        TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY);
+        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null, TEMP_ARRAY);
         try {
             return a.getColor(0, 0);
         } finally {
@@ -71,7 +70,7 @@
 
     public static ColorStateList getThemeAttrColorStateList(Context context, int attr) {
         TEMP_ARRAY[0] = attr;
-        TypedArray a = context.obtainStyledAttributes(null, TEMP_ARRAY);
+        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null, TEMP_ARRAY);
         try {
             return a.getColorStateList(0);
         } finally {
diff --git a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java b/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
index 50e1046..32749f3 100644
--- a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
+++ b/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
@@ -118,6 +118,16 @@
     }
 
     public ColorStateList getColorStateList(int index) {
+        if (mWrapped.hasValue(index)) {
+            final int resourceId = mWrapped.getResourceId(index, 0);
+            if (resourceId != 0) {
+                final ColorStateList value =
+                        ColorStateListUtils.getColorStateList(mContext, resourceId);
+                if (value != null) {
+                    return value;
+                }
+            }
+        }
         return mWrapped.getColorStateList(index);
     }
 
diff --git a/v7/appcompat/src/android/support/v7/widget/Toolbar.java b/v7/appcompat/src/android/support/v7/widget/Toolbar.java
index ca4d199..eae7722 100644
--- a/v7/appcompat/src/android/support/v7/widget/Toolbar.java
+++ b/v7/appcompat/src/android/support/v7/widget/Toolbar.java
@@ -105,6 +105,32 @@
  * <p>In modern Android UIs developers should lean more on a visually distinct color scheme for
  * toolbars than on their application icon. The use of application icon plus title as a standard
  * layout is discouraged on API 21 devices and newer.</p>
+ *
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_buttonGravity
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_collapseContentDescription
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_collapseIcon
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_contentInsetEnd
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_contentInsetLeft
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_contentInsetRight
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_contentInsetStart
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_android_gravity
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_logo
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_logoDescription
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_maxButtonHeight
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationContentDescription
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationIcon
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_popupTheme
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_subtitle
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_subtitleTextAppearance
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_subtitleTextColor
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_title
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMargin
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginBottom
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginEnd
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginStart
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginTop
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleTextAppearance
+ * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleTextColor
  */
 public class Toolbar extends ViewGroup {
     private static final String TAG = "Toolbar";
@@ -206,9 +232,15 @@
         mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0);
         mSubtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, 0);
         mGravity = a.getInteger(R.styleable.Toolbar_android_gravity, mGravity);
-        mButtonGravity = Gravity.TOP;
-        mTitleMarginStart = mTitleMarginEnd = mTitleMarginTop = mTitleMarginBottom =
-                a.getDimensionPixelOffset(R.styleable.Toolbar_titleMargins, 0);
+        mButtonGravity = a.getInteger(R.styleable.Toolbar_buttonGravity, Gravity.TOP);
+
+        // First read the correct attribute
+        int titleMargin = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMargin, 0);
+        if (a.hasValue(R.styleable.Toolbar_titleMargins)) {
+            // Now read the deprecated attribute, if it has a value
+            titleMargin = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMargins, titleMargin);
+        }
+        mTitleMarginStart = mTitleMarginEnd = mTitleMarginTop = mTitleMarginBottom = titleMargin;
 
         final int marginStart = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginStart, -1);
         if (marginStart >= 0) {
@@ -263,6 +295,7 @@
         if (!TextUtils.isEmpty(subtitle)) {
             setSubtitle(subtitle);
         }
+
         // Set the default context, since setPopupTheme() may be a no-op.
         mPopupContext = getContext();
         setPopupTheme(a.getResourceId(R.styleable.Toolbar_popupTheme, 0));
@@ -325,6 +358,116 @@
         return mPopupTheme;
     }
 
+    /**
+     * Sets the title margin.
+     *
+     * @param start the starting title margin in pixels
+     * @param top the top title margin in pixels
+     * @param end the ending title margin in pixels
+     * @param bottom the bottom title margin in pixels
+     * @see #getTitleMarginStart()
+     * @see #getTitleMarginTop()
+     * @see #getTitleMarginEnd()
+     * @see #getTitleMarginBottom()
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMargin
+     */
+    public void setTitleMargin(int start, int top, int end, int bottom) {
+        mTitleMarginStart = start;
+        mTitleMarginTop = top;
+        mTitleMarginEnd = end;
+        mTitleMarginBottom = bottom;
+
+        requestLayout();
+    }
+
+    /**
+     * @return the starting title margin in pixels
+     * @see #setTitleMarginStart(int)
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginStart
+     */
+    public int getTitleMarginStart() {
+        return mTitleMarginStart;
+    }
+
+    /**
+     * Sets the starting title margin in pixels.
+     *
+     * @param margin the starting title margin in pixels
+     * @see #getTitleMarginStart()
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginStart
+     */
+    public void setTitleMarginStart(int margin) {
+        mTitleMarginStart = margin;
+
+        requestLayout();
+    }
+
+    /**
+     * @return the top title margin in pixels
+     * @see #setTitleMarginTop(int)
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginTop
+     */
+    public int getTitleMarginTop() {
+        return mTitleMarginTop;
+    }
+
+    /**
+     * Sets the top title margin in pixels.
+     *
+     * @param margin the top title margin in pixels
+     * @see #getTitleMarginTop()
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginTop
+     */
+    public void setTitleMarginTop(int margin) {
+        mTitleMarginTop = margin;
+
+        requestLayout();
+    }
+
+    /**
+     * @return the ending title margin in pixels
+     * @see #setTitleMarginEnd(int)
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginEnd
+     */
+    public int getTitleMarginEnd() {
+        return mTitleMarginEnd;
+    }
+
+    /**
+     * Sets the ending title margin in pixels.
+     *
+     * @param margin the ending title margin in pixels
+     * @see #getTitleMarginEnd()
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginEnd
+     */
+    public void setTitleMarginEnd(int margin) {
+        mTitleMarginEnd = margin;
+
+        requestLayout();
+    }
+
+    /**
+     * @return the bottom title margin in pixels
+     * @see #setTitleMarginBottom(int)
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginBottom
+     */
+    public int getTitleMarginBottom() {
+        return mTitleMarginBottom;
+    }
+
+    /**
+     * Sets the bottom title margin in pixels.
+     *
+     * @param margin the bottom title margin in pixels
+     * @see #getTitleMarginBottom()
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_titleMarginBottom
+     */
+    public void setTitleMarginBottom(int margin) {
+        mTitleMarginBottom = margin;
+
+        requestLayout();
+    }
+
     public void onRtlPropertiesChanged(int layoutDirection) {
         if (Build.VERSION.SDK_INT >= 17) {
             super.onRtlPropertiesChanged(layoutDirection);
@@ -721,6 +864,8 @@
      * as screen readers or tooltips.
      *
      * @return The navigation button's content description
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationContentDescription
      */
     @Nullable
     public CharSequence getNavigationContentDescription() {
@@ -734,6 +879,8 @@
      *
      * @param resId Resource ID of a content description string to set, or 0 to
      *              clear the description
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationContentDescription
      */
     public void setNavigationContentDescription(@StringRes int resId) {
         setNavigationContentDescription(resId != 0 ? getContext().getText(resId) : null);
@@ -746,6 +893,8 @@
      *
      * @param description Content description to set, or <code>null</code> to
      *                    clear the content description
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationContentDescription
      */
     public void setNavigationContentDescription(@Nullable CharSequence description) {
         if (!TextUtils.isEmpty(description)) {
@@ -767,6 +916,8 @@
      * tooltips.</p>
      *
      * @param resId Resource ID of a drawable to set
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationIcon
      */
     public void setNavigationIcon(@DrawableRes int resId) {
         setNavigationIcon(mDrawableManager.getDrawable(getContext(), resId));
@@ -783,6 +934,8 @@
      * tooltips.</p>
      *
      * @param icon Drawable to set, may be null to clear the icon
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationIcon
      */
     public void setNavigationIcon(@Nullable Drawable icon) {
         if (icon != null) {
@@ -803,6 +956,8 @@
      * Return the current drawable used as the navigation icon.
      *
      * @return The navigation icon drawable
+     *
+     * @attr ref android.support.v7.appcompat.R.styleable#Toolbar_navigationIcon
      */
     @Nullable
     public Drawable getNavigationIcon() {
@@ -1820,6 +1975,9 @@
     public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {
         mActionMenuPresenterCallback = pcb;
         mMenuBuilderCallback = mcb;
+        if (mMenuView != null) {
+            mMenuView.setMenuCallbacks(pcb, mcb);
+        }
     }
 
     /**
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/tests/AndroidManifest.xml
index f33f28b..1ebffe7 100644
--- a/v7/appcompat/tests/AndroidManifest.xml
+++ b/v7/appcompat/tests/AndroidManifest.xml
@@ -1,25 +1,28 @@
 <?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.
+   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.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.appcompat.test">
 
-    <uses-sdk android:minSdkVersion="8"
-              tools:overrideLibrary="android.support.test"/>
+    <uses-sdk
+            android:minSdkVersion="7"
+            android:targetSdkVersion="23"
+            tools:overrideLibrary="android.support.test, android.support.test.espresso,
+                    android.support.test.espresso.idling"/>
 
     <application android:theme="@style/Theme.AppCompat">
         <uses-library android:name="android.test.runner"/>
@@ -32,6 +35,11 @@
                 android:name="android.support.v7.app.ToolbarActionBarActivity"
                 android:theme="@style/Theme.AppCompat.NoActionBar"/>
 
+        <activity
+                android:name="android.support.v7.app.DrawerLayoutActivity"
+                android:label="@string/drawer_layout_activity"
+                android:theme="@style/Theme.SampleDrawerLayout" />
+
     </application>
 
     <instrumentation
diff --git a/v7/appcompat/tests/NO_DOCS b/v7/appcompat/tests/NO_DOCS
new file mode 100644
index 0000000..0c81e4a
--- /dev/null
+++ b/v7/appcompat/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png b/v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..e54a3a4
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png b/v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..2343e5c
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png b/v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..749823d
--- /dev/null
+++ b/v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/layout/drawer_layout.xml b/v7/appcompat/tests/res/layout/drawer_layout.xml
new file mode 100644
index 0000000..7bed9df
--- /dev/null
+++ b/v7/appcompat/tests/res/layout/drawer_layout.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!--
+    A DrawerLayout is indended to be used as the top-level content view
+    using match_parent for both width and height to consume the full space available.
+-->
+<android.support.v7.custom.CustomDrawerLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/drawer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+    <!-- As the main content view, the view below consumes the entire
+         space available using match_parent in both dimensions. Note that
+         this child does not specify android:layout_gravity attribute. -->
+    <FrameLayout
+            android:id="@+id/content"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+        <!-- This will be set as the support action bar of the activity at runtime.
+             It needs to be a dynamic runtime call for correct vertical layering of
+             the drawer and the toolbar. -->
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+        <!-- Note layout_marginTop attribute with action bar height as the value.
+             This "pushes" down the main content so that it doesn't overlap with
+             the toolbar. -->
+        <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginTop="?attr/actionBarSize"
+                android:scrollbarStyle="outsideOverlay">
+            <TextView
+                    android:id="@+id/content_text"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:text="@string/drawer_layout_summary"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:padding="16dp"/>
+        </ScrollView>
+    </FrameLayout>
+
+    <!-- android:layout_gravity="start" tells DrawerLayout to treat
+         this as a sliding drawer on the starting side, which is
+         left for left-to-right locales. The drawer is given a fixed
+         width in dp and extends the full height of the container. A
+         solid background is used for contrast with the content view.
+         android:fitsSystemWindows="true" tells the system to have
+         DrawerLayout span the full height of the screen, including the
+         system status bar on Lollipop+ versions of the plaform. -->
+    <ListView
+            android:id="@+id/start_drawer"
+            android:layout_width="300dp"
+            android:layout_height="match_parent"
+            android:layout_gravity="start"
+            android:background="#ff333333"
+            android:fitsSystemWindows="true"/>
+</android.support.v7.custom.CustomDrawerLayout>
+
diff --git a/v7/appcompat/res/values-h320dp/bools.xml b/v7/appcompat/tests/res/values/colors.xml
similarity index 91%
rename from v7/appcompat/res/values-h320dp/bools.xml
rename to v7/appcompat/tests/res/values/colors.xml
index 5576c18..f243137 100644
--- a/v7/appcompat/res/values-h320dp/bools.xml
+++ b/v7/appcompat/tests/res/values/colors.xml
@@ -15,5 +15,5 @@
 -->
 
 <resources>
-    <bool name="abc_allow_stacked_button_bar">true</bool>
+    <color name="drawer_sample_metal_blue">#FF505080</color>
 </resources>
diff --git a/v7/appcompat/tests/res/values/strings.xml b/v7/appcompat/tests/res/values/strings.xml
new file mode 100644
index 0000000..b3e3551
--- /dev/null
+++ b/v7/appcompat/tests/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="drawer_layout_activity">Drawer layout</string>
+    <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the starting edge, which is left on left-to-right locales, with an edge swipe. You can tap the hamburger (three horizontal lines) icon at the starting side of the action bar to open the drawer as well.</string>
+    <string name="drawer_title">Navigation</string>
+    <string name="drawer_open">Open navigation drawer</string>
+    <string name="drawer_close">Close navigation drawer</string>
+</resources>
diff --git a/v7/appcompat/tests/res/values/styles.xml b/v7/appcompat/tests/res/values/styles.xml
new file mode 100644
index 0000000..ef74ad9
--- /dev/null
+++ b/v7/appcompat/tests/res/values/styles.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="Theme.SampleDrawerLayout" parent="@style/Theme.AppCompat.NoActionBar">
+        <!-- Tell SystemUI that our activity window will draw the background for the status bar. -->
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <!-- Set the status bar to be translucent black. -->
+        <item name="android:statusBarColor">#30000000</item>
+        <item name="windowActionModeOverlay">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+</resources>
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActions.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActions.java
new file mode 100755
index 0000000..4d2b1be
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActions.java
@@ -0,0 +1,84 @@
+/*
+ * 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.app;
+
+import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
+
+import android.support.test.espresso.UiController;
+import android.support.test.espresso.ViewAction;
+import android.support.v4.widget.DrawerLayout;
+import android.view.View;
+
+import org.hamcrest.Matcher;
+
+public class DrawerLayoutActions {
+    /**
+     * Opens the drawer.
+     */
+    public static ViewAction openDrawer(final int drawerEdgeGravity) {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isAssignableFrom(DrawerLayout.class);
+            }
+
+            @Override
+            public String getDescription() {
+                return "Opens the drawer";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                DrawerLayout drawerLayout = (DrawerLayout) view;
+                drawerLayout.openDrawer(drawerEdgeGravity);
+
+                // Wait for a full second to let the inner ViewDragHelper complete the operation
+                uiController.loopMainThreadForAtLeast(1000);
+            }
+        };
+    }
+
+    /**
+     * Closes the drawer.
+     */
+    public static ViewAction closeDrawer(final int drawerEdgeGravity) {
+        return new ViewAction() {
+            @Override
+            public Matcher<View> getConstraints() {
+                return isAssignableFrom(DrawerLayout.class);
+            }
+
+            @Override
+            public String getDescription() {
+                return "Closes the drawer";
+            }
+
+            @Override
+            public void perform(UiController uiController, View view) {
+                uiController.loopMainThreadUntilIdle();
+
+                DrawerLayout drawerLayout = (DrawerLayout) view;
+                drawerLayout.closeDrawer(drawerEdgeGravity);
+
+                // Wait for a full second to let the inner ViewDragHelper complete the operation
+                uiController.loopMainThreadForAtLeast(1000);
+            }
+        };
+    }
+}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
new file mode 100644
index 0000000..c304445
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
@@ -0,0 +1,168 @@
+/*
+ * 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.app;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.appcompat.test.R;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.testutils.Shakespeare;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+/**
+ * Test activity for testing various APIs and interactions for DrawerLayout. It follows
+ * a common usage of the DrawerLayout widget combined with Toolbar in the Android support library
+ * that respect the
+ * <a href="https://www.google.com/design/spec/patterns/navigation-drawer.html">Material design
+ * guidelines</a> for the drawer component.
+ */
+public class DrawerLayoutActivity extends BaseTestActivity {
+    private DrawerLayout mDrawerLayout;
+    private ListView mDrawer;
+    private TextView mContent;
+
+    private ActionBarDrawerToggle mDrawerToggle;
+    private Toolbar mToolbar;
+
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.drawer_layout;
+    }
+
+    @Override
+    protected void onContentViewSet() {
+        super.onContentViewSet();
+
+        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mDrawer = (ListView) findViewById(R.id.start_drawer);
+        mContent = (TextView) findViewById(R.id.content_text);
+
+        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+
+        // The drawer title must be set in order to announce state changes when
+        // accessibility is turned on. This is typically a simple description,
+        // e.g. "Navigation".
+        mDrawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.drawer_title));
+
+        mDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+                Shakespeare.TITLES));
+        mDrawer.setOnItemClickListener(new DrawerItemClickListener());
+
+        // Find the toolbar in our layout and set it as the support action bar on the activity.
+        // This is required to have the drawer slide "over" the toolbar.
+        mToolbar = (Toolbar) findViewById(R.id.toolbar);
+        mToolbar.setTitle(R.string.drawer_title);
+        setSupportActionBar(mToolbar);
+
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+        getSupportActionBar().setDisplayShowHomeEnabled(false);
+
+        // ActionBarDrawerToggle provides convenient helpers for tying together the
+        // prescribed interactions between a top-level sliding drawer and the action bar.
+        // Note that, as the Javadocs of ActionBarDrawerToggle constructors say, we are
+        // *not* using a constructor that gets a Toolbar since we're setting our toolbar
+        // dynamically at runtime. Furthermore, as the drawer is sliding over the toolbar,
+        // we are suppressing the morphing animation from hamburger to back arrow by
+        // calling super.onDrawerSlide with slideOffset=0.0f. In case your app only has
+        // top-level pages and doesn't need back arrow visuals at all, you can set up
+        // your activity theme to have attribute named "drawerArrowStyle" that points
+        // to an extension of Widget.AppCompat.DrawerArrowToggle that has its "spinBars"
+        // attribute set to false.
+        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+                R.string.drawer_open, R.string.drawer_close) {
+            @Override
+            public void onDrawerOpened(View drawerView) {
+                super.onDrawerOpened(drawerView);
+                super.onDrawerSlide(drawerView, 0.0f);
+            }
+
+            @Override
+            public void onDrawerSlide(View drawerView, float slideOffset) {
+                super.onDrawerSlide(drawerView, 0.0f);
+            }
+        };
+
+        mDrawerLayout.setDrawerListener(mDrawerToggle);
+
+        // Configure the background color fill of the system status bar (on supported platform
+        // versions) and the toolbar itself. We're using the same color, and android:statusBar
+        // from the theme makes the status bar slightly darker.
+        final int metalBlueColor = getResources().getColor(R.color.drawer_sample_metal_blue);
+        mDrawerLayout.setStatusBarBackgroundColor(metalBlueColor);
+        mToolbar.setBackgroundColor(metalBlueColor);
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+
+        // Sync the toggle state after onRestoreInstanceState has occurred.
+        mDrawerToggle.syncState();
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        /*
+         * The action bar home/up action should open or close the drawer.
+         * The drawer toggle will take care of this.
+         */
+        if (mDrawerToggle.onOptionsItemSelected(item)) {
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onBackPressed() {
+        // Is the drawer open?
+        if (mDrawerLayout.isDrawerOpen(mDrawer)) {
+            // Close the drawer and return.
+            mDrawerLayout.closeDrawer(mDrawer);
+            return;
+        }
+
+        super.onBackPressed();
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        mDrawerToggle.onConfigurationChanged(newConfig);
+    }
+
+    /**
+     * This list item click listener implements very simple view switching by changing
+     * the primary content text. The drawer is closed when a selection is made.
+     */
+    private class DrawerItemClickListener implements ListView.OnItemClickListener {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            mContent.setText(Shakespeare.DIALOGUE[position]);
+            mToolbar.setTitle(Shakespeare.TITLES[position]);
+            mDrawerLayout.closeDrawer(mDrawer);
+        }
+    }
+}
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
new file mode 100755
index 0000000..c5cc561
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.app;
+
+import android.content.res.Resources;
+import android.os.Build;
+import android.view.View;
+
+import android.support.test.espresso.action.Press;
+import android.support.test.espresso.action.GeneralLocation;
+import android.support.test.espresso.action.GeneralSwipeAction;
+import android.support.test.espresso.action.Swipe;
+
+import android.support.v4.view.GravityCompat;
+import android.support.v7.custom.CustomDrawerLayout;
+import android.support.v7.appcompat.test.R;
+
+import org.junit.Test;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+public class DrawerLayoutTest extends BaseInstrumentationTestCase<DrawerLayoutActivity> {
+    private CustomDrawerLayout mDrawerLayout;
+
+    private View mStartDrawer;
+
+    private View mContentView;
+
+    public DrawerLayoutTest() {
+        super(DrawerLayoutActivity.class);
+    }
+
+    public void setUp() throws Exception {
+        super.setUp();
+
+        final DrawerLayoutActivity activity = getActivity();
+        mDrawerLayout = (CustomDrawerLayout) activity.findViewById(R.id.drawer_layout);
+        mStartDrawer = mDrawerLayout.findViewById(R.id.start_drawer);
+        mContentView = mDrawerLayout.findViewById(R.id.content);
+
+        // Close the drawer to reset the state for the next test
+        onView(withId(R.id.drawer_layout)).perform(
+                DrawerLayoutActions.closeDrawer(GravityCompat.START));
+    }
+
+    @Test
+    public void testDrawerOpenCloseViaAPI() {
+        assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+        for (int i = 0; i < 5; i++) {
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.openDrawer(GravityCompat.START));
+            assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.closeDrawer(GravityCompat.START));
+            assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+        }
+    }
+
+    @Test
+    public void testDrawerOpenCloseWithRedundancyViaAPI() {
+        assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+        for (int i = 0; i < 5; i++) {
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.openDrawer(GravityCompat.START));
+            assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            // Try opening the drawer when it's already opened
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.openDrawer(GravityCompat.START));
+            assertTrue("Opened drawer is still opened #" + i,
+                    mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.closeDrawer(GravityCompat.START));
+            assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            // Try closing the drawer when it's already closed
+            onView(withId(R.id.drawer_layout)).perform(
+                    DrawerLayoutActions.closeDrawer(GravityCompat.START));
+            assertFalse("Closed drawer is still closed #" + i,
+                    mDrawerLayout.isDrawerOpen(GravityCompat.START));
+        }
+    }
+
+    @Test
+    public void testDrawerOpenCloseViaSwipes() {
+        assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+        for (int i = 0; i < 5; i++) {
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT,
+                            GeneralLocation.CENTER_RIGHT, Press.FINGER));
+            assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT,
+                            GeneralLocation.CENTER_LEFT, Press.FINGER));
+            assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+        }
+    }
+
+    @Test
+    public void testDrawerOpenCloseWithRedundancyViaSwipes() {
+        assertFalse("Initial state", mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+        for (int i = 0; i < 5; i++) {
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT,
+                            GeneralLocation.CENTER_RIGHT, Press.FINGER));
+            assertTrue("Opened drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            // Try opening the drawer when it's already opened
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT,
+                            GeneralLocation.CENTER_RIGHT, Press.FINGER));
+            assertTrue("Opened drawer is still opened #" + i,
+                    mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT,
+                            GeneralLocation.CENTER_LEFT, Press.FINGER));
+            assertFalse("Closed drawer #" + i, mDrawerLayout.isDrawerOpen(GravityCompat.START));
+
+            // Try closing the drawer when it's already closed
+            onView(withId(R.id.drawer_layout)).perform(
+                    new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT,
+                            GeneralLocation.CENTER_LEFT, Press.FINGER));
+            assertFalse("Closed drawer is still closed #" + i,
+                    mDrawerLayout.isDrawerOpen(GravityCompat.START));
+        }
+    }
+
+    @Test
+    public void testDrawerHeight() {
+        // Open the drawer so it becomes visible
+        onView(withId(R.id.drawer_layout)).perform(
+                DrawerLayoutActions.closeDrawer(GravityCompat.START));
+
+        final int drawerLayoutHeight = mDrawerLayout.getHeight();
+        final int startDrawerHeight = mStartDrawer.getHeight();
+        final int contentHeight = mContentView.getHeight();
+
+        // On all devices the height of the drawer layout and the drawer should be identical.
+        assertEquals("Drawer layout and drawer heights", drawerLayoutHeight, startDrawerHeight);
+
+        if (Build.VERSION.SDK_INT < 21) {
+            // On pre-L devices the content height should be the same as the drawer layout height.
+            assertEquals("Drawer layout and content heights on pre-L",
+                    drawerLayoutHeight, contentHeight);
+        } else {
+            // Our drawer layout is configured with android:fitsSystemWindows="true" which should be
+            // respected on L+ devices to extend the drawer layout into the system status bar.
+            // The start drawer is also configured with the same attribute so it should have the
+            // same height as the drawer layout. The main content does not have that attribute
+            // specified, so it should have its height reduced by the height of the system status
+            // bar.
+
+            // Get the system window top inset that was propagated to the top-level DrawerLayout
+            // during its layout.
+            int drawerTopInset = mDrawerLayout.getSystemWindowInsetTop();
+            assertTrue("Drawer top inset is positive on L+", drawerTopInset > 0);
+            assertEquals("Drawer layout and drawer heights on L+",
+                    drawerLayoutHeight - drawerTopInset, contentHeight);
+        }
+    }
+}
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java b/v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java
new file mode 100644
index 0000000..217ccbc
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java
@@ -0,0 +1,49 @@
+/*
+ * 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.custom;
+
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.WindowInsets;
+
+import android.support.v4.widget.DrawerLayout;
+
+public class CustomDrawerLayout extends DrawerLayout {
+    private int mSystemWindowInsetTop;
+
+    public CustomDrawerLayout(Context context) {
+        super(context);
+    }
+
+    public CustomDrawerLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
+        mSystemWindowInsetTop = insets.getSystemWindowInsetTop();
+        return super.dispatchApplyWindowInsets(insets);
+    }
+
+    public int getSystemWindowInsetTop() {
+        return mSystemWindowInsetTop;
+    }
+}
\ No newline at end of file
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java b/v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java
new file mode 100644
index 0000000..78d5252
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java
@@ -0,0 +1,239 @@
+/*
+ * 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.testutils;
+
+public final class Shakespeare {
+    /**
+     * Our data, part 1.
+     */
+    public static final String[] TITLES =
+    {
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear"
+    };
+
+    /**
+     * Our data, part 2.
+     */
+    public static final String[] DIALOGUE =
+    {
+            "So shaken as we are, so wan with care," +
+            "Find we a time for frighted peace to pant," +
+            "And breathe short-winded accents of new broils" +
+            "To be commenced in strands afar remote." +
+            "No more the thirsty entrance of this soil" +
+            "Shall daub her lips with her own children's blood;" +
+            "Nor more shall trenching war channel her fields," +
+            "Nor bruise her flowerets with the armed hoofs" +
+            "Of hostile paces: those opposed eyes," +
+            "Which, like the meteors of a troubled heaven," +
+            "All of one nature, of one substance bred," +
+            "Did lately meet in the intestine shock" +
+            "And furious close of civil butchery" +
+            "Shall now, in mutual well-beseeming ranks," +
+            "March all one way and be no more opposed" +
+            "Against acquaintance, kindred and allies:" +
+            "The edge of war, like an ill-sheathed knife," +
+            "No more shall cut his master. Therefore, friends," +
+            "As far as to the sepulchre of Christ," +
+            "Whose soldier now, under whose blessed cross" +
+            "We are impressed and engaged to fight," +
+            "Forthwith a power of English shall we levy;" +
+            "Whose arms were moulded in their mothers' womb" +
+            "To chase these pagans in those holy fields" +
+            "Over whose acres walk'd those blessed feet" +
+            "Which fourteen hundred years ago were nail'd" +
+            "For our advantage on the bitter cross." +
+            "But this our purpose now is twelve month old," +
+            "And bootless 'tis to tell you we will go:" +
+            "Therefore we meet not now. Then let me hear" +
+            "Of you, my gentle cousin Westmoreland," +
+            "What yesternight our council did decree" +
+            "In forwarding this dear expedience.",
+
+            "Hear him but reason in divinity," +
+            "And all-admiring with an inward wish" +
+            "You would desire the king were made a prelate:" +
+            "Hear him debate of commonwealth affairs," +
+            "You would say it hath been all in all his study:" +
+            "List his discourse of war, and you shall hear" +
+            "A fearful battle render'd you in music:" +
+            "Turn him to any cause of policy," +
+            "The Gordian knot of it he will unloose," +
+            "Familiar as his garter: that, when he speaks," +
+            "The air, a charter'd libertine, is still," +
+            "And the mute wonder lurketh in men's ears," +
+            "To steal his sweet and honey'd sentences;" +
+            "So that the art and practic part of life" +
+            "Must be the mistress to this theoric:" +
+            "Which is a wonder how his grace should glean it," +
+            "Since his addiction was to courses vain," +
+            "His companies unletter'd, rude and shallow," +
+            "His hours fill'd up with riots, banquets, sports," +
+            "And never noted in him any study," +
+            "Any retirement, any sequestration" +
+            "From open haunts and popularity.",
+
+            "I come no more to make you laugh: things now," +
+            "That bear a weighty and a serious brow," +
+            "Sad, high, and working, full of state and woe," +
+            "Such noble scenes as draw the eye to flow," +
+            "We now present. Those that can pity, here" +
+            "May, if they think it well, let fall a tear;" +
+            "The subject will deserve it. Such as give" +
+            "Their money out of hope they may believe," +
+            "May here find truth too. Those that come to see" +
+            "Only a show or two, and so agree" +
+            "The play may pass, if they be still and willing," +
+            "I'll undertake may see away their shilling" +
+            "Richly in two short hours. Only they" +
+            "That come to hear a merry bawdy play," +
+            "A noise of targets, or to see a fellow" +
+            "In a long motley coat guarded with yellow," +
+            "Will be deceived; for, gentle hearers, know," +
+            "To rank our chosen truth with such a show" +
+            "As fool and fight is, beside forfeiting" +
+            "Our own brains, and the opinion that we bring," +
+            "To make that only true we now intend," +
+            "Will leave us never an understanding friend." +
+            "Therefore, for goodness' sake, and as you are known" +
+            "The first and happiest hearers of the town," +
+            "Be sad, as we would make ye: think ye see" +
+            "The very persons of our noble story" +
+            "As they were living; think you see them great," +
+            "And follow'd with the general throng and sweat" +
+            "Of thousand friends; then in a moment, see" +
+            "How soon this mightiness meets misery:" +
+            "And, if you can be merry then, I'll say" +
+            "A man may weep upon his wedding-day.",
+
+            "First, heaven be the record to my speech!" +
+            "In the devotion of a subject's love," +
+            "Tendering the precious safety of my prince," +
+            "And free from other misbegotten hate," +
+            "Come I appellant to this princely presence." +
+            "Now, Thomas Mowbray, do I turn to thee," +
+            "And mark my greeting well; for what I speak" +
+            "My body shall make good upon this earth," +
+            "Or my divine soul answer it in heaven." +
+            "Thou art a traitor and a miscreant," +
+            "Too good to be so and too bad to live," +
+            "Since the more fair and crystal is the sky," +
+            "The uglier seem the clouds that in it fly." +
+            "Once more, the more to aggravate the note," +
+            "With a foul traitor's name stuff I thy throat;" +
+            "And wish, so please my sovereign, ere I move," +
+            "What my tongue speaks my right drawn sword may prove.",
+
+            "Now is the winter of our discontent" +
+            "Made glorious summer by this sun of York;" +
+            "And all the clouds that lour'd upon our house" +
+            "In the deep bosom of the ocean buried." +
+            "Now are our brows bound with victorious wreaths;" +
+            "Our bruised arms hung up for monuments;" +
+            "Our stern alarums changed to merry meetings," +
+            "Our dreadful marches to delightful measures." +
+            "Grim-visaged war hath smooth'd his wrinkled front;" +
+            "And now, instead of mounting barded steeds" +
+            "To fright the souls of fearful adversaries," +
+            "He capers nimbly in a lady's chamber" +
+            "To the lascivious pleasing of a lute." +
+            "But I, that am not shaped for sportive tricks," +
+            "Nor made to court an amorous looking-glass;" +
+            "I, that am rudely stamp'd, and want love's majesty" +
+            "To strut before a wanton ambling nymph;" +
+            "I, that am curtail'd of this fair proportion," +
+            "Cheated of feature by dissembling nature," +
+            "Deformed, unfinish'd, sent before my time" +
+            "Into this breathing world, scarce half made up," +
+            "And that so lamely and unfashionable" +
+            "That dogs bark at me as I halt by them;" +
+            "Why, I, in this weak piping time of peace," +
+            "Have no delight to pass away the time," +
+            "Unless to spy my shadow in the sun" +
+            "And descant on mine own deformity:" +
+            "And therefore, since I cannot prove a lover," +
+            "To entertain these fair well-spoken days," +
+            "I am determined to prove a villain" +
+            "And hate the idle pleasures of these days." +
+            "Plots have I laid, inductions dangerous," +
+            "By drunken prophecies, libels and dreams," +
+            "To set my brother Clarence and the king" +
+            "In deadly hate the one against the other:" +
+            "And if King Edward be as true and just" +
+            "As I am subtle, false and treacherous," +
+            "This day should Clarence closely be mew'd up," +
+            "About a prophecy, which says that 'G'" +
+            "Of Edward's heirs the murderer shall be." +
+            "Dive, thoughts, down to my soul: here" +
+            "Clarence comes.",
+
+            "To bait fish withal: if it will feed nothing else," +
+            "it will feed my revenge. He hath disgraced me, and" +
+            "hindered me half a million; laughed at my losses," +
+            "mocked at my gains, scorned my nation, thwarted my" +
+            "bargains, cooled my friends, heated mine" +
+            "enemies; and what's his reason? I am a Jew. Hath" +
+            "not a Jew eyes? hath not a Jew hands, organs," +
+            "dimensions, senses, affections, passions? fed with" +
+            "the same food, hurt with the same weapons, subject" +
+            "to the same diseases, healed by the same means," +
+            "warmed and cooled by the same winter and summer, as" +
+            "a Christian is? If you prick us, do we not bleed?" +
+            "if you tickle us, do we not laugh? if you poison" +
+            "us, do we not die? and if you wrong us, shall we not" +
+            "revenge? If we are like you in the rest, we will" +
+            "resemble you in that. If a Jew wrong a Christian," +
+            "what is his humility? Revenge. If a Christian" +
+            "wrong a Jew, what should his sufferance be by" +
+            "Christian example? Why, revenge. The villany you" +
+            "teach me, I will execute, and it shall go hard but I" +
+            "will better the instruction.",
+
+            "Virtue! a fig! 'tis in ourselves that we are thus" +
+            "or thus. Our bodies are our gardens, to the which" +
+            "our wills are gardeners: so that if we will plant" +
+            "nettles, or sow lettuce, set hyssop and weed up" +
+            "thyme, supply it with one gender of herbs, or" +
+            "distract it with many, either to have it sterile" +
+            "with idleness, or manured with industry, why, the" +
+            "power and corrigible authority of this lies in our" +
+            "wills. If the balance of our lives had not one" +
+            "scale of reason to poise another of sensuality, the" +
+            "blood and baseness of our natures would conduct us" +
+            "to most preposterous conclusions: but we have" +
+            "reason to cool our raging motions, our carnal" +
+            "stings, our unbitted lusts, whereof I take this that" +
+            "you call love to be a sect or scion.",
+
+            "Blow, winds, and crack your cheeks! rage! blow!" +
+            "You cataracts and hurricanoes, spout" +
+            "Till you have drench'd our steeples, drown'd the cocks!" +
+            "You sulphurous and thought-executing fires," +
+            "Vaunt-couriers to oak-cleaving thunderbolts," +
+            "Singe my white head! And thou, all-shaking thunder," +
+            "Smite flat the thick rotundity o' the world!" +
+            "Crack nature's moulds, an germens spill at once," +
+            "That make ingrateful man!"
+    };
+}
diff --git a/v7/cardview/api/23.1.1.txt b/v7/cardview/api/23.1.1.txt
new file mode 100644
index 0000000..bb62ed7
--- /dev/null
+++ b/v7/cardview/api/23.1.1.txt
@@ -0,0 +1,26 @@
+package android.support.v7.widget {
+
+  public class CardView extends android.widget.FrameLayout {
+    ctor public CardView(android.content.Context);
+    ctor public CardView(android.content.Context, android.util.AttributeSet);
+    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
+    method public float getCardElevation();
+    method public int getContentPaddingBottom();
+    method public int getContentPaddingLeft();
+    method public int getContentPaddingRight();
+    method public int getContentPaddingTop();
+    method public float getMaxCardElevation();
+    method public boolean getPreventCornerOverlap();
+    method public float getRadius();
+    method public boolean getUseCompatPadding();
+    method public void setCardBackgroundColor(int);
+    method public void setCardElevation(float);
+    method public void setContentPadding(int, int, int, int);
+    method public void setMaxCardElevation(float);
+    method public void setPreventCornerOverlap(boolean);
+    method public void setRadius(float);
+    method public void setUseCompatPadding(boolean);
+  }
+
+}
+
diff --git a/v7/cardview/res/values/colors.xml b/v7/cardview/res/values/colors.xml
index 3ed7087..df202d1 100644
--- a/v7/cardview/res/values/colors.xml
+++ b/v7/cardview/res/values/colors.xml
@@ -16,9 +16,9 @@
 
 <resources>
     <!-- Background color for light CardView. -->
-    <color name="cardview_light_background">#FFFAFAFA</color>
-	<!-- Background color for dark CardView. -->
-	<color name="cardview_dark_background">#FF202020</color>
+    <color name="cardview_light_background">#FFFFFFFF</color>
+    <!-- Background color for dark CardView. -->
+    <color name="cardview_dark_background">#FF424242</color>
     <!-- Shadow color for the first pixels around CardView. -->
     <color name="cardview_shadow_start_color">#37000000</color>
     <!-- Shadow color for the furthest pixels around CardView. -->
diff --git a/v7/gridlayout/api/23.1.1.txt b/v7/gridlayout/api/23.1.1.txt
new file mode 100644
index 0000000..baa25e2
--- /dev/null
+++ b/v7/gridlayout/api/23.1.1.txt
@@ -0,0 +1,74 @@
+package android.support.v7.widget {
+
+  public class GridLayout extends android.view.ViewGroup {
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayout(android.content.Context);
+    method public int getAlignmentMode();
+    method public int getColumnCount();
+    method public int getOrientation();
+    method public android.util.Printer getPrinter();
+    method public int getRowCount();
+    method public boolean getUseDefaultMargins();
+    method public boolean isColumnOrderPreserved();
+    method public boolean isRowOrderPreserved();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setAlignmentMode(int);
+    method public void setColumnCount(int);
+    method public void setColumnOrderPreserved(boolean);
+    method public void setOrientation(int);
+    method public void setPrinter(android.util.Printer);
+    method public void setRowCount(int);
+    method public void setRowOrderPreserved(boolean);
+    method public void setUseDefaultMargins(boolean);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int);
+    field public static final int ALIGN_BOUNDS = 0; // 0x0
+    field public static final int ALIGN_MARGINS = 1; // 0x1
+    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
+    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
+    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
+    field public static final android.support.v7.widget.GridLayout.Alignment END;
+    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
+    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
+    field public static final android.support.v7.widget.GridLayout.Alignment START;
+    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
+    field public static final int UNDEFINED = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class GridLayout.Alignment {
+  }
+
+  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
+    ctor public GridLayout.LayoutParams();
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    method public void setGravity(int);
+    field public android.support.v7.widget.GridLayout.Spec columnSpec;
+    field public android.support.v7.widget.GridLayout.Spec rowSpec;
+  }
+
+  public static class GridLayout.Spec {
+    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
+  }
+
+  public final deprecated class Space extends android.support.v4.widget.Space {
+    ctor public Space(android.content.Context);
+    ctor public Space(android.content.Context, android.util.AttributeSet);
+    ctor public Space(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/v7/mediarouter/api/23.1.1.txt b/v7/mediarouter/api/23.1.1.txt
new file mode 100644
index 0000000..69fc20e
--- /dev/null
+++ b/v7/mediarouter/api/23.1.1.txt
@@ -0,0 +1,694 @@
+package android.support.v7.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract void addTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, boolean);
+    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int);
+    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
+    method public boolean collapseActionView();
+    method public void dispatchMenuVisibilityChanged(boolean);
+    method public abstract android.view.View getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method public abstract int getNavigationItemCount();
+    method public abstract int getNavigationMode();
+    method public abstract int getSelectedNavigationIndex();
+    method public abstract android.support.v7.app.ActionBar.Tab getSelectedTab();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public abstract android.support.v7.app.ActionBar.Tab getTabAt(int);
+    method public abstract int getTabCount();
+    method public android.content.Context getThemedContext();
+    method public abstract java.lang.CharSequence getTitle();
+    method public abstract void hide();
+    method public boolean invalidateOptionsMenu();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method public boolean isTitleTruncated();
+    method public abstract android.support.v7.app.ActionBar.Tab newTab();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public boolean onKeyShortcut(int, android.view.KeyEvent);
+    method public boolean onMenuKeyEvent(android.view.KeyEvent);
+    method public boolean openOptionsMenu();
+    method public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract void removeTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract void removeTabAt(int);
+    method public abstract void selectTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setCustomView(android.view.View);
+    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
+    method public abstract void setCustomView(int);
+    method public void setDefaultDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(java.lang.CharSequence);
+    method public void setHomeActionContentDescription(int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable);
+    method public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
+    method public abstract void setLogo(int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable);
+    method public abstract void setNavigationMode(int);
+    method public abstract void setSelectedNavigationItem(int);
+    method public void setShowHideAnimationEnabled(boolean);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public void setWindowTitle(java.lang.CharSequence);
+    method public abstract void show();
+    method public android.support.v7.view.ActionMode startActionMode(android.support.v7.view.ActionMode.Callback);
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
+    field public int gravity;
+  }
+
+  public static abstract interface ActionBar.OnMenuVisibilityListener {
+    method public abstract void onMenuVisibilityChanged(boolean);
+  }
+
+  public static abstract interface ActionBar.OnNavigationListener {
+    method public abstract boolean onNavigationItemSelected(int, long);
+  }
+
+  public static abstract class ActionBar.Tab {
+    ctor public ActionBar.Tab();
+    method public abstract java.lang.CharSequence getContentDescription();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.graphics.drawable.Drawable getIcon();
+    method public abstract int getPosition();
+    method public abstract java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getText();
+    method public abstract void select();
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
+    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static abstract interface ActionBar.TabListener {
+    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+  }
+
+  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
+    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
+    method public void syncState();
+  }
+
+  public static abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.content.Context getActionBarThemedContext();
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract boolean isNavigationVisible();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.widget.Button getButton(int);
+    method public android.widget.ListView getListView();
+    method public void setButton(int, java.lang.CharSequence, android.os.Message);
+    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public void setCustomTitle(android.view.View);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIconAttribute(int);
+    method public void setMessage(java.lang.CharSequence);
+    method public void setView(android.view.View);
+    method public void setView(android.view.View, int, int, int, int);
+  }
+
+  public abstract interface AppCompatCallback {
+    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
+    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration);
+    method public abstract void onCreate(android.os.Bundle);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle);
+    method public abstract void onPostResume();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public abstract void setContentView(android.view.View);
+    method public abstract void setContentView(int);
+    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+  }
+
+  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public MediaRouteActionProvider(android.content.Context);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.view.View onCreateActionView();
+    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteButton extends android.view.View {
+    ctor public MediaRouteButton(android.content.Context);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+    method public boolean showDialog();
+  }
+
+  public class MediaRouteChooserDialog extends android.app.Dialog {
+    ctor public MediaRouteChooserDialog(android.content.Context);
+    ctor public MediaRouteChooserDialog(android.content.Context, int);
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
+    method public void refreshRoutes();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteChooserDialogFragment();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
+    ctor public MediaRouteControllerDialog(android.content.Context);
+    ctor public MediaRouteControllerDialog(android.content.Context, int);
+    method public android.view.View getMediaControlView();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
+    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
+    method public boolean isVolumeControlEnabled();
+    method public android.view.View onCreateMediaControlView(android.os.Bundle);
+    method public void setVolumeControlEnabled(boolean);
+  }
+
+  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteControllerDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
+  }
+
+  public class MediaRouteDialogFactory {
+    ctor public MediaRouteDialogFactory();
+    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
+    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
+  }
+
+  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
+    ctor public MediaRouteDiscoveryFragment();
+    method public android.support.v7.media.MediaRouter getMediaRouter();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
+    method public int onPrepareCallbackFlags();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+}
+
+package android.support.v7.media {
+
+  public final class MediaControlIntent {
+    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
+    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
+    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
+    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
+    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
+    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
+    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
+    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
+    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
+    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
+    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
+    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
+    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
+    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
+    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
+    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
+    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
+    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
+    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
+    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
+    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
+    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
+    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
+    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
+  }
+
+  public final class MediaItemMetadata {
+    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
+    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
+    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public final class MediaItemStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
+    method public long getContentDuration();
+    method public long getContentPosition();
+    method public android.os.Bundle getExtras();
+    method public int getPlaybackState();
+    method public long getTimestamp();
+    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
+    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
+    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
+    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
+    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
+    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
+    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
+    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
+    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
+    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
+  }
+
+  public static final class MediaItemStatus.Builder {
+    ctor public MediaItemStatus.Builder(int);
+    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
+    method public android.support.v7.media.MediaItemStatus build();
+    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
+    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
+  }
+
+  public final class MediaRouteDescriptor {
+    method public android.os.Bundle asBundle();
+    method public boolean canDisconnectAndKeepPlaying();
+    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public java.util.List<java.lang.String> getGroupMemberIds();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public int getPresentationDisplayId();
+    method public android.content.IntentSender getSettingsActivity();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public deprecated boolean isConnecting();
+    method public boolean isEnabled();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteDescriptor.Builder {
+    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
+    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberId(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberIds(java.util.Collection<java.lang.String>);
+    method public android.support.v7.media.MediaRouteDescriptor build();
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
+    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
+  }
+
+  public final class MediaRouteDiscoveryRequest {
+    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteSelector getSelector();
+    method public boolean isActiveScan();
+    method public boolean isValid();
+  }
+
+  public abstract class MediaRouteProvider {
+    ctor public MediaRouteProvider(android.content.Context);
+    method public final android.content.Context getContext();
+    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
+    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
+    method public final android.os.Handler getHandler();
+    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
+    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
+    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
+    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
+    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
+  }
+
+  public static abstract class MediaRouteProvider.Callback {
+    ctor public MediaRouteProvider.Callback();
+    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
+  }
+
+  public static final class MediaRouteProvider.ProviderMetadata {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+  }
+
+  public static abstract class MediaRouteProvider.RouteController {
+    ctor public MediaRouteProvider.RouteController();
+    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public void onRelease();
+    method public void onSelect();
+    method public void onSetVolume(int);
+    method public void onUnselect();
+    method public void onUnselect(int);
+    method public void onUpdateVolume(int);
+  }
+
+  public final class MediaRouteProviderDescriptor {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
+    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteProviderDescriptor.Builder {
+    ctor public MediaRouteProviderDescriptor.Builder();
+    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
+    method public android.support.v7.media.MediaRouteProviderDescriptor build();
+  }
+
+  public abstract class MediaRouteProviderService extends android.app.Service {
+    ctor public MediaRouteProviderService();
+    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
+  }
+
+  public final class MediaRouteSelector {
+    method public android.os.Bundle asBundle();
+    method public boolean contains(android.support.v7.media.MediaRouteSelector);
+    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
+    method public java.util.List<java.lang.String> getControlCategories();
+    method public boolean hasControlCategory(java.lang.String);
+    method public boolean isEmpty();
+    method public boolean isValid();
+    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
+    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
+  }
+
+  public static final class MediaRouteSelector.Builder {
+    ctor public MediaRouteSelector.Builder();
+    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
+    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector build();
+  }
+
+  public final class MediaRouter {
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
+    method public void addProvider(android.support.v7.media.MediaRouteProvider);
+    method public void addRemoteControlClient(java.lang.Object);
+    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
+    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
+    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
+    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
+    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
+    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
+    method public void removeRemoteControlClient(java.lang.Object);
+    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void setMediaSession(java.lang.Object);
+    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
+    method public void unselect(int);
+    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
+    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
+    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
+    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
+    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
+    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
+    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
+    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
+    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
+    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
+    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
+  }
+
+  public static abstract class MediaRouter.Callback {
+    ctor public MediaRouter.Callback();
+    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+  }
+
+  public static abstract class MediaRouter.ControlRequestCallback {
+    ctor public MediaRouter.ControlRequestCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onResult(android.os.Bundle);
+  }
+
+  public static final class MediaRouter.ProviderInfo {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+  }
+
+  public static class MediaRouter.RouteGroup extends android.support.v7.media.MediaRouter.RouteInfo {
+    method public android.support.v7.media.MediaRouter.RouteInfo getRouteAt(int);
+    method public int getRouteCount();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+  }
+
+  public static class MediaRouter.RouteInfo {
+    method public boolean canDisconnect();
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public android.view.Display getPresentationDisplay();
+    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
+    method public android.content.IntentSender getSettingsIntent();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public boolean isConnecting();
+    method public boolean isDefault();
+    method public boolean isEnabled();
+    method public boolean isSelected();
+    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
+    method public void requestSetVolume(int);
+    method public void requestUpdateVolume(int);
+    method public void select();
+    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public boolean supportsControlAction(java.lang.String, java.lang.String);
+    method public boolean supportsControlCategory(java.lang.String);
+    method public boolean supportsControlRequest(android.content.Intent);
+    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
+    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
+    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
+    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
+    field public static final int DEVICE_TYPE_TV = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
+    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
+    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
+    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
+  }
+
+  public final class MediaSessionStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public int getSessionState();
+    method public long getTimestamp();
+    method public boolean isQueuePaused();
+    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
+    field public static final int SESSION_STATE_ENDED = 1; // 0x1
+    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
+  }
+
+  public static final class MediaSessionStatus.Builder {
+    ctor public MediaSessionStatus.Builder(int);
+    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
+    method public android.support.v7.media.MediaSessionStatus build();
+    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
+    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
+    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
+  }
+
+  public class RemotePlaybackClient {
+    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public java.lang.String getSessionId();
+    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public boolean hasSession();
+    method public boolean isQueuingSupported();
+    method public boolean isRemotePlaybackSupported();
+    method public boolean isSessionManagementSupported();
+    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void release();
+    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void setSessionId(java.lang.String);
+    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
+    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+  }
+
+  public static abstract class RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ActionCallback();
+    method public void onError(java.lang.String, int, android.os.Bundle);
+  }
+
+  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ItemActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+  }
+
+  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.SessionActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+  public static abstract class RemotePlaybackClient.StatusCallback {
+    ctor public RemotePlaybackClient.StatusCallback();
+    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+    method public void onSessionChanged(java.lang.String);
+    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+}
+
diff --git a/v7/mediarouter/api/current.txt b/v7/mediarouter/api/current.txt
index 92bbbb3..c027380 100644
--- a/v7/mediarouter/api/current.txt
+++ b/v7/mediarouter/api/current.txt
@@ -182,6 +182,7 @@
 
   public abstract class AppCompatDelegate {
     method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public abstract void applyDayNight();
     method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
     method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
     method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
@@ -203,12 +204,16 @@
     method public abstract void setContentView(int);
     method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
     method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setNightMode(int);
     method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
     method public abstract void setTitle(java.lang.CharSequence);
     method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
     field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
     field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
     field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field public static final int MODE_NIGHT_AUTO = 2; // 0x2
+    field public static final int MODE_NIGHT_NO = 0; // 0x0
+    field public static final int MODE_NIGHT_YES = 1; // 0x1
   }
 
   public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_audiotrack.png b/v7/mediarouter/res/drawable-hdpi/ic_audiotrack.png
index 71db6b4..f17a78f 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_audiotrack.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_audiotrack.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png
index 0493c80..54cc095 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png
index fce1884..b332467 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_dark.png
index da91591..038e64a 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_disabled_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_disabled_light.png
index 74b2d16..887fde4 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_disabled_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_disabled_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_grey.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_grey.png
index f0960f8..4eb9f48 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_grey.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_light.png
index a74163a..e122cc9 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_off_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_off_light.png
index 6e02527..58c344a 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_off_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_off_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_0_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_0_light.png
index 26c6847..84c5a11 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_0_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_0_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_1_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_1_light.png
index 2fea78f..7fc993d 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_1_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_1_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_2_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_2_light.png
index 2071e8f..36adcd0 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_2_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_2_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_light.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_light.png
index 54a277e..086aefe 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_on_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_on_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_cast_white.png b/v7/mediarouter/res/drawable-hdpi/ic_cast_white.png
index 60d3915..d649ded 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_cast_white.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_cast_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_close_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_close_dark.png
index ceb1a1e..ce64334 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_close_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_close_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_play.png b/v7/mediarouter/res/drawable-hdpi/ic_media_play.png
index 8afcd7d..e925f23 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_play.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_play.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_disabled_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_disabled_mono_dark.png
index 5b103e9..8ad305d 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_disabled_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_disabled_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_off_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_off_mono_dark.png
index 0090701..5739df7 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_off_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_off_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_0_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_0_mono_dark.png
index 41eb0b7..ac699cf 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_0_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_0_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_1_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_1_mono_dark.png
index 49f14cb..372ab35 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_1_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_1_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_2_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_2_mono_dark.png
index 5dd6aea..3261626 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_2_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_2_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_mono_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_mono_dark.png
index 0d5ac5c..9fbc9b0 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_mono_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_route_on_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
index 547ef30..9bc4982 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_speaker_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_speaker_dark.png
index 0e1da44..723e455 100755
--- a/v7/mediarouter/res/drawable-hdpi/ic_speaker_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_speaker_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_speaker_group_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_speaker_group_dark.png
index b90bb2f..40c25a3 100755
--- a/v7/mediarouter/res/drawable-hdpi/ic_speaker_group_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_speaker_group_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_speaker_light.png b/v7/mediarouter/res/drawable-hdpi/ic_speaker_light.png
index e2c88be..846c109 100755
--- a/v7/mediarouter/res/drawable-hdpi/ic_speaker_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_speaker_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_tv_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_tv_dark.png
index d1335f6..33bf484 100755
--- a/v7/mediarouter/res/drawable-hdpi/ic_tv_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_tv_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_tv_light.png b/v7/mediarouter/res/drawable-hdpi/ic_tv_light.png
index 7330f56..c911b5c 100755
--- a/v7/mediarouter/res/drawable-hdpi/ic_tv_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_tv_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_audiotrack.png b/v7/mediarouter/res/drawable-mdpi/ic_audiotrack.png
index dc1200e..d384e80 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_audiotrack.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_audiotrack.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png
index ddc8789..ad35b5d 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png
index 27a8a71..1a06c4e 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_dark.png
index 1121562..f73554f 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_disabled_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_disabled_light.png
index ebb616c..4d790c6 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_disabled_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_disabled_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_grey.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_grey.png
index 35ffd60..ccbb772 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_grey.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_light.png
index 7e5a3b6..5e11489 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_off_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_off_light.png
index d6114dc..e24d586 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_off_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_off_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_0_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_0_light.png
index 76da308..3029695 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_0_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_0_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_1_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_1_light.png
index 25d3809..868c7f4 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_1_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_1_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_2_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_2_light.png
index 3d63b0d..269ee8e 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_2_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_2_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_light.png b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_light.png
index 20e7619..ca865f2 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_cast_on_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_cast_on_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_close_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_close_dark.png
index af7f828..dde307e 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_close_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_close_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_pause.png b/v7/mediarouter/res/drawable-mdpi/ic_media_pause.png
index 7149f56..67bfde2 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_pause.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_play.png b/v7/mediarouter/res/drawable-mdpi/ic_media_play.png
index a1cb5df..79632c8 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_play.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_disabled_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_disabled_mono_dark.png
index 01a0c50..4446ea4 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_disabled_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_disabled_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_off_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_off_mono_dark.png
index 8ec0cb1..c401dc0 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_off_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_off_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_0_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_0_mono_dark.png
index 7cb6dcc..5a9fea0 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_0_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_0_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_1_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_1_mono_dark.png
index 38ee9f6..d8d0b7b 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_1_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_1_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_2_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_2_mono_dark.png
index 91f1b4b..83a1b69 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_2_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_2_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_mono_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_mono_dark.png
index 6838f80..9f3d12e 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_mono_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_route_on_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
index a3c80e7..9cc777c 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_speaker_group_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_speaker_group_dark.png
index 4db7209..79c4093 100755
--- a/v7/mediarouter/res/drawable-mdpi/ic_speaker_group_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_speaker_group_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_tv_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_tv_dark.png
index 82358a9..32e2eca 100755
--- a/v7/mediarouter/res/drawable-mdpi/ic_tv_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_tv_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_tv_light.png b/v7/mediarouter/res/drawable-mdpi/ic_tv_light.png
index ba3f3d5..8134310 100755
--- a/v7/mediarouter/res/drawable-mdpi/ic_tv_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_tv_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png
index c57b9d6..1dae357 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png
index 920f5ca..14d2ebc 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_dark.png
index e9a2a6f..5295088 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_disabled_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_disabled_light.png
index 88978ff..b14617c 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_disabled_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_disabled_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_grey.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_grey.png
index dba8992..2238d58 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_grey.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_light.png
index 30f413d..8617163 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_off_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_off_light.png
index 4479d12..a05d7d7 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_off_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_off_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_0_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_0_light.png
index 9f9b6d2..2cf94ce 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_0_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_0_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_1_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_1_light.png
index 441b943..0af22be 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_1_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_1_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_2_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_2_light.png
index d8e59e6..9577e7b 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_2_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_2_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_light.png
index e20a895..abdecfb 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_on_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_cast_white.png b/v7/mediarouter/res/drawable-xhdpi/ic_cast_white.png
index f5f7c14..63c2717 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_cast_white.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_cast_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_close_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_close_dark.png
index b7c7ffd..e13f963 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_close_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_close_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_pause.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_pause.png
index 90b6543..bad6782 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_pause.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_pause.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_play.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_play.png
index f615361..b49c4bd 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_play.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_play.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_disabled_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_disabled_mono_dark.png
index 8882965..c4dc132 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_disabled_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_disabled_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_off_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_off_mono_dark.png
index 3f8b212..bb30773 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_off_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_off_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_0_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_0_mono_dark.png
index ab1b6ea..8690cf4 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_0_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_0_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_1_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_1_mono_dark.png
index daa1310..e3fd200 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_1_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_1_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_2_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_2_mono_dark.png
index 7143236..6cb970c 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_2_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_2_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_mono_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_mono_dark.png
index 6cfe6fb..8290b98 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_route_on_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_dark.png
index 8f8a552..e40349d 100755
--- a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_dark.png
index 6227ca2..f67c463 100755
--- a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_light.png
index 82599f5..7fcebf5 100755
--- a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_group_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_light.png
index 74f9f6d..d6c3811 100755
--- a/v7/mediarouter/res/drawable-xhdpi/ic_speaker_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_speaker_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_tv_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_tv_dark.png
index cef8ac5..3808351 100755
--- a/v7/mediarouter/res/drawable-xhdpi/ic_tv_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_tv_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack.png b/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack.png
index 0546539..f131e1b 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack_light.png
index 8e38265..e5946a2 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_audiotrack_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png
index 8e9aa70..4e43a60 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png
index 860c758..e00699d 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_dark.png
index 616bd2e..1e247f1 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_disabled_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_disabled_light.png
index ad30027..9ce7e3a 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_disabled_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_disabled_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_grey.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_grey.png
index 7582751..792fd77 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_grey.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_light.png
index d30d4cf..178ebdc 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_off_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_off_light.png
index 9fd15ba..34928d7 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_off_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_off_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_0_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_0_light.png
index 95ace86..ef5039c 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_0_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_0_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_1_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_1_light.png
index ba85bea..8cd82da 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_1_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_1_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_2_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_2_light.png
index 8c448fa..d25288d 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_2_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_2_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_light.png
index 7e93e4d..4b64a48 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_on_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_white.png b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_white.png
index 7a7673f..463bbd2 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_cast_white.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_cast_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_close_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_close_dark.png
index 6b717e0..b85e87f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_close_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_close_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_pause.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_pause.png
index 6391830..347141f 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_pause.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_pause.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_disabled_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_disabled_mono_dark.png
index 185ba25..fdb2121 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_disabled_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_disabled_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_off_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_off_mono_dark.png
index 3fa0ee6..e8601ce 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_off_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_off_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_0_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_0_mono_dark.png
index d21b07b..23d8ba8 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_0_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_0_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_1_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_1_mono_dark.png
index 063709e..4c0f0e0 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_1_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_1_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_2_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_2_mono_dark.png
index 9f928ed..ecfe346 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_2_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_2_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_mono_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_mono_dark.png
index 4355e79..8e47095 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_mono_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_route_on_mono_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
index 1c57756..eda3ba5 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_dark.png
index 874c961..f171a8c 100755
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_dark.png
index 6869bdc..c8cb6ca 100755
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_light.png
index 35de6f4..9c8863d 100755
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_group_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_light.png
index 65ee187..9335038 100755
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_speaker_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_grey.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_grey.png
index d124cb8..04a9525 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_grey.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_white.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_white.png
index bb3539c..a95215a 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_white.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_cast_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00000.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00000.png
index 16e4cbc..b562dd2 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00000.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00000.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00001.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00001.png
index 6cc54b6..7025d19 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00001.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00001.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00002.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00002.png
index ae4f8fb..e8577da 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00002.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00002.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00003.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00003.png
index cd3ffdb..b1707b5 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00003.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00003.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00004.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00004.png
index 2285ec7..c4e4c11 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00004.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00004.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00005.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00005.png
index 8130cb1..6ca2891 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00005.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00005.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00006.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00006.png
index 4369a3d..0a28767 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00006.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00006.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00007.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00007.png
index 301e6c7..d69b20f 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00007.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00007.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00008.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00008.png
index 442cc82..cddaca1 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00008.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00008.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00009.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00009.png
index 78763f6..14ea746 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00009.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00009.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00010.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00010.png
index 1ea59a8..2cb6314 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00010.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00010.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00011.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00011.png
index 77ea83a..a2f4ad5 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00011.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00011.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00012.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00012.png
index 4e742f5..c0d54ad 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00012.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00012.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00013.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00013.png
index fa49b62..b99324e 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00013.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00013.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00014.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00014.png
index dc477a2..c8618f0 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00014.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00014.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00015.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00015.png
index dd85400..b1ceb20 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00015.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_collapse_00015.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00000.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00000.png
index dd85400..b1ceb20 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00000.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00000.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00001.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00001.png
index 2586aa0..36187bc 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00001.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00001.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00002.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00002.png
index 4022000..82b5f03 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00002.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00002.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00003.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00003.png
index 358b428..e3f7189 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00003.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00003.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00004.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00004.png
index 1da8c49..078466e 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00004.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00004.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00005.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00005.png
index 342d6c7..aa96ac7 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00005.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00005.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00006.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00006.png
index 738bddd..218ec27 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00006.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00006.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00007.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00007.png
index 48192c4..95fa72b 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00007.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00007.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00008.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00008.png
index ff1a374..44cab36 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00008.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00008.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00009.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00009.png
index c13afcd..8ecf591 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00009.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00009.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00010.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00010.png
index dde5939..c2b5f79 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00010.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00010.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00011.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00011.png
index 5c60a08..a468c21 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00011.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00011.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00012.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00012.png
index 5d75964..280c0e4 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00012.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00012.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00013.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00013.png
index cf1c1cd..bf5921e 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00013.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00013.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00014.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00014.png
index 12ccc03..14b76b1 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00014.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00014.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00015.png b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00015.png
index 16e4cbc..b562dd2 100644
--- a/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00015.png
+++ b/v7/mediarouter/res/drawable-xxxhdpi/ic_expand_00015.png
Binary files differ
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 891e66d..024a99c 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Saai uit"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Koppel aan toestel"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Soek tans vir toestelle…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ontkoppel"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Hou op uitsaai"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Roete-instellings"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Speel"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Laat wag"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knoppie"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Hou op uitsaai"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Maak toe"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Speel"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 9d9a90d..4456b45 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ውሰድ"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ከመሳሪያ ጋር ያገናኙ"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"መሳሪያዎችን በመፈለግ ላይ…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ግንኙነት አቋርጥ"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"መውሰድ አቁም"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"የመንገድ ቅንብሮች"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"አጫውት"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ለአፍታ አቁም"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"የCast አዝራር"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Cast ማድረግ አቁም"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ዝጋ"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"አጫውት"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index c0c5a25..7222590 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"إرسال"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"الاتصال بجهاز"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"جارٍ البحث عن الأجهزة…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع الاتصال"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"إيقاف الإرسال"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"إعدادات المسار"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"تشغيل"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"إيقاف مؤقت"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"زر الإرسال"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"إيقاف الإرسال"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"إغلاق"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"تشغيل"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أية وسائط"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أية معلومات"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-az-rAZ/strings.xml b/v7/mediarouter/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..aa3a70f
--- /dev/null
+++ b/v7/mediarouter/res/values-az-rAZ/strings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Yayım düyməsi"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Bura yayımlayın"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar axtarılır"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantını kəsin"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Yayımı dayandırın"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Qapadın"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Oynadın"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Durdurun"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişləndirin"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yığcamlaşdırın"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Heç bir media seçilməyib"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Əlçatan məlumat yoxdur"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayımlanır"</string>
+</resources>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index 93676ed..de49179 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Предаване"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Свързване с устройство"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Търсят се устройства…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекратяване на връзката"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Спиране на предаването"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки за маршрута"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Пускане"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Поставяне на пауза"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Бутон за предаване"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Спиране на предаването"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Затваряне"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Пускане"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index ee08f48..7eb5301 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"কাস্ট করুন"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ডিভাইসে সংযোগ করুন"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ডিভাইসগুলি অনুসন্ধান করা হচ্ছে…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"সংযোগ বিচ্ছিন্ন করুন"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"কাস্ট করা বন্ধ করুন"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"সেটিংস রুট করুন"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"চালান"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"বিরাম দিন"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"কাস্ট করার বোতাম"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"কাস্ট করা বন্ধ করুন"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"বন্ধ করুন"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"চালান"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"প্রসারিত করুন"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index ce4c180..ab8809a 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Emet"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connecta al dispositiu"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"S\'estan cercant dispositius…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconnecta"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Atura l\'emissió"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuració de la ruta"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reprodueix"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Posa en pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botó d\'emetre"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Atura l\'emissió"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Tanca"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reprodueix"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index c17629a..57c1594 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Odeslat"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Připojení k zařízení"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Vyhledávání zařízení…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojit"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Ukončit odesílání"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavení trasy"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Přehrát"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastavit"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačítko odesílání"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Zastavit odesílání"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavřít"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Přehrát"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index 786cdc6..eb6c8fa 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Opret forbindelse til enheden"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Søger efter enheder..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Afbryd forbindelsen"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop med at caste"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteindstillinger"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Afspil"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Sæt på pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knap"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop med at caste"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Luk"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Afspil"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Der er ikke valgt nogen medier"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 296b611..17a84af 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Übertragen"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Mit Gerät verbinden"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Geräte werden gesucht…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbindung aufheben"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Übertragung stoppen"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Routingeinstellungen"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Wiedergabe"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-Symbol"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Streaming stoppen"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Schließen"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Wiedergeben"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
 </resources>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 153ad7b..9258296 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Μετάδοση"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Σύνδεση με τη συσκευή"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Αναζήτηση συσκευών…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Αποσύνδεση"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Διακοπή μετάδοσης"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ρυθμίσεις διαδρομής"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Αναπαραγωγή"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Παύση"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Κουμπί Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Διακοπή μετάδοσης"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Κλείσιμο"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Αναπαραγωγή"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index 1cb9d4a..5edd79b 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index 1cb9d4a..5edd79b 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index 1cb9d4a..5edd79b 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index 7d3b402..b0a0a61 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar al dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Detener transmisión"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración de ruta"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botón para transmitir"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Detener la transmisión"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index d80e303..3a1eaeb 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Enviar contenido"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar a dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Dejar de enviar contenido"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ajustes de ruta"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de enviar"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Dejar de enviar contenido"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index e458335..9058dcf 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Ülekandmine"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Seadmega ühendamine"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Seadmete otsimine …"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkesta ühendus"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Lõpeta ülekanne"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Marsruudi seaded"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Esitamine"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Peatamine"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Ülekandenupp"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Peata ülekanne"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulgemine"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Esitamine"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index 899be28..ad85c5a 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Igorri"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Konektatu gailura"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Gailuak bilatzen…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Deskonektatu"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Utzi igortzeari"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ibilbidearen ezarpenak"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Erreproduzitu"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausatu"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Igorri botoia"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Utzi igortzeari"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Itxi"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Erreproduzitu"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index 76dcec6..2c812ae 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاه‌ها"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"فرستادن"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"برقراری ارتباط با دستگاه"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"در حال جستجو برای دستگاه‌ها..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع ارتباط"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"توقف فرستادن"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"تنظیمات مسیر"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"پخش"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"توقف موقت"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"دکمه ارسال محتوا"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاه‌ها"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"توقف ارسال محتوا"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"بستن"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"پخش"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"مکث"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات دردسترس نیست"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index 44c8b64..a93d74e 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Lähetä"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Yhdistä laitteeseen"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Etsitään laitteita…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkaise yhteys"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Lopeta suoratoisto"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Reitin asetukset"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Toista"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Keskeytä"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-painike"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Lopeta suoratoisto"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulje"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Toista"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index 6f385ff..f0c6976 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Diffuser"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connexion au périphérique"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Suspendre"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Bouton Diffuser"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter la diffusion"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Lire"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 711ccd3..6e14ccc 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Caster"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connecter à l\'appareil"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Icône Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter de diffuser"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Lecture"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index 61bc1e2..fb76c68 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Emitir"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar co dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Parar de emitir"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración da ruta"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduce"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de emitir"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Parar de emitir"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Pechar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproduce"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-gu-rIN/strings.xml b/v7/mediarouter/res/values-gu-rIN/strings.xml
index 2fd0f36..211f836 100644
--- a/v7/mediarouter/res/values-gu-rIN/strings.xml
+++ b/v7/mediarouter/res/values-gu-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"સિસ્ટમ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ઉપકરણો"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"કાસ્ટ કરો"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ઉપકરણ સાથે કનેક્ટ કરો"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ઉપકરણો માટે શોધી રહ્યું છે…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ડિસ્કનેક્ટ કરો"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"કાસ્ટ કરવાનું રોકો"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"રૂટ સેટિંગ્સ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ચલાવો"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"થોભો"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"કાસ્ટ કરો બટન"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"આના પર કાસ્ટ કરો"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ડિસ્કનેક્ટ કરો"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"કાસ્ટ કરવાનું રોકો"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"બંધ કરો"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ચલાવો"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"થોભાવો"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"વિસ્તૃત કરો"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"સંકુચિત કરો"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છે"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index c2f58f3..e2c7a43 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट करें"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"डिवाइस से कनेक्ट करें"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"डिवाइस की खोज हो रही है…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करें"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करना बंद करें"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"चलाएं"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"रोकें"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट करें बटन"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्‍ट करें"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करें"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करना बंद करें"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करें"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"चलाएं"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करें"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त करें"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी उपलब्‍ध नहीं"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index dcb4934..d79258f 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Emitiranje"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Povezivanje s uređajem"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Traženje uređaja…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini vezu"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Zaustavi emitiranje"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Postavke rute"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reprodukcija"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pauziraj"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za emitiranje"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi emitiranje"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvaranje"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reprodukcija"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index 0a76065..7686fea 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Tartalomátküldés"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Csatlakozás adott eszközhöz"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Eszközkeresés…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Leválasztás"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Átküldés leállítása"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Útvonal-beállítások"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Indítás"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Szüneteltetés"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Átküldés gomb"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Átküldés leállítása"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Bezárás"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Lejátszás"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index 19c65ed..b05c17c 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Հեռարձակում"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Միանալ սարքին"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Որոնվում են սարքեր..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Անջատել"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Դադարեցնել հեռարձակումը"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ֆայլերի փոխանցման կարգավորումներ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Նվագարկել"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Դադար"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Հեռարձակման կոճակ"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Ընտրեք սարքը"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Դադարեցնել հեռարձակումը"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Փակել"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Նվագարկել"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index b90a0cb..3d01880 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmisi"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Sambungkan ke perangkat"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Menelusuri perangkat…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Hentikan transmisi"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setelan rute"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Putar"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol transmisi"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmisi ke"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Hentikan transmisi"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 9fa308e..366f6f6 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Senda út"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Tengjast tæki"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Leitar að tækjum…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Aftengja"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stöðva útsendingu"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Leiðarstillingar"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Spila"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Hlé"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Útsendingarhnappur"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stöðva útsendingu"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Loka"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Spila"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index 8c3324d..9febd99 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Trasmetti"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Connetti al dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Ricerca di dispositivi…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnetti"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Interrompi trasmissione"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Impostazioni percorso"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Riproduci"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Pulsante Trasmetti"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Interrompi trasmissione"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Chiudi"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Riproduci"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 720a4e2..d1698a5 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"העבר"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"התחבר למכשיר"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"מחפש מכשירים…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"התנתק"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"עצור העברה"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"הגדרות נתיב"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"הפעל"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"השהה"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"‏לחצן הפעלת Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"עצור העברה"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"סגור"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"הפעל"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index 37d80b6..ffe9054 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"キャスト"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"端末に接続"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"端末を検索しています…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"接続を解除"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"キャストを停止"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ルーティング設定"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"再生"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"一時停止"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"キャストアイコン"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"キャストするデバイス"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"キャストを停止"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"閉じる"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"再生"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index b37403a..2182b64 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"მსახიობები"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"მოწყობილობასთან დაკავშირება"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"მოწყობილობების ძიება…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"კავშირის გაწყვეტა"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ტრანსლაციის შეჩერება"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"მარშრუტის პარამეტრები"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"დაკვრა"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"პაუზა"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ტრანსლირების ღილაკი"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ტრანსლირების შეჩერება"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"დაკვრა"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index 0778828..5c72c5f 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Трансляциялау"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Құрылғыға жалғау"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Құрылғыларды іздеуде…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажырату"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Трансляциялауды тоқтату"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Жол параметрлері"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Ойнату"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Кідірту"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Трансляциялау түймесі"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Трансляциялауды тоқтату"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабу"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Ойнату"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index d41b47c..cdf94db 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"បញ្ជូន"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ភ្ជាប់​ឧបករណ៍"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"កំពុង​ស្វែងរក​ឧបករណ៍..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ផ្ដាច់"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"បញ្ឈប់ការខាស"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ការកំណត់ផ្លូវ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ចាក់"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ផ្អាក"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ប៊ូតុងខាស"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"បញ្ឈប់ការខាស"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ចាក់"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 19785c9..970dc41 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ಪಾತ್ರ"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ಮಾರ್ಗ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ಪ್ಲೇ ಮಾಡು"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ವಿರಾಮ"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ಬಿತ್ತರಿಸು ಬಟನ್‌"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ಮುಚ್ಚು"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ಪ್ಲೇ ಮಾಡಿ"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index f9ee94e..fc1dbac 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"전송"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"기기에 연결"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"기기 검색 중…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"연결 해제"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"전송 중지"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"경로 설정"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"재생"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"일시중지"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"전송 버튼"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"전송할 기기"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"전송 중지"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"닫기"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"재생"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index 6565d05..d7409db 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Тандалгандар"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Түзмөккө туташуу"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Түзмөктөр изделүүдө..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажыратуу"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Тышк экранга чыгарну токтотуу"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Багыт жөндөөлөрү"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Ойнотуу"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Тындыруу"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Тышк экранга чыгарну токтотуу"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабуу"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Ойнотуу"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index 8077770..a19dd69 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ສົ່ງ​ສັນ​ຍານ"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ກຳລັງຊອກຫາອຸປະກອນ..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ຕັດການເຊື່ອມຕໍ່"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ຢຸດການສົ່ງສັນຍານ"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ການ​ຕັ້ງ​ຄ່າ​ເສັ້ນ​ທາງ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ຫຼິ້ນ"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ຢຸດຊົ່ວຄາວ"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ປຸ່ມ​ຄາ​ສ​ທ໌"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ຄາ​ສ​ທ໌​ຫາ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງ​ຊອກ​ຫາ​ອຸ​ປະ​ກອນ"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ຢຸດການຄາ​ສ​ທ໌"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ປິດ"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ຫຼິ້ນ"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່​ໄດ້​ເລືອກ​ມີ​ເດຍ​ໃດ​ໄວ້"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່​ມີ​ຂໍ້​ມູນ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index 3e78374..d286e0c 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Perduoti"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Prijungimas prie įrenginio"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Ieškoma įrenginių…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Atjungti"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Sustabdyti perdavimą"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruto nustatymai"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Leisti"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pristabdyti"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Perdavimo mygtukas"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Sustabdyti perdavimą"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Uždaryti"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Leisti"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index a7f30a4..8f49d85 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Apraidīt"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Savienojuma izveide ar ierīci"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Notiek ierīču meklēšana..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Atvienot"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Pārtraukt apraidi"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruta iestatījumi"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Atskaņot"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Apturēt"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Apraides poga"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Pārtraukt apraidi"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Aizvērt"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Atskaņot"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index 47df5bc..e8ff3e7 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Емитувај"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Поврзи се со уредот"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Се пребаруваат уреди..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Исклучи се"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Запри префрлување"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Поставки на маршрутата"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Репродуцирај"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Пауза"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Копчето за Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Запри го емитувањето"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Репродуцирај"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index 93192b6..7dbdf5d 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"കാസ്‌റ്റുചെയ്യുക"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"വിച്ഛേദിക്കുക"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"റൂട്ട് ക്രമീകരണം"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"പ്ലേ ചെയ്യുക"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"താൽക്കാലികമായി നിർത്തുക"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ടാപ്പുചെയ്യുക"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"അടയ്‌ക്കുക"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്‌ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index e14eb50..db6d599 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Дамжуулах"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Төхөөрөмжтэй холбох"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Төхөөрөмжүүдийг хайж байна…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Салгах"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Нэвтрүүлэхийг зогсоох"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Маршрут тохиргоо"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Тоглуулах"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Түр зогсоох"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Дамжуулах товчлуур"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Дамжуулахыг зогсоох"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Хаах"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Тоглуулах"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index 8313f5a..b3f9264 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्‍ट करा"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"डिव्हाइसला कनेक्ट करा"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"डिव्‍हाइसेस शोधत आहे…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"‍डिस्कनेक्ट करा"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करणे थांबवा"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग्ज"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"प्ले करा"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"विराम द्या"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्‍कनेक्‍ट करा"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करणे थांबवा"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करा"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"प्ले करा"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्‍ट करीत आहे"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index 23371d3..4d7a0c8 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Peranti"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Barisan pelakon"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Sambung kepada peranti"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Mencari peranti..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Berhenti menghantar"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Tetapan laluan"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Main"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Butang Hantar"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Berhenti menghantar"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Main"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index d8efc8a..9447089 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"သရုပ်ဆောင်​များ"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"စက်တစ်ခုကို ချိတ်ဆက်ပါ"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"စက်ပစ္စည်းများကို ရှာဖွေနေပါသည်"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ချိတ်ဆက်ခြင်းရပ်တန့်ရန်"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ပုံစံသွင်းမှု ရပ်ရန်"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"လမ်းကြောင်း အပြင်အဆင်များ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ဖွင့်ရန်"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ခဏရပ်ရန်"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ကာစ်တ်လုပ်ရန် ခလုတ်"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ကာစ်တ်လုပ်ခြင်း ရပ်တန့်ရန်"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ပိတ်ရန်"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ဖွင့်ရန်"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index f806229..aea341f 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Koble til enheten"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Søker etter enheter …"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Koble fra"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Stopp castingen"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteinnstillinger"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Spill av"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Sett på pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-ikonet"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Stopp castingen"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Spill av"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index 237279c..d261553 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"उपकरणसँग जडान गर्नुहोस्"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"उपकरणहरूका लागि खोजी गरिँदै..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"विच्छेदन गर्नुहोस्"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्टिंग रोक्नुहोस्"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिङ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"बजाउनुहोस्"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"रोक्नुहोस्"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast बटन"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"casting रोक्नुहोस्"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"बन्द गर्नुहोस्"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"बजाउनुहोस्"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 22323b1..7843b52 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Casten"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Verbinding maken met apparaat"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Zoeken naar apparaten…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbinding verbreken"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Casten stoppen"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route-instellingen"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Afspelen"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Onderbreken"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-icoon"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Casten stoppen"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Sluiten"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Afspelen"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pa-rIN/strings.xml b/v7/mediarouter/res/values-pa-rIN/strings.xml
index 02053d7..55dfd88 100644
--- a/v7/mediarouter/res/values-pa-rIN/strings.xml
+++ b/v7/mediarouter/res/values-pa-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ਸਿਸਟਮ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ਡਿਵਾਈਸਾਂ"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ਜੋੜੋ"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"ਡਿਵਾਈਸਾਂ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ਜੋੜਨਾ ਰੋਕੋ"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ਰੂਟ ਸੈਟਿੰਗਾਂ"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ਪਲੇ ਕਰੋ"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"ਰੋਕੋ"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ਕਾਸਟ ਬਟਨ"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ਇਸ ਨਾਲ ਕਾਸਟ ਕਰੋ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡਿਵਾਈਸਾਂ ਲੱਭ ਰਿਹਾ ਹੈ"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ਜੋੜਨਾ ਰੋਕੋ"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ਪਲੇ ਕਰੋ"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"ਰੋਕੋ"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ਵਿਸਤਾਰ ਕਰੋ"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ਬੰਦ ਕਰੋ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ਕੋਈ ਵੀ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ਸਕ੍ਰੀਨ ਜੋੜ ਰਿਹਾ ਹੈ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index fbcb7e1..c6e7f8a 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Przesyłaj"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Połącz z urządzeniem"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Szukam urządzeń…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Rozłącz"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Zakończ przesyłanie"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ustawienia trasy"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Odtwórz"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Wstrzymaj"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Przycisk Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Zatrzymaj przesyłanie"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zamknij"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Odtwórz"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pt-rBR/strings.xml b/v7/mediarouter/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..17e64f0
--- /dev/null
+++ b/v7/mediarouter/res/values-pt-rBR/strings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
+</resources>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 7982b3c..3c9d4cb 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Ligar ao dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"A pesquisar dispositivos…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desassociar"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Parar a transmissão"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Definições de trajeto"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Colocar em pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper a transmissão"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 12a954a..17e64f0 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar ao dispositivo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Procurando dispositivos…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Interromper transmissão"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configurações de rota"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 6e8bb4c..20c3b71 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispozitive"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Trimiteți"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectați-vă la dispozitiv"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Se caută dispozitive..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Deconectați-vă"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Nu mai proiectați"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setări pentru traseu"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Redați"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Întrerupeți"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Butonul de proiecție"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Opriți proiecția"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Închideți"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Redați"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 0b9d7a7..5a47ec6 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Транслировать."</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Подключение к устройству"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Поиск устройств…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Отключить"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Остановить трансляцию"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки передачи файлов"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Воспроизвести."</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Приостановить."</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляции"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Остановить трансляцию"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыть"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Воспроизвести"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 6db6506..45f67ff 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"උපාංගයට සම්බන්ධ වන්න"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"උපාංග සඳහා සොයමින්…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"විසන්ධි කරන්න"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"කාස්ට් කිරීම නවත්වන්න"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ගමන් මගේ සැකසීම්"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ධාවනය කරන්න"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"විරාමය"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"විකාශ බොත්තම"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"විකාශ කිරීම නවත්වන්න"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"වසන්න"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ධාවනය කරන්න"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්‍යය තෝරා නැත"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index e6a02ac..df95e00 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Preniesť"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Pripojenie k zariadeniu"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Prebieha vyhľadávanie zariadení…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojiť"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Zastaviť prenášanie"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavenia trasy"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Prehrať"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastaviť"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačidlo prenosu"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Zastaviť prenos"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Prehrať"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 8b02d5d..6425222 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Naprave"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Predvajanje"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Povezovanje z napravo"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Iskanje naprav …"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini povezavo"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Ustavi predvajanje"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavitve poti"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Predvajaj"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Zaustavi"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za predvajanje"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Ustavi predvajanje"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zapri"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Predvajanje"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sq-rAL/strings.xml b/v7/mediarouter/res/values-sq-rAL/strings.xml
index ccd00c7..6f375cf 100644
--- a/v7/mediarouter/res/values-sq-rAL/strings.xml
+++ b/v7/mediarouter/res/values-sq-rAL/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistemi"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Pajisjet"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmeto"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Lidhu me pajisjen"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Po kërkon për pajisje…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Shkëputu"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Ndalo transmetimin"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Cilësimet e rrugës"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Luaj"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pauzë"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Butoni i transmetimit"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Gjetja e pajisjeve"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Ndalo transmetimin"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Luaj"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pauzë"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zgjeroje"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Palose"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nuk u zgjodh asnjë media"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nuk jepet asnjë informacion"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Po transmeton ekranin"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index 9bca659..26a36a9 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Пребацуј"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Повежите са уређајем"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Претраживање уређаја…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекини везу"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Заустави пребацивање"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Подешавања путање"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Пусти"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Паузирај"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Дугме Пребаци"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Пребацујте на"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Заустави пребацивање"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Пусти"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index e802f47..3e8c47b 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Casta"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Anslut till enhet"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Söker efter enheter ..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Koppla från"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Sluta casta"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Inställningar för omdirigering"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Spela upp"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knappen"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Sluta casta"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Stäng"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Spela upp"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index 5f2c5b7..38fdb45 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Tuma"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Unganisha kwenye kifaa"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Inatafuta vifaa..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Tenganisha"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Acha kutuma"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mipangilio ya njia"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Google Play"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Sitisha"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Kitufe cha kutuma"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Acha kutuma"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Funga"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Cheza"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index 2496d80..6147b75 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"அமைப்பு"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"அனுப்பு"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"சாதனத்துடன் இணைக்கவும்"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"சாதனங்களைத் தேடுகிறது..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"துண்டி"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"அனுப்புவதை நிறுத்து"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"வழி அமைப்புகள்"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"இயக்கு"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"இடைநிறுத்து"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"அனுப்புதல் பொத்தான்"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"அனுப்புவதை நிறுத்து"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"மூடும்"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"இயக்கும்"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 897fa1e..73c75f4 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ప్రసారం చేయండి"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"పరికరానికి కనెక్ట్ చేయండి"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"పరికరాల కోసం శోధిస్తోంది…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"డిస్‌కనెక్ట్ చేయి"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"ప్రసారాన్ని ఆపివేయి"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"మార్గ సెట్టింగ్‌లు"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"ప్లే చేయి"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"పాజ్ చేయి"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ప్రసారం చేయి బటన్"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్‌కనెక్ట్ చేయి"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"ప్రసారాన్ని ఆపివేయి"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"మూసివేస్తుంది"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"ప్లే చేస్తుంది"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్‌ను ప్రసారం చేస్తోంది"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index 7fed923..fdf0957 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"ส่ง"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"เชื่อมต่อกับอุปกรณ์"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"กำลังค้นหาอุปกรณ์…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"ยกเลิกการเชื่อมต่อ"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"หยุดการส่ง"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"การตั้งค่าเส้นทาง"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"เล่น"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"หยุดชั่วคราว"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"ปุ่ม \"แคสต์\""</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"หยุดการแคสต์"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"ปิด"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"เล่น"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index b22031a..7c04b33 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"I-cast"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Kumonekta sa device"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Naghahanap ng mga device…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Idiskonekta"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Itigil ang pagca-cast"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mga setting ng ruta"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"I-play"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"I-pause"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Button na I-cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Itigil ang pagca-cast"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Isara"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"I-play"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index dad9c60..f8316f4 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Yayınla"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Cihaza bağlanın"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Cihaz arayın…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Bağlantıyı kes"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Yayını durdur"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Rota ayarları"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Oynat"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Duraklat"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Yayın düğmesi"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Yayını durdur"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Kapat"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Oynat"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index 9daaf87..fd4e0d0 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Транслювати"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Під’єднатися до пристрою"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Пошук пристроїв…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Від’єднатися"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Зупинити трансляцію"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Налаштування маршруту"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Відтворити"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Призупинити"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляції"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Припинити трансляцію"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрити"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Відтворити"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index fd2cbb7..afd5534 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"کاسٹ کریں"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"آلہ سے مربوط ہوں"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"آلات تلاش کر رہا ہے…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"غیر مربوط کریں"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"کاسٹ کرنا بند کریں"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"روٹ کی ترتیبات"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"چلائیں"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"موقوف کریں"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"کاسٹ کرنے کا بٹن"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"کاسٹ کرنا بند کریں"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"بند کریں"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"چلائیں"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index 6c364d5..c13b06b 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Translatsiya qilish"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Qurilmaga ulanish"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Qurilmalar izlanmoqda…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Uzish"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Translatsiyani to‘xtatish"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Yo‘naltirish sozlamalari"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Ijro qilish"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"To‘xtatib turish"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Translatsiya tugmasi"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Translatsiyani to‘xtatish"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Yopish"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Boshlash"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 0a53da0..3301cee 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Truyền"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Kết nối với thiết bị"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Đang tìm kiếm thiết bị…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ngắt kết nối"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Ngừng truyền"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Cài đặt tuyến đường"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Phát"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Tạm dừng"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Nút truyền"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Dừng truyền"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Phát"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index e9b04d7..cdd66f5 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"投射"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"连接到设备"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜索设备…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"断开连接"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投射"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由设置"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"暂停"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"投射按钮"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投射"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"关闭"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折叠"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index 66d2f55..873e5ce 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index a6fa252..27755e7 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置..."</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index 78f415d..f513fd4 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -18,12 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
-    <string name="mr_button_content_description" msgid="8327680881775995150">"Abalingisi"</string>
-    <string name="mr_chooser_title" msgid="7106830097177242655">"Xhumeka kudivayisi"</string>
-    <string name="mr_chooser_searching" msgid="7553005460920830010">"Iseshela amadivayisi…"</string>
-    <string name="mr_controller_disconnect" msgid="109793632378378069">"Nqamula"</string>
-    <string name="mr_controller_stop" msgid="5398645111664294430">"Misa ukusakaza"</string>
-    <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Izilungiselelo zomzila"</string>
-    <string name="mr_controller_play" msgid="5214423499524760404">"Dlala"</string>
-    <string name="mr_controller_pause" msgid="8315773974194466049">"Misa isikhashana"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Inkinobho ye-Cast"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Misa ukusakaza"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Vala"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Dlala"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
 </resources>
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
index 5856f38..bc961a7 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
@@ -25,6 +25,7 @@
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.support.annotation.NonNull;
@@ -72,6 +73,8 @@
     private RouteAdapter mAdapter;
     private ListView mListView;
     private boolean mAttachedToWindow;
+    private AsyncTask<Void, Void, Void> mRefreshRoutesTask;
+    private AsyncTask<Void, Void, Void> mOnItemClickTask;
 
     public MediaRouteChooserDialog(Context context) {
         this(context, 0);
@@ -197,12 +200,39 @@
      */
     public void refreshRoutes() {
         if (mAttachedToWindow) {
-            mRoutes.clear();
-            mRoutes.addAll(mRouter.getRoutes());
-            onFilterRoutes(mRoutes);
-            RouteComparator.loadRouteUsageScores(getContext(), mRoutes);
-            Collections.sort(mRoutes, RouteComparator.sInstance);
-            mAdapter.notifyDataSetChanged();
+            if (mRefreshRoutesTask != null) {
+                mRefreshRoutesTask.cancel(true);
+                mRefreshRoutesTask = null;
+            }
+            mRefreshRoutesTask = new AsyncTask<Void, Void, Void>() {
+                private ArrayList<MediaRouter.RouteInfo> mNewRoutes;
+
+                @Override
+                protected void onPreExecute() {
+                    mNewRoutes = new ArrayList<>(mRouter.getRoutes());
+                    onFilterRoutes(mNewRoutes);
+                }
+
+                @Override
+                protected Void doInBackground(Void... params) {
+                    // In API 4 ~ 10, AsyncTasks are running in parallel. Needs synchronization.
+                    synchronized (MediaRouteChooserDialog.this) {
+                        if (!isCancelled()) {
+                            RouteComparator.loadRouteUsageScores(getContext(), mNewRoutes);
+                        }
+                    }
+                    return null;
+                }
+
+                @Override
+                protected void onPostExecute(Void params) {
+                    mRoutes.clear();
+                    mRoutes.addAll(mNewRoutes);
+                    Collections.sort(mRoutes, RouteComparator.sInstance);
+                    mAdapter.notifyDataSetChanged();
+                    mRefreshRoutesTask = null;
+                }
+            }.execute();
         }
     }
 
@@ -277,11 +307,26 @@
 
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            MediaRouter.RouteInfo route = getItem(position);
-            if (route.isEnabled()) {
-                route.select();
-                RouteComparator.storeRouteUsageScores(getContext(), route.getId());
-                dismiss();
+            final MediaRouter.RouteInfo route = getItem(position);
+            if (route.isEnabled() && mOnItemClickTask == null) {
+                mOnItemClickTask = new AsyncTask<Void, Void, Void>() {
+                    @Override
+                    protected void onPreExecute() {
+                        route.select();
+                    }
+
+                    @Override
+                    protected Void doInBackground(Void... params) {
+                        RouteComparator.storeRouteUsageScores(getContext(), route.getId());
+                        return null;
+                    }
+
+                    @Override
+                    protected void onPostExecute(Void params) {
+                        dismiss();
+                        mOnItemClickTask = null;
+                    }
+                }.execute();
             }
         }
 
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 1f375a0..21d78d8 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -62,10 +62,15 @@
 import android.widget.TextView;
 
 import java.io.BufferedInputStream;
+import java.io.InputStream;
 import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * This class implements the route controller dialog for {@link MediaRouter}.
@@ -83,6 +88,7 @@
     // to allow the route provider time to propagate the change and publish a new
     // route descriptor.
     private static final int VOLUME_UPDATE_DELAY_MILLIS = 500;
+    private static final int CONNECTION_TIMEOUT_MILLIS = (int) TimeUnit.SECONDS.toMillis(30L);
 
     private static final int BUTTON_NEUTRAL_RES_ID = android.R.id.button3;
     private static final int BUTTON_DISCONNECT_RES_ID = android.R.id.button2;
@@ -123,6 +129,8 @@
     private View mDividerView;
 
     private ListView mVolumeGroupList;
+    private VolumeGroupAdapter mVolumeGroupAdapter;
+    private List<MediaRouter.RouteInfo> mGroupMemberRoutes;
     private SeekBar mVolumeSlider;
     private VolumeChangeListener mVolumeChangeListener;
     private MediaRouter.RouteInfo mRouteInVolumeSliderTouched;
@@ -346,6 +354,11 @@
         mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
 
         mVolumeGroupList = (ListView) findViewById(R.id.mr_volume_group_list);
+        mGroupMemberRoutes = new ArrayList<MediaRouter.RouteInfo>();
+        mVolumeGroupAdapter = new VolumeGroupAdapter(mContext, mGroupMemberRoutes);
+        mVolumeGroupList.setAdapter(mVolumeGroupAdapter);
+        updateVolumeGroupList();
+
         MediaRouterThemeHelper.setMediaControlsBackgroundColor(mContext,
                 mMediaMainControlLayout, mVolumeGroupList, getGroup() != null);
         MediaRouterThemeHelper.setVolumeSliderColor(mContext,
@@ -361,12 +374,9 @@
                 mIsGroupExpanded = !mIsGroupExpanded;
                 if (mIsGroupExpanded) {
                     mVolumeGroupList.setVisibility(View.VISIBLE);
-                    mVolumeGroupList.setAdapter(
-                            new VolumeGroupAdapter(mContext, getGroup().getRoutes()));
-                } else {
-                    // Request layout to update UI based on {@code mIsGroupExpanded}.
-                    mDefaultControlLayout.requestLayout();
                 }
+                // Request layout to update UI
+                mDefaultControlLayout.requestLayout();
                 mIsGroupListAnimationNeeded = true;
                 updateLayoutHeight();
             }
@@ -539,8 +549,7 @@
             }
         }
         int mainControllerHeight = getMainControllerHeight(canShowPlaybackControlLayout());
-        int volumeGroupListCount = mVolumeGroupList.getAdapter() != null
-                ? mVolumeGroupList.getAdapter().getCount() : 0;
+        int volumeGroupListCount = mGroupMemberRoutes.size();
         // Scale down volume group list items in landscape mode.
         for (int i = 0; i < mVolumeGroupList.getChildCount(); i++) {
             updateVolumeGroupItemHeight(mVolumeGroupList.getChildAt(i));
@@ -666,19 +675,23 @@
                     mGroupExpandCollapseButton.setVisibility(View.GONE);
                 } else {
                     mGroupExpandCollapseButton.setVisibility(View.VISIBLE);
-                    VolumeGroupAdapter adapter =
-                            (VolumeGroupAdapter) mVolumeGroupList.getAdapter();
-                    if (adapter != null) {
-                        adapter.notifyDataSetChanged();
-                    }
                 }
             }
+            updateVolumeGroupList();
         } else {
             mVolumeControlLayout.setVisibility(View.GONE);
         }
         updateLayoutHeight();
     }
 
+    private void updateVolumeGroupList() {
+        mGroupMemberRoutes.clear();
+        if (getGroup() != null) {
+            mGroupMemberRoutes.addAll(getGroup().getRoutes());
+        }
+        mVolumeGroupAdapter.notifyDataSetChanged();
+    }
+
     private void updatePlaybackControlLayout() {
         if (canShowPlaybackControlLayout()) {
             CharSequence title = mDescription == null ? null : mDescription.getTitle();
@@ -759,6 +772,15 @@
         view.setLayoutParams(lp);
     }
 
+    private static boolean uriEquals(Uri uri1, Uri uri2) {
+        if (uri1 != null && uri1.equals(uri2)) {
+            return true;
+        } else if (uri1 == null && uri2 == null) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Returns desired art height to fit into controller dialog.
      */
@@ -955,7 +977,7 @@
 
         @Override
         protected void onPreExecute() {
-            if (mArtIconBitmap == mIconBitmap && mArtIconUri == mIconUri) {
+            if (!isIconChanged()) {
                 // Already handled the current art.
                 cancel(true);
             }
@@ -967,18 +989,12 @@
             if (mIconBitmap != null) {
                 art = mIconBitmap;
             } else if (mIconUri != null) {
-                String scheme = mIconUri.getScheme();
-                if (!(ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)
-                        || ContentResolver.SCHEME_CONTENT.equals(scheme)
-                        || ContentResolver.SCHEME_FILE.equals(scheme))) {
-                    Log.w(TAG, "Icon Uri should point to local resources.");
-                    return null;
-                }
-                BufferedInputStream stream = null;
+                InputStream stream = null;
                 try {
-                    stream = new BufferedInputStream(
-                            mContext.getContentResolver().openInputStream(mIconUri));
-
+                    if ((stream = openInputStreamByScheme(mIconUri)) == null) {
+                        Log.w(TAG, "Unable to open: " + mIconUri);
+                        return null;
+                    }
                     // Query art size.
                     BitmapFactory.Options options = new BitmapFactory.Options();
                     options.inJustDecodeBounds = true;
@@ -992,8 +1008,10 @@
                     } catch (IOException e) {
                         // Failed to rewind the stream, try to reopen it.
                         stream.close();
-                        stream = new BufferedInputStream(mContext.getContentResolver()
-                                .openInputStream(mIconUri));
+                        if ((stream = openInputStreamByScheme(mIconUri)) == null) {
+                            Log.w(TAG, "Unable to open: " + mIconUri);
+                            return null;
+                        }
                     }
                     // Calculate required size to decode the art and possibly resize it.
                     options.inJustDecodeBounds = false;
@@ -1041,5 +1059,36 @@
                 updateLayoutHeight();
             }
         }
+
+        /**
+         * Returns whether a new art image is different from an original art image. Compares
+         * Bitmap objects first, and then compares URIs only if bitmap is unchanged with
+         * a null value.
+         */
+        private boolean isIconChanged() {
+            if (mIconBitmap != mArtIconBitmap) {
+                return true;
+            } else if (mIconBitmap == null && !uriEquals(mIconUri, mArtIconUri)) {
+                return true;
+            }
+            return false;
+        }
+
+        private InputStream openInputStreamByScheme(Uri uri) throws IOException {
+            String scheme = uri.getScheme().toLowerCase();
+            InputStream stream = null;
+            if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)
+                    || ContentResolver.SCHEME_CONTENT.equals(scheme)
+                    || ContentResolver.SCHEME_FILE.equals(scheme)) {
+                stream = mContext.getContentResolver().openInputStream(uri);
+            } else {
+                URL url = new URL(uri.toString());
+                URLConnection conn = url.openConnection();
+                conn.setConnectTimeout(CONNECTION_TIMEOUT_MILLIS);
+                conn.setReadTimeout(CONNECTION_TIMEOUT_MILLIS);
+                stream = conn.getInputStream();
+            }
+            return (stream == null) ? null : new BufferedInputStream(stream);
+        }
     }
 }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java b/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
index 33ab7bc..25b1d1d 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
@@ -107,9 +107,7 @@
             Context context, View mainControls, View groupControls, boolean hasGroup) {
         int primaryColor = getThemeColor(context, 0, R.attr.colorPrimary);
         int primaryDarkColor = getThemeColor(context, 0, R.attr.colorPrimaryDark);
-        int controllerColor = getControllerColor(context, 0);
-        if (hasGroup && controllerColor == COLOR_DARK_ON_LIGHT_BACKGROUND
-                && ColorUtils.calculateContrast(controllerColor, primaryDarkColor) < MIN_CONTRAST) {
+        if (hasGroup && getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
             // Instead of showing dark controls in a possibly dark (i.e. the primary dark), model
             // the white dialog and use the primary color for the group controls.
             primaryDarkColor = primaryColor;
diff --git a/v7/palette/api/23.1.1.txt b/v7/palette/api/23.1.1.txt
new file mode 100644
index 0000000..fac6a55
--- /dev/null
+++ b/v7/palette/api/23.1.1.txt
@@ -0,0 +1,56 @@
+package android.support.v7.graphics {
+
+  public final class Palette {
+    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
+    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public int getDarkMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
+    method public int getDarkVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
+    method public int getLightMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
+    method public int getLightVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
+    method public int getMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
+    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+    method public int getVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
+  }
+
+  public static final class Palette.Builder {
+    ctor public Palette.Builder(android.graphics.Bitmap);
+    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
+    method public android.support.v7.graphics.Palette.Builder clearFilters();
+    method public android.support.v7.graphics.Palette.Builder clearRegion();
+    method public android.support.v7.graphics.Palette generate();
+    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
+    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
+    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
+  }
+
+  public static abstract interface Palette.Filter {
+    method public abstract boolean isAllowed(int, float[]);
+  }
+
+  public static abstract interface Palette.PaletteAsyncListener {
+    method public abstract void onGenerated(android.support.v7.graphics.Palette);
+  }
+
+  public static final class Palette.Swatch {
+    ctor public Palette.Swatch(int, int);
+    method public int getBodyTextColor();
+    method public float[] getHsl();
+    method public int getPopulation();
+    method public int getRgb();
+    method public int getTitleTextColor();
+  }
+
+}
+
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index d0dff30..a71031d 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -773,11 +773,13 @@
                 if (bitmap != mBitmap && region != null) {
                     // If we have a scaled bitmap and a selected region, we need to scale down the
                     // region to match the new scale
-                    final float scale = bitmap.getWidth() / (float) mBitmap.getWidth();
+                    final double scale = bitmap.getWidth() / (double) mBitmap.getWidth();
                     region.left = (int) Math.floor(region.left * scale);
                     region.top = (int) Math.floor(region.top * scale);
-                    region.right = (int) Math.ceil(region.right * scale);
-                    region.bottom = (int) Math.ceil(region.bottom * scale);
+                    region.right = Math.min((int) Math.ceil(region.right * scale),
+                            bitmap.getWidth());
+                    region.bottom = Math.min((int) Math.ceil(region.bottom * scale),
+                            bitmap.getHeight());
                 }
 
                 // Now generate a quantizer from the Bitmap
diff --git a/v7/preference/Android.mk b/v7/preference/Android.mk
index e2db0f1..4fb0f03 100644
--- a/v7/preference/Android.mk
+++ b/v7/preference/Android.mk
@@ -14,14 +14,14 @@
 
 LOCAL_PATH := $(call my-dir)
 
-# Build the resources using the current SDK version.
+# Build the resources and resource constants using the current SDK version.
 # We do this here because the final static library must be compiled with an older
 # SDK version than the resources.  The resources library and the R class that it
 # contains will not be linked into the final static library.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-preference-res
 LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, dummy)
+LOCAL_SRC_FILES := $(call all-java-files-under, constants)
 LOCAL_RESOURCE_DIR := \
         frameworks/support/v7/appcompat/res \
         frameworks/support/v7/recyclerview/res \
diff --git a/v7/preference/api/23.1.1.txt b/v7/preference/api/23.1.1.txt
new file mode 100644
index 0000000..7d7aeb1
--- /dev/null
+++ b/v7/preference/api/23.1.1.txt
@@ -0,0 +1,318 @@
+package android.support.v7.preference {
+
+  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
+    ctor public CheckBoxPreference(android.content.Context);
+  }
+
+  public abstract class DialogPreference extends android.support.v7.preference.Preference {
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable getDialogIcon();
+    method public int getDialogLayoutResource();
+    method public java.lang.CharSequence getDialogMessage();
+    method public java.lang.CharSequence getDialogTitle();
+    method public java.lang.CharSequence getNegativeButtonText();
+    method public java.lang.CharSequence getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable);
+    method public void setDialogIcon(int);
+    method public void setDialogLayoutResource(int);
+    method public void setDialogMessage(java.lang.CharSequence);
+    method public void setDialogMessage(int);
+    method public void setDialogTitle(java.lang.CharSequence);
+    method public void setDialogTitle(int);
+    method public void setNegativeButtonText(java.lang.CharSequence);
+    method public void setNegativeButtonText(int);
+    method public void setPositiveButtonText(java.lang.CharSequence);
+    method public void setPositiveButtonText(int);
+  }
+
+  public static abstract interface DialogPreference.TargetFragment {
+    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+  }
+
+  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
+    ctor public EditTextPreference(android.content.Context);
+    method public java.lang.String getText();
+    method public void setText(java.lang.String);
+  }
+
+  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public EditTextPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public ListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence getEntry();
+    method public java.lang.CharSequence[] getEntryValues();
+    method public java.lang.String getValue();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValue(java.lang.String);
+    method public void setValueIndex(int);
+  }
+
+  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public ListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class Preference {
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet);
+    ctor public Preference(android.content.Context);
+    method public boolean callChangeListener(java.lang.Object);
+    method public int compareTo(android.support.v7.preference.Preference);
+    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
+    method public android.content.Context getContext();
+    method public java.lang.String getDependency();
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getFragment();
+    method public android.graphics.drawable.Drawable getIcon();
+    method public android.content.Intent getIntent();
+    method public java.lang.String getKey();
+    method public final int getLayoutResource();
+    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
+    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
+    method public int getOrder();
+    method protected boolean getPersistedBoolean(boolean);
+    method protected float getPersistedFloat(float);
+    method protected int getPersistedInt(int);
+    method protected long getPersistedLong(long);
+    method protected java.lang.String getPersistedString(java.lang.String);
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public boolean getShouldDisableView();
+    method public java.lang.CharSequence getSummary();
+    method public java.lang.CharSequence getTitle();
+    method public final int getWidgetLayoutResource();
+    method public boolean hasKey();
+    method public boolean isEnabled();
+    method public boolean isPersistent();
+    method public boolean isSelectable();
+    method public final boolean isVisible();
+    method protected void notifyChanged();
+    method public void notifyDependencyChange(boolean);
+    method protected void notifyHierarchyChanged();
+    method public void onAttached();
+    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
+    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
+    method protected void onClick();
+    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
+    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
+    method protected void onPrepareForRemoval();
+    method protected void onRestoreInstanceState(android.os.Parcelable);
+    method protected android.os.Parcelable onSaveInstanceState();
+    method protected void onSetInitialValue(boolean, java.lang.Object);
+    method public android.os.Bundle peekExtras();
+    method protected boolean persistBoolean(boolean);
+    method protected boolean persistFloat(float);
+    method protected boolean persistInt(int);
+    method protected boolean persistLong(long);
+    method protected boolean persistString(java.lang.String);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
+    method public void setDefaultValue(java.lang.Object);
+    method public void setDependency(java.lang.String);
+    method public void setEnabled(boolean);
+    method public void setFragment(java.lang.String);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIcon(int);
+    method public void setIntent(android.content.Intent);
+    method public void setKey(java.lang.String);
+    method public void setLayoutResource(int);
+    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
+    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
+    method public void setOrder(int);
+    method public void setPersistent(boolean);
+    method public void setSelectable(boolean);
+    method public void setShouldDisableView(boolean);
+    method public void setSummary(java.lang.CharSequence);
+    method public void setSummary(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitle(int);
+    method public final void setVisible(boolean);
+    method public void setWidgetLayoutResource(int);
+    method public boolean shouldDisableDependents();
+    method protected boolean shouldPersist();
+    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
+  }
+
+  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
+    ctor public Preference.BaseSavedState(android.os.Parcel);
+    ctor public Preference.BaseSavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
+  }
+
+  public static abstract interface Preference.OnPreferenceChangeListener {
+    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
+  }
+
+  public static abstract interface Preference.OnPreferenceClickListener {
+    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
+  }
+
+  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
+    ctor public PreferenceCategory(android.content.Context);
+  }
+
+  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragmentCompat();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragmentCompat();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
+    method public void addItemFromInflater(android.support.v7.preference.Preference);
+    method public boolean addPreference(android.support.v7.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public android.support.v7.preference.Preference getPreference(int);
+    method public int getPreferenceCount();
+    method protected boolean isOnSameScreenAsChildren();
+    method public boolean isOrderingAsAdded();
+    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
+    method public void removeAll();
+    method public boolean removePreference(android.support.v7.preference.Preference);
+    method public void setOrderingAsAdded(boolean);
+  }
+
+  public class PreferenceManager {
+    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
+    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
+    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
+    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public int getSharedPreferencesMode();
+    method public java.lang.String getSharedPreferencesName();
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
+    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
+    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
+    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
+    method public void setSharedPreferencesMode(int);
+    method public void setSharedPreferencesName(java.lang.String);
+    method public void showDialog(android.support.v7.preference.Preference);
+    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
+  }
+
+  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
+    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
+    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+  }
+
+  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
+    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+  }
+
+  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
+  }
+
+  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
+    method public android.view.View findViewById(int);
+  }
+
+  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
+    ctor public TwoStatePreference(android.content.Context);
+    method public boolean getDisableDependentsState();
+    method public java.lang.CharSequence getSummaryOff();
+    method public java.lang.CharSequence getSummaryOn();
+    method public boolean isChecked();
+    method public void setChecked(boolean);
+    method public void setDisableDependentsState(boolean);
+    method public void setSummaryOff(java.lang.CharSequence);
+    method public void setSummaryOff(int);
+    method public void setSummaryOn(java.lang.CharSequence);
+    method public void setSummaryOn(int);
+    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
+    field protected boolean mChecked;
+  }
+
+}
+
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index a0681ed..db64731 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -30,6 +30,7 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
+        main.java.srcDir 'constants'
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
diff --git a/v7/preference/constants/android/support/v7/preference/AndroidResources.java b/v7/preference/constants/android/support/v7/preference/AndroidResources.java
new file mode 100644
index 0000000..d529ad2
--- /dev/null
+++ b/v7/preference/constants/android/support/v7/preference/AndroidResources.java
@@ -0,0 +1,29 @@
+/*
+ * 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.preference;
+
+public class AndroidResources {
+
+    public static final int ANDROID_R_ICON_FRAME = android.R.id.icon_frame;
+    public static final int ANDROID_R_LIST_CONTAINER = android.R.id.list_container;
+    public static final int ANDROID_R_SWITCH_WIDGET = android.R.id.switch_widget;
+    public static final int ANDROID_R_PREFERENCE_FRAGMENT_STYLE
+            = android.R.attr.preferenceFragmentStyle;
+    public static final int ANDROID_R_EDITTEXT_PREFERENCE_STYLE
+            = android.R.attr.editTextPreferenceStyle;
+
+}
diff --git a/v7/preference/res/layout/preference_list_fragment.xml b/v7/preference/res/layout/preference_list_fragment.xml
index 44c5438..fe11fb2 100644
--- a/v7/preference/res/layout/preference_list_fragment.xml
+++ b/v7/preference/res/layout/preference_list_fragment.xml
@@ -21,7 +21,7 @@
     android:layout_width="match_parent" >
 
     <FrameLayout
-        android:id="@+id/list_container"
+        android:id="@android:id/list_container"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1" />
diff --git a/v7/preference/res/layout/preference_widget_checkbox.xml b/v7/preference/res/layout/preference_widget_checkbox.xml
index e53b7df..cc99443 100644
--- a/v7/preference/res/layout/preference_widget_checkbox.xml
+++ b/v7/preference/res/layout/preference_widget_checkbox.xml
@@ -18,7 +18,7 @@
 <!-- Layout used by CheckBoxPreference for the checkbox style. This is inflated
      inside android.R.layout.preference. -->
 <CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/checkbox"
+    android:id="@android:id/checkbox"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:focusable="false"
diff --git a/v7/preference/res/values/attrs.xml b/v7/preference/res/values/attrs.xml
index 5d39b63..310a444 100644
--- a/v7/preference/res/values/attrs.xml
+++ b/v7/preference/res/values/attrs.xml
@@ -245,4 +245,11 @@
         <attr name="android:maxHeight" />
     </declare-styleable>
 
+    <!-- Used to access some android attrs -->
+    <declare-styleable name="BackgroundStyle">
+        <attr name="android:selectableItemBackground" />
+        <!-- Need a non-android: attr here so that gradle doesn't remove it -->
+        <attr name="selectableItemBackground" />
+    </declare-styleable>
+
 </resources>
diff --git a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
index 61eb13c..94f0751 100644
--- a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
+++ b/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
@@ -61,7 +61,8 @@
     }
 
     public CheckBoxPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.checkBoxPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.checkBoxPreferenceStyle,
+                android.R.attr.checkBoxPreferenceStyle));
     }
 
     public CheckBoxPreference(Context context) {
@@ -72,7 +73,7 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        View checkboxView = holder.findViewById(R.id.checkbox);
+        View checkboxView = holder.findViewById(android.R.id.checkbox);
         if (checkboxView != null && checkboxView instanceof Checkable) {
             ((Checkable) checkboxView).setChecked(mChecked);
         }
diff --git a/v7/preference/src/android/support/v7/preference/DialogPreference.java b/v7/preference/src/android/support/v7/preference/DialogPreference.java
index bf0f4ef..158accb 100644
--- a/v7/preference/src/android/support/v7/preference/DialogPreference.java
+++ b/v7/preference/src/android/support/v7/preference/DialogPreference.java
@@ -90,7 +90,8 @@
     }
 
     public DialogPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.dialogPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
+                android.R.attr.dialogPreferenceStyle));
     }
 
     public DialogPreference(Context context) {
diff --git a/v7/preference/src/android/support/v7/preference/EditTextPreference.java b/v7/preference/src/android/support/v7/preference/EditTextPreference.java
index c4941e6..423a0c9 100644
--- a/v7/preference/src/android/support/v7/preference/EditTextPreference.java
+++ b/v7/preference/src/android/support/v7/preference/EditTextPreference.java
@@ -20,6 +20,7 @@
 import android.content.res.TypedArray;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.v4.content.res.TypedArrayUtils;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.widget.EditText;
@@ -46,7 +47,8 @@
     }
 
     public EditTextPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.editTextPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.editTextPreferenceStyle,
+                AndroidResources.ANDROID_R_EDITTEXT_PREFERENCE_STYLE));
     }
 
     public EditTextPreference(Context context) {
diff --git a/v7/preference/src/android/support/v7/preference/ListPreference.java b/v7/preference/src/android/support/v7/preference/ListPreference.java
index 848cfad..4507b26 100644
--- a/v7/preference/src/android/support/v7/preference/ListPreference.java
+++ b/v7/preference/src/android/support/v7/preference/ListPreference.java
@@ -74,7 +74,8 @@
     }
 
     public ListPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.dialogPreferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
+                android.R.attr.dialogPreferenceStyle));
     }
 
     public ListPreference(Context context) {
diff --git a/v7/preference/src/android/support/v7/preference/Preference.java b/v7/preference/src/android/support/v7/preference/Preference.java
index f386592..84550cf 100644
--- a/v7/preference/src/android/support/v7/preference/Preference.java
+++ b/v7/preference/src/android/support/v7/preference/Preference.java
@@ -272,7 +272,7 @@
 
         mShouldDisableView =
                 TypedArrayUtils.getBoolean(a, R.styleable.Preference_shouldDisableView,
-                        R.styleable.Preference_shouldDisableView, true);
+                        R.styleable.Preference_android_shouldDisableView, true);
 
         a.recycle();
     }
@@ -316,7 +316,8 @@
      * @see #Preference(Context, AttributeSet, int)
      */
     public Preference(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.preferenceStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+                android.R.attr.preferenceStyle));
     }
 
     /**
@@ -506,7 +507,10 @@
             imageView.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
         }
 
-        final View imageFrame = holder.findViewById(R.id.icon_frame);
+        View imageFrame = holder.findViewById(R.id.icon_frame);
+        if (imageFrame == null) {
+            imageFrame = holder.findViewById(AndroidResources.ANDROID_R_ICON_FRAME);
+        }
         if (imageFrame != null) {
             imageFrame.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
         }
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceCategory.java b/v7/preference/src/android/support/v7/preference/PreferenceCategory.java
index bed7f7e..10a0753 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceCategory.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceCategory.java
@@ -17,6 +17,7 @@
 package android.support.v7.preference;
 
 import android.content.Context;
+import android.support.v4.content.res.TypedArrayUtils;
 import android.util.AttributeSet;
 
 /**
@@ -43,7 +44,8 @@
     }
 
     public PreferenceCategory(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.preferenceCategoryStyle);
+        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceCategoryStyle,
+                android.R.attr.preferenceCategoryStyle));
     }
 
     public PreferenceCategory(Context context) {
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
index 221d3ea..368a3a4 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
@@ -257,10 +257,10 @@
 
         final View view = themedInflater.inflate(mLayoutResId, container, false);
 
-        final View rawListContainer = view.findViewById(R.id.list_container);
+        final View rawListContainer = view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER);
         if (!(rawListContainer instanceof ViewGroup)) {
-            throw new RuntimeException("Content has view with id attribute 'R.id.list_container' "
-                    + "that is not a ViewGroup class");
+            throw new RuntimeException("Content has view with id attribute "
+                    + "'android.R.id.list_container' that is not a ViewGroup class");
         }
 
         final ViewGroup listContainer = (ViewGroup) rawListContainer;
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
index c4ccc66..fefab02 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
@@ -16,6 +16,8 @@
 
 package android.support.v7.preference;
 
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
@@ -271,8 +273,18 @@
     public PreferenceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         final PreferenceLayout pl = mPreferenceLayouts.get(viewType);
         final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+        TypedArray a
+                = parent.getContext().obtainStyledAttributes(null, R.styleable.BackgroundStyle);
+        Drawable background
+                = a.getDrawable(R.styleable.BackgroundStyle_android_selectableItemBackground);
+        if (background == null) {
+            background = parent.getContext().getResources()
+                    .getDrawable(android.R.drawable.list_selector_background);
+        }
+        a.recycle();
 
         final View view = inflater.inflate(pl.resId, parent, false);
+        view.setBackgroundDrawable(background);
 
         final ViewGroup widgetFrame = (ViewGroup) view.findViewById(android.R.id.widget_frame);
         if (widgetFrame != null) {
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceScreen.java b/v7/preference/src/android/support/v7/preference/PreferenceScreen.java
index e64ebcc..ee8b056 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceScreen.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceScreen.java
@@ -17,6 +17,7 @@
 package android.support.v7.preference;
 
 import android.content.Context;
+import android.support.v4.content.res.TypedArrayUtils;
 import android.util.AttributeSet;
 
 /**
@@ -79,7 +80,8 @@
      * @hide-
      */
     public PreferenceScreen(Context context, AttributeSet attrs) {
-        super(context, attrs, R.attr.preferenceScreenStyle);
+        super(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceScreenStyle,
+                android.R.attr.preferenceScreenStyle));
     }
 
     @Override
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java b/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
index f9eaf22..156d5a8 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
@@ -39,6 +39,8 @@
         mCachedViews.put(android.R.id.summary, itemView.findViewById(android.R.id.summary));
         mCachedViews.put(android.R.id.icon, itemView.findViewById(android.R.id.icon));
         mCachedViews.put(R.id.icon_frame, itemView.findViewById(R.id.icon_frame));
+        mCachedViews.put(AndroidResources.ANDROID_R_ICON_FRAME,
+                itemView.findViewById(AndroidResources.ANDROID_R_ICON_FRAME));
     }
 
     /**
diff --git a/v7/recyclerview/api/23.1.1.txt b/v7/recyclerview/api/23.1.1.txt
new file mode 100644
index 0000000..1f91036
--- /dev/null
+++ b/v7/recyclerview/api/23.1.1.txt
@@ -0,0 +1,864 @@
+package android.support.v7.recyclerview {
+
+  public final class R {
+    ctor public R();
+  }
+
+  public static final class R.attr {
+    ctor public R.attr();
+    field public static int layoutManager;
+    field public static int reverseLayout;
+    field public static int spanCount;
+    field public static int stackFromEnd;
+  }
+
+  public static final class R.dimen {
+    ctor public R.dimen();
+    field public static int item_touch_helper_max_drag_scroll_per_frame;
+  }
+
+  public static final class R.id {
+    ctor public R.id();
+    field public static int item_touch_helper_previous_elevation;
+  }
+
+  public static final class R.styleable {
+    ctor public R.styleable();
+    field public static final int[] RecyclerView;
+    field public static int RecyclerView_android_orientation;
+    field public static int RecyclerView_layoutManager;
+    field public static int RecyclerView_reverseLayout;
+    field public static int RecyclerView_spanCount;
+    field public static int RecyclerView_stackFromEnd;
+  }
+
+}
+
+package android.support.v7.util {
+
+  public class AsyncListUtil {
+    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
+    method public T getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public static abstract class AsyncListUtil.DataCallback {
+    ctor public AsyncListUtil.DataCallback();
+    method public abstract void fillData(T[], int, int);
+    method public int getMaxCachedTiles();
+    method public void recycleData(T[], int);
+    method public abstract int refreshData();
+  }
+
+  public static abstract class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method public void extendRangeInto(int[], int[], int);
+    method public abstract void getItemRangeInto(int[]);
+    method public abstract void onDataRefresh();
+    method public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class SortedList {
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
+    method public int add(T);
+    method public void addAll(T[], boolean);
+    method public void addAll(T...);
+    method public void addAll(java.util.Collection<T>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T);
+    method public T removeItemAt(int);
+    method public int size();
+    method public void updateItemAt(int, T);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
+    method public boolean areContentsTheSame(T2, T2);
+    method public boolean areItemsTheSame(T2, T2);
+    method public int compare(T2, T2);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public static abstract class SortedList.Callback implements java.util.Comparator {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2, T2);
+    method public abstract boolean areItemsTheSame(T2, T2);
+    method public abstract int compare(T2, T2);
+    method public abstract void onChanged(int, int);
+    method public abstract void onInserted(int, int);
+    method public abstract void onMoved(int, int);
+    method public abstract void onRemoved(int, int);
+  }
+
+}
+
+package android.support.v7.widget {
+
+  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public GridLayoutManager(android.content.Context, int);
+    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
+    method public int getSpanCount();
+    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
+    ctor public LinearLayoutManager(android.content.Context);
+    ctor public LinearLayoutManager(android.content.Context, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View, int);
+    method public int calculateDyToMakeVisible(android.view.View, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
+    field protected android.graphics.PointF mTargetVector;
+  }
+
+  public abstract class OrientationHelper {
+    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
+    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int getDecoratedEnd(android.view.View);
+    method public abstract int getDecoratedMeasurement(android.view.View);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View);
+    method public abstract int getDecoratedStart(android.view.View);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract void offsetChild(android.view.View, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
+  }
+
+  public class RecyclerView extends android.view.ViewGroup {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
+    method public android.view.View findChildViewUnder(float, float);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
+    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method public deprecated int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
+    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method public boolean isLayoutFrozen();
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas);
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(int, int);
+    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void scrollToPosition(int);
+    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
+    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
+    method public void setItemViewCacheSize(int);
+    method public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
+    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
+    method public void setScrollingTouchSlop(int);
+    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
+    method public void smoothScrollBy(int, int);
+    method public void smoothScrollToPosition(int);
+    method public void stopScroll();
+    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class RecyclerView.Adapter {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final boolean hasObservers();
+    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);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public static abstract class RecyclerView.AdapterDataObserver {
+    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);
+  }
+
+  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
+    method public abstract int onGetChildDrawingOrder(int, int);
+  }
+
+  public static abstract class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public abstract void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public int bottom;
+    field public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public static abstract class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+  }
+
+  public static abstract class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View);
+    method public void addDisappearingView(android.view.View, int);
+    method public void addView(android.view.View);
+    method public void addView(android.view.View, int);
+    method public void assertInLayoutOrScroll(java.lang.String);
+    method public void assertNotInLayoutOrScroll(java.lang.String);
+    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View);
+    method public android.view.View findViewByPosition(int);
+    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View getChildAt(int);
+    method public int getChildCount();
+    method public static int getChildMeasureSpec(int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View getFocusedChild();
+    method public int getHeight();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method public int getMinimumHeight();
+    method public int getMinimumWidth();
+    method public int getPaddingBottom();
+    method public int getPaddingEnd();
+    method public int getPaddingLeft();
+    method public int getPaddingRight();
+    method public int getPaddingStart();
+    method public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public int getWidth();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isFocused();
+    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public boolean isSmoothScrolling();
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
+    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
+    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
+    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
+    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
+    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
+    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);
+    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
+    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
+    method public void postOnAnimation(java.lang.Runnable);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(java.lang.Runnable);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void setMeasuredDimension(int, int);
+    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
+    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method public deprecated int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
+    method public abstract void onChildViewAttachedToWindow(android.view.View);
+    method public abstract void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public static abstract interface RecyclerView.OnItemTouchListener {
+    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
+    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
+    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
+    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static abstract interface RecyclerView.RecyclerListener {
+    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.view.View findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getTargetPosition();
+    method public deprecated void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View);
+    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
+    method public int getDuration();
+    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);
+    method public void setInterpolator(android.view.animation.Interpolator);
+    method public void update(int, int, int, android.view.animation.Interpolator);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public T get(int);
+    method public int getItemCount();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isPreLayout();
+    method public void put(int, java.lang.Object);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public static abstract class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public static abstract class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method public final deprecated int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
+  }
+
+  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
+    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
+    method public int[] findFirstVisibleItemPositions(int[]);
+    method public int[] findLastCompletelyVisibleItemPositions(int[]);
+    method public int[] findLastVisibleItemPositions(int[]);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
+package android.support.v7.widget.helper {
+
+  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public static abstract class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
+    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static abstract interface ItemTouchHelper.ViewDropHandler {
+    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public abstract interface ItemTouchUIUtil {
+    method public abstract void clearView(android.view.View);
+    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onSelected(android.view.View);
+  }
+
+}
+
+package android.support.v7.widget.util {
+
+  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+}
+
diff --git a/v7/recyclerview/api/current.txt b/v7/recyclerview/api/current.txt
index 1f91036..1832731 100644
--- a/v7/recyclerview/api/current.txt
+++ b/v7/recyclerview/api/current.txt
@@ -15,6 +15,8 @@
   public static final class R.dimen {
     ctor public R.dimen();
     field public static int item_touch_helper_max_drag_scroll_per_frame;
+    field public static int item_touch_helper_swipe_escape_max_velocity;
+    field public static int item_touch_helper_swipe_escape_velocity;
   }
 
   public static final class R.id {
@@ -812,7 +814,9 @@
     method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
     method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
     method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
     method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
     method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
     method public boolean isItemViewSwipeEnabled();
     method public boolean isLongPressDragEnabled();
diff --git a/v7/recyclerview/jvm-tests/NO_DOCS b/v7/recyclerview/jvm-tests/NO_DOCS
new file mode 100644
index 0000000..0c81e4a
--- /dev/null
+++ b/v7/recyclerview/jvm-tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/v7/recyclerview/res/values/dimens.xml b/v7/recyclerview/res/values/dimens.xml
index 5928f36..90c41b9 100644
--- a/v7/recyclerview/res/values/dimens.xml
+++ b/v7/recyclerview/res/values/dimens.xml
@@ -19,4 +19,6 @@
     <!-- The max amount of scroll ItemTouchHelper will trigger if dragged view is out of
     RecyclerView's bounds.-->
     <dimen name="item_touch_helper_max_drag_scroll_per_frame">20dp</dimen>
+    <dimen name="item_touch_helper_swipe_escape_velocity">120dp</dimen>
+    <dimen name="item_touch_helper_swipe_escape_max_velocity">800dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 57684f8..23693ba 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -991,6 +991,7 @@
         if (layout == mLayout) {
             return;
         }
+        stopScroll();
         // TODO We should do this switch a dispachLayout pass and animate children. There is a good
         // chance that LayoutManagers will re-use views.
         if (mLayout != null) {
@@ -1545,8 +1546,10 @@
      */
     @Override
     public int computeHorizontalScrollOffset() {
-        return mLayout.canScrollHorizontally() ? mLayout.computeHorizontalScrollOffset(mState)
-                : 0;
+        if (mLayout == null) {
+            return 0;
+        }
+        return mLayout.canScrollHorizontally() ? mLayout.computeHorizontalScrollOffset(mState) : 0;
     }
 
     /**
@@ -1568,6 +1571,9 @@
      */
     @Override
     public int computeHorizontalScrollExtent() {
+        if (mLayout == null) {
+            return 0;
+        }
         return mLayout.canScrollHorizontally() ? mLayout.computeHorizontalScrollExtent(mState) : 0;
     }
 
@@ -1588,6 +1594,9 @@
      */
     @Override
     public int computeHorizontalScrollRange() {
+        if (mLayout == null) {
+            return 0;
+        }
         return mLayout.canScrollHorizontally() ? mLayout.computeHorizontalScrollRange(mState) : 0;
     }
 
@@ -1610,6 +1619,9 @@
      */
     @Override
     public int computeVerticalScrollOffset() {
+        if (mLayout == null) {
+            return 0;
+        }
         return mLayout.canScrollVertically() ? mLayout.computeVerticalScrollOffset(mState) : 0;
     }
 
@@ -1631,6 +1643,9 @@
      */
     @Override
     public int computeVerticalScrollExtent() {
+        if (mLayout == null) {
+            return 0;
+        }
         return mLayout.canScrollVertically() ? mLayout.computeVerticalScrollExtent(mState) : 0;
     }
 
@@ -1651,6 +1666,9 @@
      */
     @Override
     public int computeVerticalScrollRange() {
+        if (mLayout == null) {
+            return 0;
+        }
         return mLayout.canScrollVertically() ? mLayout.computeVerticalScrollRange(mState) : 0;
     }
 
@@ -2763,7 +2781,7 @@
         // simple animations are a subset of advanced animations (which will cause a
         // pre-layout step)
         // If layout supports predictive animations, pre-process to decide if we want to run them
-        if (mItemAnimator != null && mLayout.supportsPredictiveItemAnimations()) {
+        if (predictiveItemAnimationsEnabled()) {
             mAdapterHelper.preProcess();
         } else {
             mAdapterHelper.consumeUpdatesInOnePass();
@@ -2888,10 +2906,10 @@
             }
             // we don't process disappearing list because they may re-appear in post layout pass.
             clearOldPositions();
-            mAdapterHelper.consumePostponedUpdates();
         } else {
             clearOldPositions();
         }
+        mAdapterHelper.consumePostponedUpdates();
         mState.mItemCount = mAdapter.getItemCount();
         mState.mDeletedInvisibleItemCountSincePreviousLayout = 0;
 
@@ -2921,7 +2939,11 @@
                     // run a change animation
                     final ItemHolderInfo preInfo = mViewInfoStore.popFromPreLayout(
                             oldChangeViewHolder);
-                    animateChange(oldChangeViewHolder, holder, preInfo, animationInfo);
+                    if (preInfo == null) {
+                        handleMissingPreInfoForChangeError(key, holder, oldChangeViewHolder);
+                    } else {
+                        animateChange(oldChangeViewHolder, holder, preInfo, animationInfo);
+                    }
                 } else {
                     mViewInfoStore.addToPostLayout(holder, animationInfo);
                 }
@@ -2949,6 +2971,51 @@
     }
 
     /**
+     * This handles the case where there is an unexpected VH missing in the pre-layout map.
+     * <p>
+     * We might be able to detect the error in the application which will help the developer to
+     * resolve the issue.
+     * <p>
+     * If it is not an expected error, we at least print an error to notify the developer and ignore
+     * the animation.
+     *
+     * https://code.google.com/p/android/issues/detail?id=193958
+     *
+     * @param key The change key
+     * @param holder Current ViewHolder
+     * @param oldChangeViewHolder Changed ViewHolder
+     */
+    private void handleMissingPreInfoForChangeError(long key,
+            ViewHolder holder, ViewHolder oldChangeViewHolder) {
+        // check if two VH have the same key, if so, print that as an error
+        final int childCount = mChildHelper.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View view = mChildHelper.getChildAt(i);
+            ViewHolder other = getChildViewHolderInt(view);
+            if (other == holder) {
+                continue;
+            }
+            final long otherKey = getChangedHolderKey(other);
+            if (otherKey == key) {
+                if (mAdapter != null && mAdapter.hasStableIds()) {
+                    throw new IllegalStateException("Two different ViewHolders have the same stable"
+                            + " ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT"
+                            + " change.\n ViewHolder 1:" + other + " \n View Holder 2:" + holder);
+                } else {
+                    throw new IllegalStateException("Two different ViewHolders have the same change"
+                            + " ID. This might happen due to inconsistent Adapter update events or"
+                            + " if the LayoutManager lays out the same View multiple times."
+                            + "\n ViewHolder 1:" + other + " \n View Holder 2:" + holder);
+                }
+            }
+        }
+        // Very unlikely to happen but if it does, notify the developer.
+        Log.e(TAG, "Problem while matching changed view holders with the new"
+                + "ones. The pre-layout information for the change holder " + oldChangeViewHolder
+                + " cannot be found but it is necessary for " + holder);
+    }
+
+    /**
      * Records the animation information for a view holder that was bounced from hidden list. It
      * also clears the bounce back flag.
      */
@@ -3779,6 +3846,10 @@
 
         @Override
         public void run() {
+            if (mLayout == null) {
+                stop();
+                return; // no layout, cannot scroll.
+            }
             disableRunOnAnimationRequests();
             consumePendingUpdateOperations();
             // keep a local reference so that if it is changed during onAnimation method, it won't
@@ -4961,7 +5032,7 @@
             final int cachedCount = mCachedViews.size();
             for (int i = 0; i < cachedCount; i++) {
                 final ViewHolder holder = mCachedViews.get(i);
-                if (holder != null && holder.getLayoutPosition() >= insertedAt) {
+                if (holder != null && holder.mPosition >= insertedAt) {
                     if (DEBUG) {
                         Log.d(TAG, "offsetPositionRecordsForInsert cached " + i + " holder " +
                                 holder + " now at position " + (holder.mPosition + count));
@@ -4983,14 +5054,14 @@
             for (int i = cachedCount - 1; i >= 0; i--) {
                 final ViewHolder holder = mCachedViews.get(i);
                 if (holder != null) {
-                    if (holder.getLayoutPosition() >= removedEnd) {
+                    if (holder.mPosition >= removedEnd) {
                         if (DEBUG) {
                             Log.d(TAG, "offsetPositionRecordsForRemove cached " + i +
                                     " holder " + holder + " now at position " +
                                     (holder.mPosition - count));
                         }
                         holder.offsetPosition(-count, applyToPreLayout);
-                    } else if (holder.getLayoutPosition() >= removedFrom) {
+                    } else if (holder.mPosition >= removedFrom) {
                         // Item for this view was removed. Dump it from the cache.
                         holder.addFlags(ViewHolder.FLAG_REMOVED);
                         recycleCachedViewAt(i);
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
index 72d3e8c..1b85224 100644
--- a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
@@ -16,6 +16,7 @@
 
 package android.support.v7.widget.helper;
 
+import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.os.Build;
@@ -156,6 +157,11 @@
     private static final int ACTION_MODE_DRAG_MASK = ACTION_MODE_SWIPE_MASK << DIRECTION_FLAG_COUNT;
 
     /**
+     * The unit we are using to track velocity
+     */
+    private static final int PIXELS_PER_SECOND = 1000;
+
+    /**
      * Views, whose state should be cleared after they are detached from RecyclerView.
      * This is necessary after swipe dismissing an item. We wait until animator finishes its job
      * to clean these views.
@@ -181,6 +187,16 @@
     float mInitialTouchY;
 
     /**
+     * Set when ItemTouchHelper is assigned to a RecyclerView.
+     */
+    float mSwipeEscapeVelocity;
+
+    /**
+     * Set when ItemTouchHelper is assigned to a RecyclerView.
+     */
+    float mMaxSwipeVelocity;
+
+    /**
      * The diff between the last event and initial touch.
      */
     float mDx;
@@ -366,11 +382,11 @@
                     break;
                 }
                 case MotionEvent.ACTION_CANCEL:
-                case MotionEvent.ACTION_UP:
                     if (mVelocityTracker != null) {
-                        mVelocityTracker
-                                .computeCurrentVelocity(1000, mRecyclerView.getMaxFlingVelocity());
+                        mVelocityTracker.clear();
                     }
+                    // fall through
+                case MotionEvent.ACTION_UP:
                     select(null, ACTION_STATE_IDLE);
                     mActivePointerId = ACTIVE_POINTER_ID_NONE;
                     break;
@@ -378,11 +394,6 @@
                     final int pointerIndex = MotionEventCompat.getActionIndex(event);
                     final int pointerId = MotionEventCompat.getPointerId(event, pointerIndex);
                     if (pointerId == mActivePointerId) {
-                        if (mVelocityTracker != null) {
-                            mVelocityTracker
-                                    .computeCurrentVelocity(1000,
-                                            mRecyclerView.getMaxFlingVelocity());
-                        }
                         // This was our active pointer going up. Choose a new
                         // active pointer and adjust accordingly.
                         final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
@@ -449,6 +460,11 @@
         }
         mRecyclerView = recyclerView;
         if (mRecyclerView != null) {
+            final Resources resources = recyclerView.getResources();
+            mSwipeEscapeVelocity = resources
+                    .getDimension(R.dimen.item_touch_helper_swipe_escape_velocity);
+            mMaxSwipeVelocity = resources
+                    .getDimension(R.dimen.item_touch_helper_swipe_escape_max_velocity);
             setupCallbacks();
         }
     }
@@ -1187,11 +1203,17 @@
         if ((flags & (LEFT | RIGHT)) != 0) {
             final int dirFlag = mDx > 0 ? RIGHT : LEFT;
             if (mVelocityTracker != null && mActivePointerId > -1) {
+                mVelocityTracker.computeCurrentVelocity(PIXELS_PER_SECOND,
+                        mCallback.getSwipeVelocityThreshold(mMaxSwipeVelocity));
                 final float xVelocity = VelocityTrackerCompat
                         .getXVelocity(mVelocityTracker, mActivePointerId);
+                final float yVelocity = VelocityTrackerCompat
+                        .getYVelocity(mVelocityTracker, mActivePointerId);
                 final int velDirFlag = xVelocity > 0f ? RIGHT : LEFT;
+                final float absXVelocity = Math.abs(xVelocity);
                 if ((velDirFlag & flags) != 0 && dirFlag == velDirFlag &&
-                        Math.abs(xVelocity) >= mRecyclerView.getMinFlingVelocity()) {
+                        absXVelocity >= mCallback.getSwipeEscapeVelocity(mSwipeEscapeVelocity) &&
+                        absXVelocity > Math.abs(yVelocity)) {
                     return velDirFlag;
                 }
             }
@@ -1210,11 +1232,17 @@
         if ((flags & (UP | DOWN)) != 0) {
             final int dirFlag = mDy > 0 ? DOWN : UP;
             if (mVelocityTracker != null && mActivePointerId > -1) {
+                mVelocityTracker.computeCurrentVelocity(PIXELS_PER_SECOND,
+                        mCallback.getSwipeVelocityThreshold(mMaxSwipeVelocity));
+                final float xVelocity = VelocityTrackerCompat
+                        .getXVelocity(mVelocityTracker, mActivePointerId);
                 final float yVelocity = VelocityTrackerCompat
                         .getYVelocity(mVelocityTracker, mActivePointerId);
                 final int velDirFlag = yVelocity > 0f ? DOWN : UP;
+                final float absYVelocity = Math.abs(yVelocity);
                 if ((velDirFlag & flags) != 0 && velDirFlag == dirFlag &&
-                        Math.abs(yVelocity) >= mRecyclerView.getMinFlingVelocity()) {
+                        absYVelocity >= mCallback.getSwipeEscapeVelocity(mSwipeEscapeVelocity) &&
+                        absYVelocity > Math.abs(xVelocity)) {
                     return velDirFlag;
                 }
             }
@@ -1660,6 +1688,57 @@
         }
 
         /**
+         * Defines the minimum velocity which will be considered as a swipe action by the user.
+         * <p>
+         * You can increase this value to make it harder to swipe or decrease it to make it easier.
+         * Keep in mind that ItemTouchHelper also checks the perpendicular velocity and makes sure
+         * current direction velocity is larger then the perpendicular one. Otherwise, user's
+         * movement is ambiguous. You can change the threshold via
+         * {@link #getSwipeVelocityThreshold(float)}.
+         * <p>
+         * The velocity is calculated in pixels per second.
+         * <p>
+         * The default framework value is passed as a parameter so that you can modify it with a
+         * multiplier.
+         *
+         * @param defaultValue The default value (in pixels per second) used by the ItemTouchHelper.
+         *
+         * @return The minimum swipe velocity. The default implementation returns the
+         * <code>defaultValue</code> parameter.
+         *
+         * @see #getSwipeVelocityThreshold(float)
+         * @see #getSwipeThreshold(ViewHolder)
+         */
+        public float getSwipeEscapeVelocity(float defaultValue) {
+            return defaultValue;
+        }
+
+        /**
+         * Defines the maximum velocity ItemTouchHelper will ever calculate for pointer movements.
+         * <p>
+         * To consider a movement as swipe, ItemTouchHelper requires it to be larger than the
+         * perpendicular movement. If both directions reach to the max threshold, none of them will
+         * be considered as a swipe because it is usually an indication that user rather tried to
+         * scroll then swipe.
+         * <p>
+         * The velocity is calculated in pixels per second.
+         * <p>
+         * You can customize this behavior by changing this method. If you increase the value, it
+         * will be easier for the user to swipe diagonally and if you decrease the value, user will
+         * need to make a rather straight finger movement to trigger a swipe.
+         *
+         * @param defaultValue The default value(in pixels per second) used by the ItemTouchHelper.
+         *
+         * @return The velocity cap for pointer movements. The default implementation returns the
+         * <code>defaultValue</code> parameter.
+         *
+         * @see #getSwipeEscapeVelocity(float)
+         */
+        public float getSwipeVelocityThreshold(float defaultValue) {
+            return defaultValue;
+        }
+
+        /**
          * Called by ItemTouchHelper to select a drop target from the list of ViewHolders that
          * are under the dragged View.
          * <p>
diff --git a/v7/recyclerview/tests/NO_DOCS b/v7/recyclerview/tests/NO_DOCS
new file mode 100644
index 0000000..0c81e4a
--- /dev/null
+++ b/v7/recyclerview/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
index c5f3408..f45e485 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
@@ -368,6 +368,15 @@
         });
     }
 
+    public void setVisibility(final View view, final int visibility) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                view.setVisibility(visibility);
+            }
+        });
+    }
+
     class TestViewHolder extends RecyclerView.ViewHolder {
 
         Item mBoundItem;
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 0b9ef15..e2d1569 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
@@ -29,6 +29,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -38,6 +39,39 @@
 
     final List<TestViewHolder> recycledVHs = new ArrayList<>();
 
+    public void testDetectStableIdError() throws Throwable {
+        final AtomicBoolean useBadIds = new AtomicBoolean(false);
+        TestAdapter adapter = new TestAdapter(10) {
+            @Override
+            public long getItemId(int position) {
+                if (useBadIds.get() && position == 5) {
+                    return super.getItemId(position) - 1;
+                }
+                return super.getItemId(position);
+            }
+
+            @Override
+            public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
+                // ignore validation
+            }
+        };
+        adapter.setHasStableIds(true);
+        setupBasic(10, 0, 10, adapter);
+        mLayoutManager.expectLayouts(2);
+        useBadIds.set(true);
+        adapter.changeAndNotify(4, 2);
+        mLayoutManager.waitForLayout(2);
+        assertTrue(mainThreadException instanceof IllegalStateException);
+        assertTrue(mainThreadException.getMessage()
+                .contains("Two different ViewHolders have the same stable ID."));
+        // TODO don't use this after moving this class to Junit 4
+        try {
+            removeRecyclerView();
+        } catch (Throwable t){}
+        mainThreadException = null;
+    }
+
+
     public void testDontLayoutReusedViewWithoutPredictive() throws Throwable {
         reuseHiddenViewTest(new ReuseTestCallback() {
             @Override
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
index 06dcbb0..917680b 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
@@ -28,6 +28,8 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 public class RecyclerViewBasicTest extends AndroidTestCase {
@@ -170,6 +172,49 @@
                 adapterNew, null);
     }
 
+    public void testRecyclerOffsetsOnMove() {
+        MockLayoutManager  layoutManager = new MockLayoutManager();
+        final List<RecyclerView.ViewHolder> recycledVhs = new ArrayList<>();
+        mRecyclerView.setLayoutManager(layoutManager);
+        MockAdapter adapter = new MockAdapter(100) {
+            @Override
+            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+                super.onViewRecycled(holder);
+                recycledVhs.add(holder);
+            }
+        };
+        MockViewHolder mvh = new MockViewHolder(new TextView(getContext()));
+        mRecyclerView.setAdapter(adapter);
+        adapter.bindViewHolder(mvh, 20);
+        mRecyclerView.mRecycler.mCachedViews.add(mvh);
+        mRecyclerView.offsetPositionRecordsForRemove(10, 9, false);
+
+        mRecyclerView.offsetPositionRecordsForRemove(11, 1, false);
+        assertEquals(1, recycledVhs.size());
+        assertSame(mvh, recycledVhs.get(0));
+    }
+
+    public void testRecyclerOffsetsOnAdd() {
+        MockLayoutManager  layoutManager = new MockLayoutManager();
+        final List<RecyclerView.ViewHolder> recycledVhs = new ArrayList<>();
+        mRecyclerView.setLayoutManager(layoutManager);
+        MockAdapter adapter = new MockAdapter(100) {
+            @Override
+            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+                super.onViewRecycled(holder);
+                recycledVhs.add(holder);
+            }
+        };
+        MockViewHolder mvh = new MockViewHolder(new TextView(getContext()));
+        mRecyclerView.setAdapter(adapter);
+        adapter.bindViewHolder(mvh, 20);
+        mRecyclerView.mRecycler.mCachedViews.add(mvh);
+        mRecyclerView.offsetPositionRecordsForRemove(10, 9, false);
+
+        mRecyclerView.offsetPositionRecordsForInsert(15, 10);
+        assertEquals(11, mvh.mPosition);
+    }
+
     public void testSavedStateWithStatelessLayoutManager() throws InterruptedException {
         mRecyclerView.setLayoutManager(new MockLayoutManager() {
             @Override
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 6fb9592..d6c1f28 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
@@ -2952,6 +2952,81 @@
     }
 
     @Test
+    public void testFirstLayoutWithAdapterChanges() throws Throwable {
+        final TestAdapter adapter = new TestAdapter(0);
+        final RecyclerView rv = new RecyclerView(getActivity());
+        setVisibility(rv, View.GONE);
+        TestLayoutManager tlm = new TestLayoutManager() {
+            @Override
+            public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+                try {
+                    super.onLayoutChildren(recycler, state);
+                    layoutRange(recycler, 0, state.getItemCount());
+                } catch (Throwable t) {
+                    postExceptionToInstrumentation(t);
+                } finally {
+                    layoutLatch.countDown();
+                }
+            }
+
+            @Override
+            public boolean supportsPredictiveItemAnimations() {
+                return true;
+            }
+        };
+        rv.setLayoutManager(tlm);
+        rv.setAdapter(adapter);
+        rv.setHasFixedSize(true);
+        setRecyclerView(rv);
+        tlm.expectLayouts(1);
+        tlm.assertNoLayout("test sanity, layout should not run", 1);
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    adapter.addAndNotify(2);
+                } catch (Throwable throwable) {
+                    throwable.printStackTrace();
+                }
+                rv.setVisibility(View.VISIBLE);
+            }
+        });
+        checkForMainThreadException();
+        tlm.waitForLayout(2);
+        assertEquals(2, rv.getChildCount());
+        checkForMainThreadException();
+    }
+
+    @Test
+    public void computeScrollOfsetWithoutLayoutManager() throws Throwable {
+        RecyclerView rv = new RecyclerView(getActivity());
+        rv.setAdapter(new TestAdapter(10));
+        setRecyclerView(rv);
+        assertEquals(0, rv.computeHorizontalScrollExtent());
+        assertEquals(0, rv.computeHorizontalScrollOffset());
+        assertEquals(0, rv.computeHorizontalScrollRange());
+
+        assertEquals(0, rv.computeVerticalScrollExtent());
+        assertEquals(0, rv.computeVerticalScrollOffset());
+        assertEquals(0, rv.computeVerticalScrollRange());
+    }
+
+    @Test
+    public void computeScrollOfsetWithoutAdapter() throws Throwable {
+        RecyclerView rv = new RecyclerView(getActivity());
+        rv.setLayoutManager(new TestLayoutManager());
+        setRecyclerView(rv);
+        assertEquals(0, rv.computeHorizontalScrollExtent());
+        assertEquals(0, rv.computeHorizontalScrollOffset());
+        assertEquals(0, rv.computeHorizontalScrollRange());
+
+        assertEquals(0, rv.computeVerticalScrollExtent());
+        assertEquals(0, rv.computeVerticalScrollOffset());
+        assertEquals(0, rv.computeVerticalScrollRange());
+    }
+
+    @Test
     public void testFocusRectOnScreenWithDecorOffsets() throws Throwable {
         focusRectOnScreenTest(true);
     }
@@ -2961,7 +3036,6 @@
         focusRectOnScreenTest(false);
     }
 
-
     public void focusRectOnScreenTest(boolean addItemDecors) throws Throwable {
         RecyclerView rv = new RecyclerView(getActivity());
         final AtomicInteger scrollDist = new AtomicInteger(0);
diff --git a/v8/renderscript/api/23.1.1.txt b/v8/renderscript/api/23.1.1.txt
new file mode 100644
index 0000000..929bd5f
--- /dev/null
+++ b/v8/renderscript/api/23.1.1.txt
@@ -0,0 +1,1011 @@
+package android.support.v8.renderscript {
+
+  public class Allocation extends android.support.v8.renderscript.BaseObj {
+    method public void copy1DRangeFrom(int, int, java.lang.Object);
+    method public void copy1DRangeFrom(int, int, int[]);
+    method public void copy1DRangeFrom(int, int, short[]);
+    method public void copy1DRangeFrom(int, int, byte[]);
+    method public void copy1DRangeFrom(int, int, float[]);
+    method public void copy1DRangeFrom(int, int, android.support.v8.renderscript.Allocation, int);
+    method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
+    method public void copy1DRangeFromUnchecked(int, int, int[]);
+    method public void copy1DRangeFromUnchecked(int, int, short[]);
+    method public void copy1DRangeFromUnchecked(int, int, byte[]);
+    method public void copy1DRangeFromUnchecked(int, int, float[]);
+    method public void copy1DRangeTo(int, int, java.lang.Object);
+    method public void copy1DRangeTo(int, int, int[]);
+    method public void copy1DRangeTo(int, int, short[]);
+    method public void copy1DRangeTo(int, int, byte[]);
+    method public void copy1DRangeTo(int, int, float[]);
+    method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
+    method public void copy1DRangeToUnchecked(int, int, int[]);
+    method public void copy1DRangeToUnchecked(int, int, short[]);
+    method public void copy1DRangeToUnchecked(int, int, byte[]);
+    method public void copy1DRangeToUnchecked(int, int, float[]);
+    method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
+    method public void copy2DRangeFrom(int, int, int, int, byte[]);
+    method public void copy2DRangeFrom(int, int, int, int, short[]);
+    method public void copy2DRangeFrom(int, int, int, int, int[]);
+    method public void copy2DRangeFrom(int, int, int, int, float[]);
+    method public void copy2DRangeFrom(int, int, int, int, android.support.v8.renderscript.Allocation, int, int);
+    method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
+    method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
+    method public void copy2DRangeTo(int, int, int, int, byte[]);
+    method public void copy2DRangeTo(int, int, int, int, short[]);
+    method public void copy2DRangeTo(int, int, int, int, int[]);
+    method public void copy2DRangeTo(int, int, int, int, float[]);
+    method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
+    method public void copy3DRangeFrom(int, int, int, int, int, int, android.support.v8.renderscript.Allocation, int, int, int);
+    method public void copyFrom(android.support.v8.renderscript.BaseObj[]);
+    method public void copyFrom(java.lang.Object);
+    method public void copyFrom(int[]);
+    method public void copyFrom(short[]);
+    method public void copyFrom(byte[]);
+    method public void copyFrom(float[]);
+    method public void copyFrom(android.graphics.Bitmap);
+    method public void copyFrom(android.support.v8.renderscript.Allocation);
+    method public void copyFromUnchecked(java.lang.Object);
+    method public void copyFromUnchecked(int[]);
+    method public void copyFromUnchecked(short[]);
+    method public void copyFromUnchecked(byte[]);
+    method public void copyFromUnchecked(float[]);
+    method public void copyTo(android.graphics.Bitmap);
+    method public void copyTo(java.lang.Object);
+    method public void copyTo(byte[]);
+    method public void copyTo(short[]);
+    method public void copyTo(int[]);
+    method public void copyTo(float[]);
+    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
+    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
+    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
+    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap);
+    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
+    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
+    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int, android.support.v8.renderscript.Allocation.MipmapControl, int);
+    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
+    method public static android.support.v8.renderscript.Allocation createFromString(android.support.v8.renderscript.RenderScript, java.lang.String, int);
+    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
+    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
+    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, android.support.v8.renderscript.Allocation.MipmapControl, int);
+    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, int);
+    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type);
+    method public void generateMipmaps();
+    method public int getBytesSize();
+    method public android.support.v8.renderscript.Element getElement();
+    method public long getIncAllocID();
+    method public android.support.v8.renderscript.Type getType();
+    method public int getUsage();
+    method public void ioReceive();
+    method public void ioSend();
+    method public void ioSendOutput();
+    method public void setAutoPadding(boolean);
+    method public void setFromFieldPacker(int, android.support.v8.renderscript.FieldPacker);
+    method public void setFromFieldPacker(int, int, android.support.v8.renderscript.FieldPacker);
+    method public void setIncAllocID(long);
+    method public void setSurface(android.view.Surface);
+    method public void syncAll(int);
+    field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
+    field public static final int USAGE_IO_INPUT = 32; // 0x20
+    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
+    field public static final int USAGE_SCRIPT = 1; // 0x1
+    field public static final int USAGE_SHARED = 128; // 0x80
+  }
+
+  public static final class Allocation.MipmapControl extends java.lang.Enum {
+    method public static android.support.v8.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.Allocation.MipmapControl[] values();
+    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_FULL;
+    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_NONE;
+    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
+  }
+
+  public class BaseObj {
+    method public void destroy();
+  }
+
+  public class Byte2 {
+    ctor public Byte2();
+    ctor public Byte2(byte, byte);
+    field public byte x;
+    field public byte y;
+  }
+
+  public class Byte3 {
+    ctor public Byte3();
+    ctor public Byte3(byte, byte, byte);
+    field public byte x;
+    field public byte y;
+    field public byte z;
+  }
+
+  public class Byte4 {
+    ctor public Byte4();
+    ctor public Byte4(byte, byte, byte, byte);
+    field public byte w;
+    field public byte x;
+    field public byte y;
+    field public byte z;
+  }
+
+  public class Double2 {
+    ctor public Double2();
+    ctor public Double2(double, double);
+    field public double x;
+    field public double y;
+  }
+
+  public class Double3 {
+    ctor public Double3();
+    ctor public Double3(double, double, double);
+    field public double x;
+    field public double y;
+    field public double z;
+  }
+
+  public class Double4 {
+    ctor public Double4();
+    ctor public Double4(double, double, double, double);
+    field public double w;
+    field public double x;
+    field public double y;
+    field public double z;
+  }
+
+  public class Element extends android.support.v8.renderscript.BaseObj {
+    method public static android.support.v8.renderscript.Element ALLOCATION(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element A_8(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element BOOLEAN(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element ELEMENT(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F32(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F32_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F32_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F32_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F64(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F64_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F64_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element F64_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I16(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I16_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I16_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I16_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I32(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I32_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I32_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I32_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I64(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I64_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I64_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I64_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I8(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I8_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I8_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element I8_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element MATRIX_2X2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element MATRIX_3X3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element MATRIX_4X4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element RGBA_4444(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element RGBA_5551(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element RGBA_8888(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element RGB_565(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element RGB_888(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element SAMPLER(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element SCRIPT(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element TYPE(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U16(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U16_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U16_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U16_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U32(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U32_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U32_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U32_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U64(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U64_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U64_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U64_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U8(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U8_2(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U8_3(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element U8_4(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Element createPixel(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, android.support.v8.renderscript.Element.DataKind);
+    method public static android.support.v8.renderscript.Element createVector(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, int);
+    method public int getBytesSize();
+    method public android.support.v8.renderscript.Element.DataKind getDataKind();
+    method public android.support.v8.renderscript.Element.DataType getDataType();
+    method public long getDummyElement(android.support.v8.renderscript.RenderScript);
+    method public android.support.v8.renderscript.Element getSubElement(int);
+    method public int getSubElementArraySize(int);
+    method public int getSubElementCount();
+    method public java.lang.String getSubElementName(int);
+    method public int getSubElementOffsetBytes(int);
+    method public int getVectorSize();
+    method public boolean isCompatible(android.support.v8.renderscript.Element);
+    method public boolean isComplex();
+  }
+
+  public static class Element.Builder {
+    ctor public Element.Builder(android.support.v8.renderscript.RenderScript);
+    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String, int);
+    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String);
+    method public android.support.v8.renderscript.Element create();
+  }
+
+  public static final class Element.DataKind extends java.lang.Enum {
+    method public static android.support.v8.renderscript.Element.DataKind valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.Element.DataKind[] values();
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_A;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_DEPTH;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_L;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_LA;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGB;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGBA;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_YUV;
+    enum_constant public static final android.support.v8.renderscript.Element.DataKind USER;
+  }
+
+  public static final class Element.DataType extends java.lang.Enum {
+    method public static android.support.v8.renderscript.Element.DataType valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.Element.DataType[] values();
+    enum_constant public static final android.support.v8.renderscript.Element.DataType BOOLEAN;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_32;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_64;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_2X2;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_3X3;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_4X4;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType NONE;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ALLOCATION;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ELEMENT;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SAMPLER;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SCRIPT;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_TYPE;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_16;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_32;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_64;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_8;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_16;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_32;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_4_4_4_4;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_5_5_1;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_6_5;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_64;
+    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_8;
+  }
+
+  public class FieldPacker {
+    ctor public FieldPacker(int);
+    ctor public FieldPacker(byte[]);
+    method public void addBoolean(boolean);
+    method public void addF32(float);
+    method public void addF32(android.support.v8.renderscript.Float2);
+    method public void addF32(android.support.v8.renderscript.Float3);
+    method public void addF32(android.support.v8.renderscript.Float4);
+    method public void addF64(double);
+    method public void addF64(android.support.v8.renderscript.Double2);
+    method public void addF64(android.support.v8.renderscript.Double3);
+    method public void addF64(android.support.v8.renderscript.Double4);
+    method public void addI16(short);
+    method public void addI16(android.support.v8.renderscript.Short2);
+    method public void addI16(android.support.v8.renderscript.Short3);
+    method public void addI16(android.support.v8.renderscript.Short4);
+    method public void addI32(int);
+    method public void addI32(android.support.v8.renderscript.Int2);
+    method public void addI32(android.support.v8.renderscript.Int3);
+    method public void addI32(android.support.v8.renderscript.Int4);
+    method public void addI64(long);
+    method public void addI64(android.support.v8.renderscript.Long2);
+    method public void addI64(android.support.v8.renderscript.Long3);
+    method public void addI64(android.support.v8.renderscript.Long4);
+    method public void addI8(byte);
+    method public void addI8(android.support.v8.renderscript.Byte2);
+    method public void addI8(android.support.v8.renderscript.Byte3);
+    method public void addI8(android.support.v8.renderscript.Byte4);
+    method public void addMatrix(android.support.v8.renderscript.Matrix4f);
+    method public void addMatrix(android.support.v8.renderscript.Matrix3f);
+    method public void addMatrix(android.support.v8.renderscript.Matrix2f);
+    method public void addObj(android.support.v8.renderscript.BaseObj);
+    method public void addU16(int);
+    method public void addU16(android.support.v8.renderscript.Int2);
+    method public void addU16(android.support.v8.renderscript.Int3);
+    method public void addU16(android.support.v8.renderscript.Int4);
+    method public void addU32(long);
+    method public void addU32(android.support.v8.renderscript.Long2);
+    method public void addU32(android.support.v8.renderscript.Long3);
+    method public void addU32(android.support.v8.renderscript.Long4);
+    method public void addU64(long);
+    method public void addU64(android.support.v8.renderscript.Long2);
+    method public void addU64(android.support.v8.renderscript.Long3);
+    method public void addU64(android.support.v8.renderscript.Long4);
+    method public void addU8(short);
+    method public void addU8(android.support.v8.renderscript.Short2);
+    method public void addU8(android.support.v8.renderscript.Short3);
+    method public void addU8(android.support.v8.renderscript.Short4);
+    method public void align(int);
+    method public final byte[] getData();
+    method public void reset();
+    method public void reset(int);
+    method public void skip(int);
+    method public boolean subBoolean();
+    method public android.support.v8.renderscript.Byte2 subByte2();
+    method public android.support.v8.renderscript.Byte3 subByte3();
+    method public android.support.v8.renderscript.Byte4 subByte4();
+    method public android.support.v8.renderscript.Double2 subDouble2();
+    method public android.support.v8.renderscript.Double3 subDouble3();
+    method public android.support.v8.renderscript.Double4 subDouble4();
+    method public float subF32();
+    method public double subF64();
+    method public android.support.v8.renderscript.Float2 subFloat2();
+    method public android.support.v8.renderscript.Float3 subFloat3();
+    method public android.support.v8.renderscript.Float4 subFloat4();
+    method public short subI16();
+    method public int subI32();
+    method public long subI64();
+    method public byte subI8();
+    method public android.support.v8.renderscript.Int2 subInt2();
+    method public android.support.v8.renderscript.Int3 subInt3();
+    method public android.support.v8.renderscript.Int4 subInt4();
+    method public android.support.v8.renderscript.Long2 subLong2();
+    method public android.support.v8.renderscript.Long3 subLong3();
+    method public android.support.v8.renderscript.Long4 subLong4();
+    method public android.support.v8.renderscript.Matrix2f subMatrix2f();
+    method public android.support.v8.renderscript.Matrix3f subMatrix3f();
+    method public android.support.v8.renderscript.Matrix4f subMatrix4f();
+    method public android.support.v8.renderscript.Short2 subShort2();
+    method public android.support.v8.renderscript.Short3 subShort3();
+    method public android.support.v8.renderscript.Short4 subShort4();
+    method public void subalign(int);
+  }
+
+  public class Float2 {
+    ctor public Float2();
+    ctor public Float2(float, float);
+    field public float x;
+    field public float y;
+  }
+
+  public class Float3 {
+    ctor public Float3();
+    ctor public Float3(float, float, float);
+    field public float x;
+    field public float y;
+    field public float z;
+  }
+
+  public class Float4 {
+    ctor public Float4();
+    ctor public Float4(float, float, float, float);
+    field public float w;
+    field public float x;
+    field public float y;
+    field public float z;
+  }
+
+  public class Int2 {
+    ctor public Int2();
+    ctor public Int2(int, int);
+    field public int x;
+    field public int y;
+  }
+
+  public class Int3 {
+    ctor public Int3();
+    ctor public Int3(int, int, int);
+    field public int x;
+    field public int y;
+    field public int z;
+  }
+
+  public class Int4 {
+    ctor public Int4();
+    ctor public Int4(int, int, int, int);
+    field public int w;
+    field public int x;
+    field public int y;
+    field public int z;
+  }
+
+  public class Long2 {
+    ctor public Long2();
+    ctor public Long2(long, long);
+    field public long x;
+    field public long y;
+  }
+
+  public class Long3 {
+    ctor public Long3();
+    ctor public Long3(long, long, long);
+    field public long x;
+    field public long y;
+    field public long z;
+  }
+
+  public class Long4 {
+    ctor public Long4();
+    ctor public Long4(long, long, long, long);
+    field public long w;
+    field public long x;
+    field public long y;
+    field public long z;
+  }
+
+  public class Matrix2f {
+    ctor public Matrix2f();
+    ctor public Matrix2f(float[]);
+    method public float get(int, int);
+    method public float[] getArray();
+    method public void load(android.support.v8.renderscript.Matrix2f);
+    method public void loadIdentity();
+    method public void loadMultiply(android.support.v8.renderscript.Matrix2f, android.support.v8.renderscript.Matrix2f);
+    method public void loadRotate(float);
+    method public void loadScale(float, float);
+    method public void multiply(android.support.v8.renderscript.Matrix2f);
+    method public void rotate(float);
+    method public void scale(float, float);
+    method public void set(int, int, float);
+    method public void transpose();
+  }
+
+  public class Matrix3f {
+    ctor public Matrix3f();
+    ctor public Matrix3f(float[]);
+    method public float get(int, int);
+    method public float[] getArray();
+    method public void load(android.support.v8.renderscript.Matrix3f);
+    method public void loadIdentity();
+    method public void loadMultiply(android.support.v8.renderscript.Matrix3f, android.support.v8.renderscript.Matrix3f);
+    method public void loadRotate(float, float, float, float);
+    method public void loadRotate(float);
+    method public void loadScale(float, float);
+    method public void loadScale(float, float, float);
+    method public void loadTranslate(float, float);
+    method public void multiply(android.support.v8.renderscript.Matrix3f);
+    method public void rotate(float, float, float, float);
+    method public void rotate(float);
+    method public void scale(float, float);
+    method public void scale(float, float, float);
+    method public void set(int, int, float);
+    method public void translate(float, float);
+    method public void transpose();
+  }
+
+  public class Matrix4f {
+    ctor public Matrix4f();
+    ctor public Matrix4f(float[]);
+    method public float get(int, int);
+    method public float[] getArray();
+    method public boolean inverse();
+    method public boolean inverseTranspose();
+    method public void load(android.support.v8.renderscript.Matrix4f);
+    method public void loadFrustum(float, float, float, float, float, float);
+    method public void loadIdentity();
+    method public void loadMultiply(android.support.v8.renderscript.Matrix4f, android.support.v8.renderscript.Matrix4f);
+    method public void loadOrtho(float, float, float, float, float, float);
+    method public void loadOrthoWindow(int, int);
+    method public void loadPerspective(float, float, float, float);
+    method public void loadProjectionNormalized(int, int);
+    method public void loadRotate(float, float, float, float);
+    method public void loadScale(float, float, float);
+    method public void loadTranslate(float, float, float);
+    method public void multiply(android.support.v8.renderscript.Matrix4f);
+    method public void rotate(float, float, float, float);
+    method public void scale(float, float, float);
+    method public void set(int, int, float);
+    method public void translate(float, float, float);
+    method public void transpose();
+  }
+
+  public class RSDriverException extends android.support.v8.renderscript.RSRuntimeException {
+    ctor public RSDriverException(java.lang.String);
+  }
+
+  public class RSIllegalArgumentException extends android.support.v8.renderscript.RSRuntimeException {
+    ctor public RSIllegalArgumentException(java.lang.String);
+  }
+
+  public class RSInvalidStateException extends android.support.v8.renderscript.RSRuntimeException {
+    ctor public RSInvalidStateException(java.lang.String);
+  }
+
+  public class RSRuntimeException extends java.lang.RuntimeException {
+    ctor public RSRuntimeException(java.lang.String);
+  }
+
+  public class RenderScript {
+    method public void contextDump();
+    method public static android.support.v8.renderscript.RenderScript create(android.content.Context);
+    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType);
+    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int);
+    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, int, android.support.v8.renderscript.RenderScript.ContextType, int);
+    method public static android.support.v8.renderscript.RenderScript createMultiContext(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int, int);
+    method public void destroy();
+    method public void finish();
+    method public static void forceCompat();
+    method public final android.content.Context getApplicationContext();
+    method public android.support.v8.renderscript.RenderScript.RSErrorHandler getErrorHandler();
+    method public android.support.v8.renderscript.RenderScript.RSMessageHandler getMessageHandler();
+    method public static void releaseAllContexts();
+    method public void sendMessage(int, int[]);
+    method public static void setBlackList(java.lang.String);
+    method public void setErrorHandler(android.support.v8.renderscript.RenderScript.RSErrorHandler);
+    method public void setMessageHandler(android.support.v8.renderscript.RenderScript.RSMessageHandler);
+    method public void setPriority(android.support.v8.renderscript.RenderScript.Priority);
+    field public static final int CREATE_FLAG_NONE = 0; // 0x0
+  }
+
+  public static final class RenderScript.ContextType extends java.lang.Enum {
+    method public static android.support.v8.renderscript.RenderScript.ContextType valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.RenderScript.ContextType[] values();
+    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType DEBUG;
+    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType NORMAL;
+    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType PROFILE;
+  }
+
+  public static final class RenderScript.Priority extends java.lang.Enum {
+    method public static android.support.v8.renderscript.RenderScript.Priority valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.RenderScript.Priority[] values();
+    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority LOW;
+    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority NORMAL;
+  }
+
+  public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
+    ctor public RenderScript.RSErrorHandler();
+    method public void run();
+    field protected java.lang.String mErrorMessage;
+    field protected int mErrorNum;
+  }
+
+  public static class RenderScript.RSMessageHandler implements java.lang.Runnable {
+    ctor public RenderScript.RSMessageHandler();
+    method public void run();
+    field protected int[] mData;
+    field protected int mID;
+    field protected int mLength;
+  }
+
+  public class Sampler extends android.support.v8.renderscript.BaseObj {
+    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler CLAMP_NEAREST(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_LINEAR(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_NEAREST(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.Sampler WRAP_NEAREST(android.support.v8.renderscript.RenderScript);
+    method public float getAnisotropy();
+    method public android.support.v8.renderscript.Sampler.Value getMagnification();
+    method public android.support.v8.renderscript.Sampler.Value getMinification();
+    method public android.support.v8.renderscript.Sampler.Value getWrapS();
+    method public android.support.v8.renderscript.Sampler.Value getWrapT();
+  }
+
+  public static class Sampler.Builder {
+    ctor public Sampler.Builder(android.support.v8.renderscript.RenderScript);
+    method public android.support.v8.renderscript.Sampler create();
+    method public void setAnisotropy(float);
+    method public void setMagnification(android.support.v8.renderscript.Sampler.Value);
+    method public void setMinification(android.support.v8.renderscript.Sampler.Value);
+    method public void setWrapS(android.support.v8.renderscript.Sampler.Value);
+    method public void setWrapT(android.support.v8.renderscript.Sampler.Value);
+  }
+
+  public static final class Sampler.Value extends java.lang.Enum {
+    method public static android.support.v8.renderscript.Sampler.Value valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.Sampler.Value[] values();
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value CLAMP;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_NEAREST;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value MIRRORED_REPEAT;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value NEAREST;
+    enum_constant public static final android.support.v8.renderscript.Sampler.Value WRAP;
+  }
+
+  public class Script extends android.support.v8.renderscript.BaseObj {
+    method public void bindAllocation(android.support.v8.renderscript.Allocation, int);
+    method protected android.support.v8.renderscript.Script.FieldID createFieldID(int, android.support.v8.renderscript.Element);
+    method protected android.support.v8.renderscript.Script.InvokeID createInvokeID(int);
+    method protected android.support.v8.renderscript.Script.KernelID createKernelID(int, int, android.support.v8.renderscript.Element, android.support.v8.renderscript.Element);
+    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker);
+    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Script.LaunchOptions);
+    method protected void invoke(int);
+    method protected void invoke(int, android.support.v8.renderscript.FieldPacker);
+    method protected boolean isIncSupp();
+    method protected void setIncSupp(boolean);
+    method public void setTimeZone(java.lang.String);
+    method public void setVar(int, float);
+    method public void setVar(int, double);
+    method public void setVar(int, int);
+    method public void setVar(int, long);
+    method public void setVar(int, boolean);
+    method public void setVar(int, android.support.v8.renderscript.BaseObj);
+    method public void setVar(int, android.support.v8.renderscript.FieldPacker);
+    method public void setVar(int, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Element, int[]);
+  }
+
+  public static class Script.Builder {
+  }
+
+  public static class Script.FieldBase {
+    ctor protected Script.FieldBase();
+    method public android.support.v8.renderscript.Allocation getAllocation();
+    method public android.support.v8.renderscript.Element getElement();
+    method public android.support.v8.renderscript.Type getType();
+    method protected void init(android.support.v8.renderscript.RenderScript, int);
+    method protected void init(android.support.v8.renderscript.RenderScript, int, int);
+    method public void updateAllocation();
+    field protected android.support.v8.renderscript.Allocation mAllocation;
+    field protected android.support.v8.renderscript.Element mElement;
+  }
+
+  public static final class Script.FieldID extends android.support.v8.renderscript.BaseObj {
+  }
+
+  public static final class Script.InvokeID extends android.support.v8.renderscript.BaseObj {
+  }
+
+  public static final class Script.KernelID extends android.support.v8.renderscript.BaseObj {
+  }
+
+  public static final class Script.LaunchOptions {
+    ctor public Script.LaunchOptions();
+    method public int getXEnd();
+    method public int getXStart();
+    method public int getYEnd();
+    method public int getYStart();
+    method public int getZEnd();
+    method public int getZStart();
+    method public android.support.v8.renderscript.Script.LaunchOptions setX(int, int);
+    method public android.support.v8.renderscript.Script.LaunchOptions setY(int, int);
+    method public android.support.v8.renderscript.Script.LaunchOptions setZ(int, int);
+  }
+
+  public class ScriptC extends android.support.v8.renderscript.Script {
+    ctor protected ScriptC(long, android.support.v8.renderscript.RenderScript);
+    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
+    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, java.lang.String, byte[], byte[]);
+  }
+
+  public final class ScriptGroup extends android.support.v8.renderscript.BaseObj {
+    method public java.lang.Object[] execute(java.lang.Object...);
+    method public deprecated void execute();
+    method public deprecated void setInput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
+    method public deprecated void setOutput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
+  }
+
+  public static final class ScriptGroup.Binding {
+    ctor public ScriptGroup.Binding(android.support.v8.renderscript.Script.FieldID, java.lang.Object);
+    method public android.support.v8.renderscript.Script.FieldID getField();
+    method public java.lang.Object getValue();
+  }
+
+  public static final deprecated class ScriptGroup.Builder {
+    ctor public ScriptGroup.Builder(android.support.v8.renderscript.RenderScript);
+    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.FieldID);
+    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.KernelID);
+    method public android.support.v8.renderscript.ScriptGroup.Builder addKernel(android.support.v8.renderscript.Script.KernelID);
+    method public android.support.v8.renderscript.ScriptGroup create();
+  }
+
+  public static final class ScriptGroup.Builder2 {
+    ctor public ScriptGroup.Builder2(android.support.v8.renderscript.RenderScript);
+    method public android.support.v8.renderscript.ScriptGroup.Input addInput();
+    method public android.support.v8.renderscript.ScriptGroup.Closure addInvoke(android.support.v8.renderscript.Script.InvokeID, java.lang.Object...);
+    method public android.support.v8.renderscript.ScriptGroup.Closure addKernel(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Type, java.lang.Object...);
+    method public android.support.v8.renderscript.ScriptGroup create(java.lang.String, android.support.v8.renderscript.ScriptGroup.Future...);
+  }
+
+  public static final class ScriptGroup.Closure extends android.support.v8.renderscript.BaseObj {
+    method public android.support.v8.renderscript.ScriptGroup.Future getGlobal(android.support.v8.renderscript.Script.FieldID);
+    method public android.support.v8.renderscript.ScriptGroup.Future getReturn();
+  }
+
+  public static final class ScriptGroup.Future {
+  }
+
+  public static final class ScriptGroup.Input {
+  }
+
+  public abstract class ScriptIntrinsic extends android.support.v8.renderscript.Script {
+  }
+
+  public class ScriptIntrinsic3DLUT extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsic3DLUT(long, android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public static android.support.v8.renderscript.ScriptIntrinsic3DLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setLUT(android.support.v8.renderscript.Allocation);
+  }
+
+  public final class ScriptIntrinsicBLAS extends android.support.v8.renderscript.ScriptIntrinsic {
+    method public void BNNM(android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, int);
+    method public void CGBMV(int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
+    method public void CGEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
+    method public void CGEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
+    method public void CGERC(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CGERU(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CHBMV(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
+    method public void CHEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
+    method public void CHEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
+    method public void CHER(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CHER2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CHER2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void CHERK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void CHPMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
+    method public void CHPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CHPR2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void CSYMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
+    method public void CSYR2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
+    method public void CSYRK(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
+    method public void CTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void CTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void CTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void CTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void CTRMM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void CTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void CTRSM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void CTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DGBMV(int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
+    method public void DGEMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void DGEMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
+    method public void DGER(double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void DSBMV(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
+    method public void DSPMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
+    method public void DSPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void DSPR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void DSYMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void DSYMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
+    method public void DSYR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void DSYR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void DSYR2K(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void DSYRK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void DTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DTRMM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void DTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void DTRSM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void DTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void SGBMV(int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
+    method public void SGEMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void SGEMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
+    method public void SGER(float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void SSBMV(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
+    method public void SSPMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
+    method public void SSPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void SSPR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void SSYMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void SSYMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
+    method public void SSYR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void SSYR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void SSYR2K(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void SSYRK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
+    method public void STBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void STBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void STPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void STPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void STRMM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void STRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void STRSM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void STRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZGBMV(int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
+    method public void ZGEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
+    method public void ZGEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
+    method public void ZGERC(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZGERU(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZHBMV(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
+    method public void ZHEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
+    method public void ZHEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
+    method public void ZHER(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZHER2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZHER2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void ZHERK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
+    method public void ZHPMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
+    method public void ZHPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZHPR2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
+    method public void ZSYMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
+    method public void ZSYR2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
+    method public void ZSYRK(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
+    method public void ZTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZTRMM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void ZTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public void ZTRSM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void ZTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
+    method public static android.support.v8.renderscript.ScriptIntrinsicBLAS create(android.support.v8.renderscript.RenderScript);
+    field public static final int CONJ_TRANSPOSE = 113; // 0x71
+    field public static final int LEFT = 141; // 0x8d
+    field public static final int LOWER = 122; // 0x7a
+    field public static final int NON_UNIT = 131; // 0x83
+    field public static final int NO_TRANSPOSE = 111; // 0x6f
+    field public static final int RIGHT = 142; // 0x8e
+    field public static final int TRANSPOSE = 112; // 0x70
+    field public static final int UNIT = 132; // 0x84
+    field public static final int UPPER = 121; // 0x79
+  }
+
+  public class ScriptIntrinsicBlend extends android.support.v8.renderscript.ScriptIntrinsic {
+    method public static android.support.v8.renderscript.ScriptIntrinsicBlend create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEachAdd(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachClear(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachDst(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachDstAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachDstIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachDstOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachDstOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachMultiply(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSrc(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSrcAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSrcIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSrcOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSrcOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachSubtract(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEachXor(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDAdd();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDClear();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDDst();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstAtop();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstIn();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOut();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOver();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDMultiply();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrc();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcAtop();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcIn();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOut();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOver();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDSubtract();
+    method public android.support.v8.renderscript.Script.KernelID getKernelIDXor();
+  }
+
+  public class ScriptIntrinsicBlur extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsicBlur(long, android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.ScriptIntrinsicBlur create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setInput(android.support.v8.renderscript.Allocation);
+    method public void setRadius(float);
+  }
+
+  public class ScriptIntrinsicColorMatrix extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsicColorMatrix(long, android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.ScriptIntrinsicColorMatrix create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setAdd(android.support.v8.renderscript.Float4);
+    method public void setAdd(float, float, float, float);
+    method public void setColorMatrix(android.support.v8.renderscript.Matrix4f);
+    method public void setColorMatrix(android.support.v8.renderscript.Matrix3f);
+    method public void setGreyscale();
+    method public void setRGBtoYUV();
+    method public void setYUVtoRGB();
+  }
+
+  public class ScriptIntrinsicConvolve3x3 extends android.support.v8.renderscript.ScriptIntrinsic {
+    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve3x3 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setCoefficients(float[]);
+    method public void setInput(android.support.v8.renderscript.Allocation);
+  }
+
+  public class ScriptIntrinsicConvolve5x5 extends android.support.v8.renderscript.ScriptIntrinsic {
+    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve5x5 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setCoefficients(float[]);
+    method public void setInput(android.support.v8.renderscript.Allocation);
+  }
+
+  public class ScriptIntrinsicHistogram extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsicHistogram(long, android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.ScriptIntrinsicHistogram create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public void forEach_Dot(android.support.v8.renderscript.Allocation);
+    method public void forEach_Dot(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID_Separate();
+    method public void setDotCoefficients(float, float, float, float);
+    method public void setOutput(android.support.v8.renderscript.Allocation);
+  }
+
+  public class ScriptIntrinsicLUT extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsicLUT(long, android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.ScriptIntrinsicLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setAlpha(int, int);
+    method public void setBlue(int, int);
+    method public void setGreen(int, int);
+    method public void setRed(int, int);
+  }
+
+  public class ScriptIntrinsicResize extends android.support.v8.renderscript.ScriptIntrinsic {
+    ctor protected ScriptIntrinsicResize(long, android.support.v8.renderscript.RenderScript);
+    method public static android.support.v8.renderscript.ScriptIntrinsicResize create(android.support.v8.renderscript.RenderScript);
+    method public void forEach_bicubic(android.support.v8.renderscript.Allocation);
+    method public void forEach_bicubic(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID_bicubic();
+    method public void setInput(android.support.v8.renderscript.Allocation);
+  }
+
+  public class ScriptIntrinsicYuvToRGB extends android.support.v8.renderscript.ScriptIntrinsic {
+    method public static android.support.v8.renderscript.ScriptIntrinsicYuvToRGB create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public void forEach(android.support.v8.renderscript.Allocation);
+    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
+    method public android.support.v8.renderscript.Script.KernelID getKernelID();
+    method public void setInput(android.support.v8.renderscript.Allocation);
+  }
+
+  public class Short2 {
+    ctor public Short2();
+    ctor public Short2(short, short);
+    field public short x;
+    field public short y;
+  }
+
+  public class Short3 {
+    ctor public Short3();
+    ctor public Short3(short, short, short);
+    field public short x;
+    field public short y;
+    field public short z;
+  }
+
+  public class Short4 {
+    ctor public Short4();
+    ctor public Short4(short, short, short, short);
+    field public short w;
+    field public short x;
+    field public short y;
+    field public short z;
+  }
+
+  public class Type extends android.support.v8.renderscript.BaseObj {
+    method public static android.support.v8.renderscript.Type createX(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
+    method public static android.support.v8.renderscript.Type createXY(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
+    method public static android.support.v8.renderscript.Type createXYZ(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int, int);
+    method public int getCount();
+    method public long getDummyType(android.support.v8.renderscript.RenderScript, long);
+    method public android.support.v8.renderscript.Element getElement();
+    method public int getX();
+    method public int getY();
+    method public int getYuv();
+    method public int getZ();
+    method public boolean hasFaces();
+    method public boolean hasMipmaps();
+  }
+
+  public static class Type.Builder {
+    ctor public Type.Builder(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
+    method public android.support.v8.renderscript.Type create();
+    method public android.support.v8.renderscript.Type.Builder setFaces(boolean);
+    method public android.support.v8.renderscript.Type.Builder setMipmaps(boolean);
+    method public android.support.v8.renderscript.Type.Builder setX(int);
+    method public android.support.v8.renderscript.Type.Builder setY(int);
+    method public android.support.v8.renderscript.Type.Builder setYuvFormat(int);
+    method public android.support.v8.renderscript.Type.Builder setZ(int);
+  }
+
+  public static final class Type.CubemapFace extends java.lang.Enum {
+    method public static android.support.v8.renderscript.Type.CubemapFace valueOf(java.lang.String);
+    method public static final android.support.v8.renderscript.Type.CubemapFace[] values();
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_X;
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Y;
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Z;
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_X;
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Y;
+    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Z;
+  }
+
+}
+